23

我希望将 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”、文件 1 上的文件“CSOdev_Data”处理了 8752 页。为数据库“CSODev”、文件 1 上的文件“CSOdev_Log”
处理了 5 页。

消息 1853,级别 16,状态 1,行 1
找不到逻辑数据库文件“CSOdev_Log”。指定文件的完整路径。
消息 3167,级别 16,状态 1,第 1 行
RESTORE 无法启动数据库“CSODev”。
消息 3013,级别 16,状态 1,第 1 行
RESTORE DATABASE 异常终止。

数据库最终处于“恢复挂起”模式。日志文件似乎有问题。我尝试了 2 种不同的备份,以防其中一种刚刚损坏。

4

9 回答 9

16

localDB存在已知的限制(实际上是一个真正的错误)。只要您的数据库文件位于不同的文件夹中,它就会使任何带有 MOVE 的 RESTORE 失败。

您必须在原始文件夹中恢复(无 MOVE)。如果您需要伪造驱动器:/路径,请使用 cmd 工具,例如 SUBST。

于 2014-04-27T01:45:54.983 回答
5

我有同样的问题。最终起作用的是:

  1. 尝试恢复数据库(在 OP 中出现错误)
  2. 分离数据库
  3. 重新附加数据库

最后一步发生的事情是 SSDT 执行了数据文件的升级,显然是旧格式。完成后,数据库开始工作,没有任何问题!

于 2013-09-13T17:36:47.560 回答
4

我遇到了同样的问题,在做了一些在线研究后,我发现了一种巧妙的方法来让它工作(虽然很老套)。基本上,你:

  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对 create 命令的更正。

于 2013-08-11T18:11:38.193 回答
3

尝试将您的数据库脚本化为模式和数据,然后在本地运行脚本。

于 2013-07-04T15:48:13.280 回答
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
于 2013-09-08T06:11:57.430 回答
2

同样的问题,谢谢帮助。我的本地数据库是 MS SQL 2014。打开“SQL Server 2014 Management Studio”

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

它对我有用。备份数据库后,您可以恢复数据库而不会出错。谢谢。

于 2016-04-27T16:32:10.630 回答
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 服务器,然后选择:任务 -> 生成脚本 -> 选择要编写脚本的对象并下一步 -> 单击“高级”按钮 -> 选择“脚本的数据类型”:架构和数据。现在针对本地数据库运行生成的脚本。

于 2013-01-25T11:07:21.283 回答
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 上运行;-)

于 2019-02-15T11:47:07.760 回答
-2
  1. 您可以手动完成。这可以通过使用 dot net 并打开两种连接并将数据从其中一种转发到另一种来完成。但这需要在本地创建相同类型的列。
  2. 您可以检查 MS Access 2007 的导入选项
于 2013-11-13T19:54:52.980 回答