我正在使用以下命令将 SQL Server 2005 数据库还原到 SQL Server 2008 R2 实例:
RESTORE DATABASE SampleDB FROM DISK= 'C:\SampleProject\SampleDB.bak' WITH REPLACE,
MOVE 'sampledb' TO
'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\SampleDB.mdf',
MOVE 'sampledb_log'
TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\SampleDB_log.ldf',
CONTINUE_AFTER_ERROR, STATS = 10;
输出是:
10 percent processed.
20 percent processed.
30 percent processed.
40 percent processed.
50 percent processed.
60 percent processed.
70 percent processed.
80 percent processed.
90 percent processed.
100 percent processed.
Msg 3242, Level 16, State 2, Line 3
The file on device 'C:\SampleProject\SampleDB.bak' is not a valid Microsoft Tape Format backup set.
Msg 3013, Level 16, State 1, Line 3
RESTORE DATABASE is terminating abnormally.
为什么处理的百分比达到100%,然后异常终止?
即使数据损坏,如何恢复此数据库备份?错误后继续似乎没有任何区别。
恢复备份分三个阶段运行。
百分比计数器仅测量第 2 阶段。如果您正在恢复一个非常大的日志备份,则在完成百分比计数器处于 100% 的情况下,第三阶段实际上可能比第二阶段花费的时间要长得多。
每个完整的数据库备份始终包含一部分日志。如果您在该备份文件中存在逻辑不一致,SQL Server 直到它处于第 3 阶段才会发现。这就是你看到 100% 的原因。
处理 SQL Server 损坏的最佳资源是sqlskills.com。更有可能的是,您会发现您无法使用内置方法获取数据。如果问题确实出在日志部分,您也许可以使用外部供应商工具来读取备份,例如 red-gate SQL 数据比较。还有一些工具可以帮助从损坏的数据库中恢复数据,例如 apexsql recover,但我不确定其中是否有任何工具可以真正读取备份。
就像 Sebastian 所说,ApexSQL Recover可用于从损坏中恢复,但在这种情况下它似乎不是一个正确的解决方案。从损坏的数据库或 MDF 文件中恢复的选项仅读取联机数据库和分离的 MDF 文件。它不会读取损坏的数据库备份
ApexSQL Recover 中还有另一个选项可以读取损坏的备份,即从数据库备份中恢复表数据。但是请注意,它只恢复表数据并创建一个 INSERT 脚本,因此它不能用于将整个数据库移动到更新的 SQL Server 版本
还有其他 ApexSQL 工具可以提供帮助,因为它们可以读取数据库备份 - ApexSQL Diff和ApexSQL Data Diff。由于备份没有严重损坏,他们可能能够读取它。这两种工具都可以读取在线数据库和数据库备份,如果您有一个在线 SQL Server 2005 数据库并且您想要升级到 SQL Server 2008 R2,也可以使用它们
ApexSQL Diff 是一种 SQL Server 数据库比较和同步工具,可检测实时数据库和版本化数据库、备份、快照和脚本文件夹中的数据库对象之间的差异。将您的实时 SQL Server 2005 数据库或数据库备份与空白 SQL Server 2008 目标进行比较,创建了源中存在的 SQL 对象(即 SQL Server 2005 数据库)
恢复数据库结构后,使用 ApexSQL Data Diff 恢复数据
您可以在此处找到推荐的步骤:
将 SQL Server 数据库迁移到较新版本的 SQL Server
从备份创建数据库脚本而不还原它
免责声明:我作为支持工程师在 ApexSQL 工作