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

26

我想将一个SQL Server 2012标准数据库复制到我的localdb实例。我尝试使用向导,但它抱怨localdb不是一个SQL Server 2005或更高版本的Express实例。我还尝试了备份/恢复操作,但在我的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

我收到的错误信息是...

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

消息1853,级别16,状态1,行1
无法找到逻辑数据库文件'CSOdev_Log'。请指定该文件的完整路径。
消息3167,级别16,状态1,行1
恢复无法启动数据库'CSODev'。
消息3013,级别16,状态1,行1
恢复数据库异常终止。

数据库最终进入“恢复挂起”模式。看起来它有日志文件的问题。我尝试过两种不同的备份,以防其中一个已损坏。


也许可以尝试将文件放置在个人文件夹以外的其他位置。如果将数据/日志文件移动到C:\ Data\等位置,会发生什么? - Aaron Bertrand
我尝试过这样做,但仍然收到相同的错误消息。 - Corey Blair
我成功地完成了这个任务 - 我在普通实例上创建了一个数据库,备份了它,并在本地db实例上成功地还原了它:http://i.stack.imgur.com/rOOhq.png。我不确定你的问题缺少什么信息,但显然你正在做一些不同的事情。我不知道该问什么才能找出答案。这种情况是针对任何数据库发生的,还是只针对特定的数据库? - Aaron Bertrand
дҪ зЎ®е®ҡдҪ зҡ„LOGж–Ү件зҡ„йҖ»иҫ‘еҗҚз§°жҳҜCSOdev_Logеҗ—пјҹдҪ еҸҜд»ҘиҝҗиЎҢrestore filelistonly from disk = 'C:\MyBckDir\CSODev.bak'жқҘжҹҘзңӢеӨҮд»Ҫж–Ү件дёӯйҖ»иҫ‘ж•°жҚ®еә“ж–Ү件зҡ„еҲ—иЎЁеҗ—пјҹ - Krzysztof Kozielczyk
运行RESTORE FILELISTONLY FROM DISK='C:\MyBckDir\CSODev.bak'命令会显示以下内容:CSOdev_Data Q:\MSSQL\CSOdev_Data.MDF D PRIMARY CSOdev_Log R:\MSSQL\CSOdev_Log.LDF L NULL - Corey Blair
嗯,逻辑名称看起来没问题。SQL错误日志文件中有什么有趣的内容吗?它应该在%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances\<instance-name>中,其中<instance-name>很可能是v11.0 - Krzysztof Kozielczyk
9个回答

16

本地数据库存在已知限制(实际上是真正的错误)。如果你的数据库文件位于不同的文件夹中,任何带有MOVE参数的RESTORE都将失败。

您必须在原始文件夹中进行还原(不要使用MOVE参数)。如果需要模拟驱动器/路径,请使用cmd工具例如SUBST。


5
我遇到了同样的问题,经过一番在线研究,我找到了一个聪明的方法来解决它(虽然有些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")。
希望这样就能解决问题了。原始想法请参见此处编辑:添加Jason Brady的创建命令更正。

2
这对我有用。虽然,创建数据库的语法是错误的。就是多了两个字符,并且Stack Overflow告诉我除非至少有6个字符的编辑,否则我无法进行编辑。它需要是Create Database <dbname> On (Filename = '<Mdf file location'), (Filename = '<Ldf Filename'>) For Attach. - Jason

5

我曾经遇到同样的问题。最终解决方案如下:

  1. 尝试还原数据库(但收到了 OP 中的错误)
  2. 分离数据库
  3. 重新附加数据库

在最后一步中,SSDT 对数据文件进行了升级,这些文件显然是以较旧的格式存储的。完成后,数据库开始正常工作,没有任何问题!


3

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


我认为对我们中的一些人来说,编写数据库脚本是可行的方法。我想我的问题可能是SQL Server实例不同(如2005与2008)。 - vbullinger

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

这个解决方案对我也起作用了。只是需要注意的是,确保首先创建空数据库,然后执行上面的查询,根据你的本地数据库适当调整大小写以使其正常工作。不同版本的模式似乎是向后兼容的(2012 --> 2010)。 - Truesky

2

有同样的问题,感谢您的帮助。 我的本地数据库是MS SQL 2014。 打开“SQL Server 2014管理工具”

  1. 右键单击数据库,转到“任务”,单击“脱机”
  2. 分离数据库
  3. 附加数据库

这对我很有用。 在备份数据库后,您可以恢复数据库而无错误。 谢谢。


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',

更新:这并没有完全奏效!

虽然上述语句没有产生任何错误并成功完成,但数据库仍处于“等待恢复”状态,无法以任何方式访问。当我尝试使用“RESTORE WITH RECOVER”将数据库上线时,我得到了与上面问题中相同的错误。

所以在我的情况下,我最终将备份恢复到我正在运行MSSQL 2008 R2的DEV服务器上,然后选择:任务->生成脚本->选择要脚本化的对象和下一步->点击“高级”按钮->选择“脚本化的数据类型”:模式和数据。现在对本地数据库运行生成的脚本。


1

尝试这些脚本(以我个人测试过的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上运行;-)


-2
你可以手动做。这可以通过使用Dot Net并打开两种连接来实现,将数据从其中一种连接转发到另一种连接。但是这需要在本地创建相同类型的列。
你可以检查MS Access 2007的导入选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接