无法从 .BAK 文件恢复数据库

Hot*_*les 2 sql-server sql-server-2016

我正在尝试恢复我的 .bak 文件,但我不断收到错误消息

数据库“DataWarehouse”恢复失败。(Microsoft.SqlServer.Management.RelationalEngineTasks)
System.Data.SqlClient.SqlError:还原数据库异常终止(Microsoft.SqlServer.SmoExtended)

我尝试恢复的 .bak 文件是否已损坏?

我采取的步骤是

1) 右键单击​​服务器名称并选择恢复
2) 导航到 .bak 文件的位置
3) 单击“确定”

Joh*_* N. 6

在您尝试将数据库还原到的 SQL Server 实例上的 SQL Server Management Studio (SSMS) 中执行以下命令。

验证BAK文件

RESTORE VERIFYONLY FROM DISK = 'T:\DIRECTORY\DATAWAREHOUSE_FULL_20200115_190000.bak'
Run Code Online (Sandbox Code Playgroud)

这应该为您提供一个如下所示的结果集:

The backup set on file 1 is valid.
Run Code Online (Sandbox Code Playgroud)

可能的错误

如果检查异常终止,则原因可能是以下检查之一失败:

RESTORE VERIFYONLY 执行的检查包括:

  • 备份集完整且所有卷均可读取。
  • 数据库页面的一些头字段,例如页面ID(就好像要写入数据一样)。
  • 校验和(如果介质上存在)。
  • 检查目标设备上是否有足够的空间。

参考:RESTORE 语句 - VERIFYONLY (Transact-SQL)(Microsoft | SQL 文档)

检查 BAK 文件头

RESTORE HEADERONLY FROM DISK = 'T:\DIRECTORY\DATAWAREHOUSE_FULL_20200115_190000.bak'
Run Code Online (Sandbox Code Playgroud)

这应该为您提供一个如下所示的结果集:

BackupName  BackupDescription     BackupType ExpirationDate Compressed Position DeviceType UserName                         ServerName    DatabaseName         DatabaseVersion DatabaseCreationDate    BackupSize  FirstLSN              LastLSN               CheckpointLSN         DatabaseBackupLSN     BackupStartDate         BackupFinishDate        ........
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  ........
NULL        NULL                  1          NULL           0          1        2          NT SERVICE\SQLSERVERAGENT        NOTHING       StackExchange        782             2019-07-24 09:17:00.000 1688399872  568000013810400037    568000013813600001    568000013810400037    568000013524000037    2020-01-15 19:25:27.000 2020-01-15 19:25:29.000 ........
Run Code Online (Sandbox Code Playgroud)

检查BAK文件的内容

RESTORE FILELISTONLY FROM DISK = 'T:\DIRECTORY\DATAWAREHOUSE_FULL_20200115_190000.bak'
Run Code Online (Sandbox Code Playgroud)

这应该为您提供一个如下所示的结果集:

LogicalName              PhysicalName                                   Type FileGroupName    Size         MaxSize         FileId  CreateLSN           DropLSN  UniqueId                             ReadOnlyLSN         ReadWriteLSN       BackupSizeInBytes  SourceBlockSize FileGroupId LogGroupGUID  DifferentialBaseLSN  DifferentialBaseGUID                 IsReadOnly IsPresent TDEThumbprint 
------------------------ ---------------------------------------------- ---- ---------------- ------------ --------------- ------- ------------------- -------- ------------------------------------ ------------------- ------------------ ------------------ --------------- ----------- ------------- -------------------- ------------------------------------ ---------- --------- --------------
StackExchange            C:\SQL\SQL_DATA\StackExchange.mdf              D    PRIMARY          2623537152   35184372080640  1       0                   0        725120E9-8DF3-4E09-9A89-94433A6EB49B 0                   0                  1687224320         4096            1           NULL          568000013524000037   707694EC-A36C-444A-8879-C807B2137455 0          1         NULL
StackExchange_DefRO      C:\SQL\SQL_DATA\StackExchangeRO.ndf            D    DEFAULTRO        5242880      35184372080640  3       89000000045300001   0        05C6BA44-123A-4749-8FB5-A0A16EF49A51 102000000014600005  90000000013100004  131072             4096            2           NULL          568000013524000037   707694EC-A36C-444A-8879-C807B2137455 1          1         NULL
StackExchange_PUBL_SNAP  C:\SQL\SQL_DATA\StackExchange_PUBL_SNAP.ndf    D    PUBL_SNAP_DBASE  5242880      35184372080640  4       286000001633700001  0        DCA761C4-6260-4BE3-8280-64099C98911D 0                   0                  131072             4096            3           NULL          568000013524000037   707694EC-A36C-444A-8879-C807B2137455 0          1         NULL
StackExchange_log        C:\SQL\SQL_LOGS\StackExchange_log.ldf          L    NULL             21798322176  2199023255552   2       0                   0        364124B1-081E-45C5-971C-2CD1CBBF13EC 0                   0                  0                  4096            0           NULL          0                    00000000-0000-0000-0000-000000000000 0          1         NULL
Run Code Online (Sandbox Code Playgroud)

如果步骤失败

如果上述任何步骤失败,那么您必须确定问题所在。该RESTORE ... 命令应提供足够的信息来帮助您找到根本原因。

示例解决方案

如果备份文件已损坏,那么您将必须找到有效的备份文件。
如果磁盘已满,则必须添加额外空间。
如果所有其他方法都失败,那么您可能必须向 Microsoft 支持提出案例。

最佳实践

强调我的)

测试你的备份!

在测试备份之前,您没有恢复策略。通过将数据库的副本恢复到测试系统上来彻底测试每个数据库的备份策略非常重要。您必须测试恢复您打算使用的每种类型的备份。还建议恢复备份后,通过数据库的 DBCC CHECKDB 执行数据库一致性检查,以验证备份介质没有损坏。

参考:SQL Server 数据库的备份和还原(Microsoft | SQL 文档)