2016-04-27 124 views
0

使用Liquibase我想申请多个变更集,但第一个是恢复的数据库脚本如下:LIQUIBASE从MSSQL备份恢复失败

<changeSet id="0" author="me" context="test or dev"> 
    <sql > 
     RESTORE DATABASE CleanDB 
     FROM DISK = '\\SomePublic\DevDB.bak' 
     WITH REPLACE; 
    </sql> 
</changeSet> 
<!-- here many changes go --> 

CleanDB是新的空现有的数据库。我的连接URL指定DevDB作为目标,并期待:url=jdbc:sqlserver://SomePublic;databaseName=CleanDB

在执行过程中我已经得到了错误:

liquibase: RESTORE cannot process database 'CleanDB' because it is in use by this session. It is recommended that the master database be used when performing this operation.

所以我的问题:如何申请Liquibase脚本清除数据库应该从一些备份恢复?

+0

不能恢复到您所连接的数据库。您需要将JDBC URL更改为**而不是**包括数据库名称 –

+0

@a_horse_with_no_name太棒了,那么如何将其余更改应用于我的'CleanDB'? – Dewfy

+1

您可以尝试添加“USE master; GO;”作为第一行。只是一个猜测。 – SteveDonie

回答

0

由于@SteveDonie评论我发现,是立足于4个步骤的溶液:

  1. 切换到其它数据库(主例如)的CleanDB

  2. 推出使用;

  3. 应用备份到CleanDB

  4. 恢复使用,并从主切换回CleanDB

所以下面的代码工作对我来说:

<sql splitStatements="true"> 
    use master; <!-- switch to master --> 
    <!-- avoid error that CleanDB already in use --> 
    alter database ${databaseName} 
    set single_user with rollback immediate; 
    <!-- apply backup --> 
    RESTORE DATABASE CleanDB 
    FROM DISK = '\\SomePublic\DevDB.bak' 
    WITH REPLACE; 
    <!-- Restore access to database --> 
    alter database ${databaseName} 
    set multi_user; 
    <!-- switch back for further Liquibase operations --> 
    use ${databaseName}; 

</sql> 
+0

我有类似的问题。为了解决它,我需要做一个'alter database'。但是,我收到以下错误消息:迁移设置失败...失败的SQL:ALTER DATABASE $ {databaseName} ...'。所以我的问题是:属性'databaseName'从哪里来?我是否必须手动指定它('')还是liquibase中的“内置”属性? –

+0

@CptS您可以通过液晶命令行指定它'-DdatabaseName = YourDBName' – Dewfy