【问题标题】:SQL Server - Using RESTORE to copy database, resulting copy has no dataSQL Server - 使用 RESTORE 复制数据库,生成的副本没有数据
【发布时间】:2023-04-05 16:06:01
【问题描述】:

每当我尝试使用 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).

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

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

【问题讨论】:

  • 我不想问明显的问题,但是请您确认源数据库中有数据吗?
  • 在这一点上,我完全赞成白痴检查。源数据库有 1 表 1 行,仅用于测试。
  • 我刚刚测试了你上面的代码。创建了一个名为SomeDB 的数据库,其中包含一张表和一行。运行代码以备份和恢复。当我打开SomeDB_Copy 时,它有一张桌子,一排,正如预期的那样。您是否可以将SomeDB.bak 上传到某个文件共享站点?您使用的是什么版本的 SQL Server?什么版本的 SSMS(或者你是如何运行查询的)?如果您使用 UI 进行备份恢复而不是通过代码执行,它的工作方式是否相同?
  • 我刚刚在一个新数据库上重复了测试......它工作正常。我查看了我一直在使用的原始备份文件,它非常大,对于这个几乎是空的数据库来说大约是 125Mb。我意识到每次测试时我都在进行完整备份。我不知道这是否导致了问题。
  • 也许您在多文件备份集中恢复了错误的FILE?请注意,“文件”不是指磁盘文件。我的意思是恢复语句的FILE 选项。

标签: sql sql-server sql-server-2005


【解决方案1】:

我知道这个话题很老,但我想扩展 usr 在他的评论中关于多文件备份集的内容,尽管我会称它为多备份设备。您的备份命令处理了 161 页而恢复处理了 162 页这一事实使我认为您的设备/文件中有多个备份。您可以在备份命令上使用 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 文档:

磁盘设备在指定之前不必存在 备份语句。如果物理设备存在并且 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 的输出将显示文件中的一个备份,而第二个的输出应显示文件中有两个备份。

【讨论】:

  • 谢谢,我没有遇到与上述相同的问题,但是我已经将多个备份写入同一个文件而没有意识到,所以您的回答为我指明了正确的方向!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多