[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误

时间:2021-09-05 10:16:26

遇到一个case,sql server2000,在数据库崩溃后,发现bak文件也有错误,因此不能正常还原,请教了一个微软的大拿兄弟后,整理相关信息如下

 

如果备份媒体损坏,将发生还原错误。还原错误可能会由操作系统报告或由校验和检测到。无论何种情况,您都有三种选择:

  • 修复错误并重新启动还原操作。

  • 忽略错误,继续还原操作,并在还原完成后修复数据库。

  • 放弃还原操作,使用可避免损坏备份的备用还原计划。

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误注意:
媒体集或备份集必须包含最低限度的正确信息,才能被解释为 Microsoft 磁带格式。如果不是这样,RESTORE 将停止并指明备份的格式无效。

 

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误修复并重新启动还原操作

可以通过以下方式更正错误:

  • 如果磁带设备发生错误,可卸下或更换磁带机。

  • 对于磁盘设备,可以解决设备错误并替换损坏的文件。

  • 如果媒体集已镜像,可以使用另一个镜像的相应媒体替换损坏的媒体。

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误忽略错误继续执行操作

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误注意:
在 RESTORE 语句中指定 WITH CONTINUE_AFTER_ERROR 将尝试还原数据库。但是,有许多种损坏会阻止恢复数据库。极力建议您尽量避免使用 CONTINUE_AFTER_ERROR 选项,除非已经尝试了所有替代方法但仍无效。

 

CONTINUE_AFTER_ERROR 选项将使还原操作跳过错误继续进行,并还原所能还原的内容。将发生前滚,您可以应用后续事务日志备份。如果前滚遇到的错误阻止前滚到达目标时点,此错误将指示在日志中。在恢复点,数据库将在可能的情况下联机。但如果无法完成恢复,数据库将保持离线状态。

数据丢失量取决于遇到的错误。例如,页中的错误校验和仅能引起该页受到置疑,但会继续读取和处理媒体。相反,磁带设备报告的 I/O 错误可能会阻止还原忽略错误进行读取,并阻止还原磁带的其余部分。

当出现错误后指示继续还原时,未通过验证的页将被写入磁盘并记录到 表和错误日志中。

最佳方法:使用 WITH CONTINUE_AFTER_ERROR 还原数据后,请检查错误日志了解有关错误的详细信息。另外,请保存并分析直接从 RESTORE 语句获取的所有消息。

忽略错误继续

  • 基本的 语法为:

  • RESTORE DATABASE database_name FROM backup_device WITH CONTINUE_AFTER_ERROR, [ NORECOVERY ]

管理离线数据库

您可以在忽略错误继续执行的还原顺序结束时使用 DBCC CHECKDB 修复数据库。要使 CHECKDB 在使用 RESTORE CONTINUE_AFTER_ERROR 后以最大的一致性运行,建议您在 DBCC CHECKDB 命令中使用 WITH TABLOCK 选项。有关详细信息,请参阅 。所有修复选项都可用。若要了解所需的最低修复级别,请在不使用修复选项的情况下运行 DBCC CHECKDB。请注意,在极个别情况下,可能没有足够的信息来修复数据库。

若要获得按原样访问数据的有限权限,您可以使用 ALTER DATABASE 命令的 EMERGENCY 选项将数据库置于紧急模式。

 

检测和处理媒体错误

 

 

Microsoft SQL Server 2005 提供了改进的错误检测,并允许您恢复数据库,而不必顾及检测到的错误。一个重要的新错误检测机制是创建备份校验和(可选),可以通过备份操作创建并通过还原操作验证。您可以控制操作是否检查错误,以及遇到错误时是停止操作还是继续操作。如果备份包含备份校验和,则 RESTORE 和 RESTORE VERIFYONLY 语句可以检查错误。

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误注意:
SQL Server 2005 还引入了镜像备份媒体。镜像备份最多提供 4 个媒体集的副本(镜像),提供备用副本以便从损坏媒体导致的错误中恢复。有关详细信息,请参阅

 

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误BACKUP 过程中的校验和

SQL Server 支持三类校验和:页校验和、日志块校验和以及备份校验和。生成备份校验和时,BACKUP 将验证从数据库读取的数据是否与数据库中存在的任意校验和或页残缺指示一致。

BACKUP 语句选择性地计算备份流的备份校验和;如果给定页上存在页校验和或残缺页信息,则当备份该页时,BACKUP 还将验证它的校验和、残缺页状态以及 ID。创建备份校验和时,备份操作不会向页中添加任何校验和。将在这些页位于数据库中时对其进行备份,备份不会修改这些页。由于验证和生成备份校验和引起的开销,使用备份校验和会对性能造成潜在的影响。工作负荷和备份吞吐量都可能受到影响。因此,不是必须使用备份校验和。如果决定在备份过程中生成校验和,请仔细监视由此引起的 CPU 开销以及对系统中任何并发工作负荷造成的影响。

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误注意:
BACKUP 永远不会修改磁盘上的资源页和页的内容。

 

下列 BACKUP 选项可控制备份校验和的行为:

  • CHECKSUM

    如果此选项已启用并且可用,将请求备份操作验证每页的校验和及页残缺,并生成整个备份的校验和。

    如果在备份操作过程中请求验证校验和:

    • 向备份媒体写入页之前,BACKUP 将验证页级信息(页校验和或页残缺检测)是否存在。如果页校验和及页残缺都不存在,则备份无法验证该页;将按原样包含该页,其内容将添加到总备份校验和中。

      [sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误注意:
      有关页校验和及页残缺检测的详细信息,请参阅 ALTER DATABASE 语句的 PAGE_VERIFY 选项。有关详细信息,请参阅

       

    • 为了在还原时可以选择性地使用,备份将生成一个单独的备份校验和(“备份校验和”),并将其记录在备份媒体上,而不论该媒体上是否存在页校验和。

    • 备份集标记为包含备份校验和(在 msdb..backupsethas_backup_checksums 列中)。有关详细信息,请参阅

    [sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误注意:
    对于日志备份,将生成并验证备份校验和。

     

  • NO_CHECKSUM

    显式禁止验证页和生成备份校验和。(这是默认的行为。)

控制对错误的响应

指定 CHECKSUMS 后,如果 BACKUP 在验证过程中遇到页错误,备份将失败。下列 BACKUP 选项可控制此行为:

  • CONTINUE_AFTER_ERROR

    指示 BACKUP 在遇到无效备份校验和时继续。在这种情况下,BACKUP 会:

    将备份媒体中的备份集标记为包含错误,并跟踪 msdb 数据库的 suspect_pages 表中的页。有关详细信息,请参阅

    • 记录 SQL Server 错误日志中的错误。

    • 将备份集标记为包含此类型的错误(在 msdb.backupsetis_damaged 列中)。有关详细信息,请参阅

    • 发出一条消息,说明已成功生成备份,但备份中包含页错误。

  • STOP_ON_ERROR

    如果未验证校验和,则指示 BACKUP 失败。(这是默认的行为。)

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误RESTORE 和 RESTORE VERIFYONLY 过程中的校验和

如果备份媒体中存在备份校验和,则默认情况下,RESTORE 和 RESTORE VERIFYONLY 操作都将验证备份校验和及页校验和。如果不存在备份校验和,则这两种还原操作直接执行,而不会进行验证;这是因为没有备份校验和,还原无法可靠地验证页校验和。

使用 CHECKSUM 和 NO_CHECKSUM 这两个选项可以修改 RESTORE 和 RESTORE VERIFYONLY 处理校验和验证的方式,如下所示:

  • CHECKSUM

    在明确请求 CHECKSUM 进行还原操作并且备份包含备份校验和时,与默认情况相同,将同时验证备份校验和及页校验和。但是,如果备份集不包含备份校验和,还原操作将失败,并显示一条消息指明校验和不存在。

  • NO_CHECKSUM

    显式禁止还原操作对任何校验和进行默认验证。

控制对错误的响应

为了使用户可以指定还原操作在遇到错误时的行为,SQL Server 2005 引入了 RESTORE 和 RESTORE VERIFYONLY 两个选项:

  • CONTINUE_AFTER_ERROR

    指定遇到错误后继续执行还原操作。这是 RESTORE VERIFYONLY 的默认行为,使其报告验证错误并继续,同时尽可能多地提供备份集的相关信息。CONTINUE_AFTER_ERROR 将通知 RESTORE 尽可能继续。另外,这还会使 RESTORE 跳过无效的校验和。

  • STOP_ON_ERROR

    指定还原操作在遇到第一个错误时停止并失败。这是 RESTORE 的默认行为。

[sql server 2005 bookonline]应对由损坏的备份导致的 SQL Server 还原错误请参阅

概念



其他资源






-----------

Today I had the strangest thing happen. I turned on my laptop and found my SQL Server Express (2005) service came up with one of the databases saying "restoring...". Nothing I did could make it go away (restarting the computer, restarting sql server, nothing). Also, there was nothing I could do in the tasks like detach the db. It just kept erroring saying the database was in the process of restoring. Finally after some Google searching I came across this ExpertsExchange question (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_22875577.html).

The answer is to execute this sql:

RESTORE DATABASE [your database name] WITH RECOVERY

I'm going to have to look into what actually was going on but right now I've got stuff to do...

 
 
-------------------分割线-----------------
 backed up a data:
BACKUP DATABASE MyDatabase  TO DISK = 'MyDatabase.bak'  WITH INIT --overwrite existing  

And then tried to restore it:

RESTORE DATABASE MyDatabase     FROM DISK = 'MyDatabase.bak'     WITH REPLACE --force restore over specified database  

And now the database is stuck in the restoring state.

Some people have theorized that it's because there was no log file in the backup, and it needed to be rolled forward using:

RESTORE DATABASE MyDatabase  WITH RECOVERY  

Except that, of course, fails:

Msg 4333, Level 16, State 1, Line 1  The database cannot be recovered because the log was not restored.  Msg 3013, Level 16, State 1, Line 1  RESTORE DATABASE is terminating abnormally.  

And exactly what you want in a catastrophic situation is a restore that won't work.


 

The backup contains both a data and log file:

RESTORE FILELISTONLY   FROM DISK = 'MyDatabase.bak'    Logical Name    PhysicalName  =============   ===============  MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf  MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF 
A1:
Hi,
You need to use the WITH RECOVERY option, with your database RESTORE command, to bring your database online as part of the restore process.
This is of course only if you do not intend to restore any transaction log backups, i.e. you only wish to restore a database backup and then be able to access the database.
Your command should like this,
RESTORE DATABASE MyDatabase     FROM DISK = 'MyDatabase.bak'     WITH REPLACE,RECOVERY  
You may have more sucess using the restore database wizard in SQL Server Management Studio. This way you can select the specific file locations, the overwrite option, and the WITH Recovery option.
Cheers, John
        
        
        
I've never had to use the recovery statement when doing what he is doing. WITH REPLACE should suffice. –  Sam Feb 6 '09 at 20:23
Yes, I was using NORECOVERY but the restore process hangs. Using WITH RECOVERY, REPLACE it doesn't hang the process anymore –  Junior Mayhé Sep 16 '09 at 19:26
This solved my problem. We had a SAN failure in the middle of a restore and this was a quick and clean solution. –  Registered User Sep 21 '09 at 19:21
@InnerJoin: Excellent news! –  John Sansom Sep 21 '09 at 19:47
Thanks John, your answer helped me. –  AndrewJacksonZA May 31 at 8:44
A2:
 
---