还原的数据库与原始数据库不同

Geo*_*wdy 4 sql-server sql-server-2008-r2

我最近将我们的数据仓库临时数据库还原到我们开发环境中的一个单独实例上。恢复后我做了一个比较,看起来数据库大小不同。Staging_Original 为 8246 MB,而 Staging_New 为 7571.63 MB。新数据库中的 2 个表似乎丢失了,并且由于某种原因,新数据库中有一个旧数据库中不存在的表。如果我执行了完整备份和还原,这怎么可能?如何获取一个数据库的精确副本并将其还原到第二个实例中?两个模型数据库似乎也相同。

备份脚本:

BACKUP DATABASE [BI_Staging] TO  DISK = N'G:\BI_Staging.bak' 
  WITH NOFORMAT, NOINIT,  NAME = N'BI_Staging-Full Database Backup', 
  SKIP, NOREWIND, NOUNLOAD,  STATS = 10, CHECKSUM
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset 
  where database_name=N'BI_Staging' 
  and backup_set_id=(select max(backup_set_id) 
    from msdb..backupset where database_name=N'BI_Staging' )
if @backupSetId is null 
begin 
  raiserror(N'Verify failed. Backup information for database ''BI_Staging'' not found.', 16, 1) 
end
RESTORE VERIFYONLY FROM  DISK = N'G:\BI_Staging.bak' 
  WITH FILE = @backupSetId,  NOUNLOAD,  NOREWIND
GO
Run Code Online (Sandbox Code Playgroud)

恢复脚本:

USE [master]
GO
ALTER DATABASE [BI_Staging] SET  RESTRICTED_USER WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE [BI_Staging] FROM  
DISK = N'G:\BI_Staging.bak'
WITH  FILE = 1
,  MOVE N'BI_Staging' TO N'E:\MSSQL10_50.BI_DSS2\MSSQL\DATA\BI_Staging.mdf'
,  MOVE N'BI_Staging_log' TO N'F:\MSSQL10_50.BI_DSS2\MSSQL\Tlogs\BI_Staging.ldf'
,  NOUNLOAD,  REPLACE, RECOVERY, STATS = 10
GO
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 11

您已NOINIT在备份中使用,然后FILE = 1在还原中使用。因此,您的.bak文件中似乎有多个备份,并且您没有为恢复提取正确的备份。事实上,您可以看到在您的RESTORE VERIFYONLY脚本中指定了 ,FILE = @backupSetId但在实际恢复中您只是硬编码FILE = 1.

这是我不喜欢将单个文件重用于多个备份的众多原因之一。它对你有什么好处?不是很多,除非您每天创建大量备份并且超过 NTFS 的文件计数容量。我更希望有一个.bak在名称中带有时间戳的单个文件或其他内容,然后容易通过视觉和编程方式识别最旧或最新的备份,恢复更简单,清除过期备份也更容易。

现在,尝试使用唯一文件名的更简单的命令,并且WITH INIT(我认为您不需要所有其他选项)...

BACKUP DATABASE [BI_Staging]  
  TO DISK = N'G:\BI_Staging_This_Time_For_Sure.bak' WITH INIT;
Run Code Online (Sandbox Code Playgroud)

...然后恢复文件。