如何将SQL Server 2012数据库复制到localdb实例?

时间:2012-10-29 17:32:09

标签: sql sql-server sql-server-2012 localdb

我正在寻找将SQL Server 2012 Standard数据库复制到我的localdb实例。我已经尝试了向导,它抱怨localdb不是 SQL Server 2005或更高版本的实例。我也进行了备份/恢复,但在我的localdb中恢复后,我收到以下错误...

运行此...

RESTORE DATABASE CSODev
FROM DISK = 'C:\MyBckDir\CSODev.bak'
WITH MOVE 'CSOdev_Data' TO 'C:\Users\cblair\CSOdev_Data.mdf',
MOVE 'CSOdev_Log' TO 'C:\Users\cblair\CSOdev_Log.ldf',
REPLACE

我收到错误消息......

  

为数据库'CSODev'处理了8752页,在文件1上处理了'CSOdev_Data'文件。
  为数据库'CSODev'处理了5页,在文件1上处理了'CSOdev_Log'文件。

     

Ms 1853,Level 16,State 1,Line 1
  无法找到逻辑数据库文件“CSOdev_Log”。指定文件的完整路径    Msg 3167,Level 16,State 1,Line 1
  RESTORE无法启动数据库'CSODev'    Msg 3013,Level 16,State 1,Line 1
  RESTORE DATABASE异常终止。

数据库最终处于“恢复待定”模式。它似乎与日志文件有问题。我已经尝试过两种不同的备份,以防一种情况被破坏。

9 个答案:

答案 0 :(得分:15)

localDB有known limitation(实际上是一个真正的错误)。每当数据库文件位于不同的文件夹中时,它将无法使用MOVE进行任何RESTORE。

您必须在原始文件夹中恢复(无移动)。如果您需要假冒驱动器,请使用cmd工具,例如SUBST:/ path。

答案 1 :(得分:5)

我遇到了同样的问题。最终起作用的是:

  1. 尝试恢复数据库(在OP中获取错误)
  2. 分离数据库
  3. 重新附加数据库
  4. 最后一步发生的事情是SSDT执行了数据文件的升级,显然是旧格式的。完成后,数据库开始工作没有任何问题!

答案 2 :(得分:4)

我遇到了同样的问题,在做了一些在线研究之后,我发现了一种巧妙的方式来让它发挥作用(尽管非常hacky)。基本上,你:

  1. 创建一个SqlLocalDb实例(SqlLocalDb c tmp -s)。
  2. 像上面那样恢复数据库(例如,SqlCmd -E -S <localdb connection string> -Q "RESTORE DATABASE ...")。
  3. 停止SqlLocalDb实例(SqlLocalDb p tmp)。
  4. 删除SqlLocalDb实例(SqlLocalDb d tmp)。
  5. 创建一个新的SqlLocalDb实例(SqlLocalDb c persistent -s)。
  6. 通过附加新实例(SqlCmd -E -S <persistent connection string> -Q "Create Database <dbname> On (Filename = '<Mdf file location'), (Filename = '<Ldf Filename'>) For Attach"
  7. 在新实例中创建数据库

    希望它应该有效。有关最初的想法,请参阅here

    修改:添加了Jason Brady对修改命令的更正。

答案 3 :(得分:3)

尝试将数据库编写为架构和数据脚本,然后在本地运行脚本。

答案 4 :(得分:2)

RESTORE FILELISTONLY
FROM DISK = 'D:\SQLBackups\yourdatabase.BAK'


ALTER DATABASE yourdatabasename
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE

RESTORE DATABASE yourdatabasename
FROM DISK = 'D:\SQLBackups\yourdatabase.BAK'
with replace,
move 'logical name from file stream' to
'C:\yourdatabase.mdf',
move 'logical name from file stream' to 'C:\Yourdatabase.ldf'
ALTER DATABASE Qatar_DB SET MULTI_USER

答案 5 :(得分:1)

我遇到了同样的问题。尝试以管理员身份运行visual studio并尝试以下命令

RESTORE DATABASE CSODev
FROM DISK = 'C:\MyBckDir\CSODev.bak'
WITH NORECOVERY, MOVE 'CSOdev_Data' TO 'C:\Users\cblair\CSOdev_Data.mdf',
MOVE 'CSOdev_Log' TO 'C:\Users\cblair\CSOdev_Log.ldf',

更新:这不起作用!

虽然上述语句不会产生任何错误并成功完成,但数据库仍处于“PENDING RECOVERY”状态,无法以任何方式访问。当我尝试'RESTORE WITH RECOVER'将数据库联机时,我得到了与上述问题相同的错误。

所以在我的情况下,我最终将备份恢复到我使用MSSQL 2008 R2运行的DEV服务器,然后选择:任务 - &gt;生成脚本 - &gt;选择了脚本和对象的对象下一步 - &gt;点击“高级”按钮 - &gt;选择“脚本数据类型”:Schema&amp;数据。 现在针对本地db运行生成的脚本。

答案 6 :(得分:1)

同样的问题,谢谢你的帮助。 我的本地数据库是MS SQL 2014。 打开&#34; SQL Server 2014 Management Studio&#34;

  1. 右键单击数据库,转到&#34;任务&#34;,单击&#34;脱机&#34;
  2. 分离数据库
  3. 附加数据库
  4. 它对我有用。 备份数据库后,可以无错误地还原数据库。 感谢。

答案 7 :(得分:0)

尝试以下脚本(以我亲自测试的Adventureworks2012为例):

RESTORE FILELISTONLY
FROM DISK = 'c:\temp\adv2012.bak'

这会将文件名显示为:

AdventureWorks2012      C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL2012RTM\MSSQL\DATA\AdventureWorks2012.mdf
AdventureWorks2012_log  C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQL2012RTM\MSSQL\DATA\AdventureWorks2012_log.ldf

使用这些文件名来构造您的最终脚本,如下所示:

RESTORE DATABASE AdventureWorks2012
FROM DISK = 'C:\temp\adv2012.bak'

WITH MOVE 'AdventureWorks2012' TO 'C:\cnom_WS\Local-Databases\AdventureWorks\AdventureWorks2012.mdf',
MOVE 'AdventureWorks2012_log' TO 'C:\cnom_WS\Local-Databases\AdventureWorks\AdventureWorks2012_log.ldf',
REPLACE;

顺便说一句,我通过Visual Studio(SQL Server对象资源管理器)运行它们,但是我强烈怀疑它可以很容易地在SSMS上运行;-)

答案 8 :(得分:-1)

  1. 您可以手动执行此操作。这可以通过使用点网并打开两种连接并将数据从其中一种转发到另一种来完成。但这需要在本地列中创建相同类型的列。
  2. 您可以查看MS Access 2007的导入​​选项