SQL Server - 使用 RESTORE 复制数据库,生成的副本没有数据

SQL Server - Using RESTORE to copy database, resulting copy has no data

提问人:kyork 提问时间:12/6/2012 最后编辑:Communitykyork 更新时间:1/2/2013 访问量:1756

问:

每当我尝试使用 BACKUP 和 RESTORE 命令创建数据库的副本时,都会创建该副本,但不包含任何数据。我正在运行以下命令,并恢复成功状态:

BACKUP DATABASE [SomeDB]
    TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak'
BACKUP DATABASE successfully processed 161 pages in 0.021 seconds (62.805 MB/sec).

RESTORE DATABASE [SomeDB_Copy]
    FROM DISK=N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak'
    WITH MOVE N'SomeDB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\SomeDB_copy.mdf',
    MOVE N'SomeDB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\SomeDB_copy.ldf'
RESTORE DATABASE successfully processed 162 pages in 0.095 seconds (13.958 MB/sec).

我错过了一步吗?我发现的所有示例都使用这种方法。即使在 StackOverflow 上。这是在 SQL Server 2005 上。

更新:。我将数据库备份到一个新文件,并使用该文件进行恢复,一切正常。我不知道我的原始文件是否已损坏,或者发生了其他奇怪的事情。

sql sql-server sql-server-2005

评论

1赞 swasheck 12/6/2012
我不想问显而易见的问题,但您能否确认源数据库中有数据?
0赞 kyork 12/6/2012
在这一点上,我完全支持白痴检查。源数据库有 1 个表和 1 行,仅用于测试。
1赞 mellamokb 12/6/2012
我刚刚在上面测试了你的代码。创建了一个名为 的数据库,其中包含一个表和一行。运行代码进行备份和还原。当我打开时,它有一个表,正如预期的那样,有一行。您是否可以上传到某个地方的文件共享站点?您使用的是哪个版本的 SQL Server?哪个版本的 SSMS(或你如何运行查询)?如果您使用 UI 进行备份还原而不是通过代码进行备份还原,它的工作原理是否相同?SomeDBSomeDB_CopySomeDB.bak
0赞 kyork 12/6/2012
我只是在一个新数据库上重复了测试......它起作用了。我查看了我一直在使用的原始备份文件,它非常大,对于这个几乎为空的数据库来说,大约有 125Mb。我意识到每次测试时我都在做一个完整的备份。我不知道这是否导致了问题。
0赞 usr 12/6/2012
也许您在多文件备份集中恢复了错误?请注意,“FILE”并不是指磁盘文件。我的意思是恢复语句的选项。FILEFILE

答:

1赞 CrimeWire 1/2/2013 #1

我意识到这个话题已经很老了,但我想扩展一下 usr 在他关于多文件备份集的评论中所说的话,尽管我会称它为多备份设备。您的备份命令处理了 161 页,但恢复处理了 162 页,这一事实使我认为您的设备/文件中有多个备份。您可以在 backup 命令上使用 INIT 子句来保证设备中只有一个备份:

BACKUP DATABASE [SomeDB]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak' 
with init;

http://msdn.microsoft.com/en-us/library/ms186865.aspx 的Microsoft文档中:

磁盘设备在指定之前不必存在 BACKUP 语句。如果物理设备存在,并且 INIT 选项是 未在 BACKUP 语句中指定,则备份将附加到 装置。

您应该能够使用 RESTORE 命令上的 HEADERONLY 选项来检查设备/文件中是否有多个备份。

BACKUP DATABASE [SomeDB]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak' 
with init;

RESTORE HEADERONLY 
FROM DISK = = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak'; 

BACKUP DATABASE [SomeDB]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak';

RESTORE HEADERONLY 
FROM DISK = = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\SomeDB.bak';

第一个 RESTORE HEADERONLY 的输出将显示文件中的一个备份,而第二个的输出应显示文件中有两个备份。

评论

0赞 Stephen Holt 7/2/2014
谢谢,我没有遇到与上述相同的问题,但是我在没有意识到的情况下将多个备份写入了同一个文件,因此您的回答为我指明了正确的方向!