译者 | 李睿
审校 | 重楼
SQL Server数据库偶尔会陷入“恢复中”(In Recovery)模式,这通常会让数据库管理员感到措手不及。这种状态通常发生在数据库重启、恢复或意外关闭期间,因为SQL Server需要重放或撤销不完整的事务以保持数据完整性。虽然这个过程通常是自动执行的,但有时可能会比预期花费更长时间,甚至看起来停滞不前,这导致数据库管理员不知所措。
如果遇到了这个问题,不要担心。本文将帮助他们了解幕后发生的事情,并提供应对策略。以下是需要了解的内容:
- “恢复中”模式意味着什么——为什么数据库会进入这种状态,以及SQL Server在后台执行的操作。
- SQL Server数据库恢复的三个阶段——详细分析SQL Server在恢复过程中遵循的分析、重做和撤销阶段。
- 导致延迟的常见原因——从大型事务日志到过多的虚拟日志文件(VLF),查看可能减缓进程的原因。
- 如何恢复在线状态——学习将数据库恢复到一致状态的实用步骤,从等待到使用SQL修复工具。
- 何时寻求高级帮助——如果恢复过程看似停滞不前且没有取得任何进展,可以了解应该怎么做。
通过阅读这一指南,将全面了解SQL Server的恢复过程以及可用于尽快将数据库恢复在线的工具。
理解SQL Server中的“正在恢复”模式
当SQL Server重启或从备份中恢复数据库时将会进入“恢复中”模式,以保持数据的完整性。在这个阶段,SQL Server重放或撤销不完整的事务,以防止数据损坏并确保事务一致性。
在重启SQL Server之后,数据库进入“恢复中”模式。SQL Server数据库在启动时或从备份中恢复时也可能处在“恢复中”状态。
图1 SQL数据库陷入“恢复中”模式
数据库处在“正在恢复”状态意味着正在执行恢复过程,并在这一过程完成后自动联机。但是,可能会遇到恢复缓慢且数据库陷入“恢复中”状态。数据库可能仍然处于恢复状态,因为SQL数据库要经历三个恢复阶段,而这一过程的恢复时间取决于数据库文件的大小。
SQL数据库恢复的三个阶段
通常情况下,当SQL Server重启时数据库没有正确关闭时,它会进行崩溃恢复,以确保数据库保持一致。SQL数据库需要经历三个恢复阶段:
第一阶段:分析
这个阶段从“最后一个检查点开始,直到事务日志结束”。它创建一个“脏页表”(DPT)表,帮助确定崩溃时的所有“脏页”。此外,它还创建一个“活动事务表”(ATT)来标识SQL Server停止时未提交的事务。
第二阶段:重做
在这个阶段,SQL Server会前滚在检查点之后和崩溃之前发生的所有更改。实际上,在重做(Redo)阶段,所有已经提交但尚未通过检查点写入SQL数据文件(.mdf/.ldf)的事务都需要前滚。
第三阶段:撤销
如果在数据库恢复时存在任何未提交的事务,则必须在撤消阶段回滚这些事务,以使数据库恢复到一致状态。
如果数据库陷入“恢复中”模式应该怎么办?
检查SQL Server错误日志,查看数据库中可能类似以下内容的第一条消息:
这意味着已经打开数据库文件,并且恢复过程已经开始。在一段时间后,将会看到SQL Server正在经历三个恢复阶段。如果正在寻找有关如何备份和恢复数据库的指导,可以查看有关备份和恢复Azure SQL数据库的指南。
数据库恢复的第一阶段如下所示:
在第一阶段完成炎后,SQL Server数据库将会继续执行恢复流程的第二和第三阶段。
一旦第二阶段和第三阶段完成,将会看到类似以下的信息:
在错误日志中,注意“不需要用户操作”的消息,这表明数据库处于恢复状态。但是,恢复可能需要比预期更长的时间,导致数据库一直陷入“恢复中”模式中。
SQL数据库陷入“恢复中”模式的原因
以下是可能导致SQL数据库陷入“恢复中”模式的一些原因:
- 长时间运行的事务正在回滚
- 事务日志文件非常大
- 数据库事务日志中包含过多的虚拟日志文件(VLF)
- SQL Server存在bug,现在已经修复。
如何使数据库恢复到一致状态?
解决方法1:等待数据库恢复完成
使数据库重新联机的最直观的解决方案是耐心等待恢复过程完成;这可能需要几个小时或几天的时间。如果SQL Server 2008或SQL Server 2008 R2中的数据库恢复时间比预期的长,那么应用Microsoft修复程序可能会有所帮助。
注:避免运行RESTORE命令使数据库处于一致状态,因为SQL Server已经在尝试执行相同的任务。然后,运行“RESTORE with..Recovery”意味着让数据库再次执行相同的步骤。
解决方案2:使用专业的SQL数据库修复工具
如果恢复过程完成,但未能将数据库恢复到一致状态,则使用专门的SQL修复工具可以帮助将数据库恢复到原始状态。
- Stellar Repair for MS SQL——这款专业的工具可以帮助在SQL数据库损坏或发生故障后将其恢复到原始状态。
- ApexSQL Recover——这款工具可以恢复已经删除、截断或损坏的SQL Server数据库中的数据。
- dbForge SQL Complete——虽然它主要是一款IDE扩展工具,但它提供了有用的错误处理和故障排除功能。
- Redgate SQL Data Recovery——Redgate提供了一系列SQL Server工具,包括数据恢复功能。
- SysTools SQL Recovery Tool——这款工具可恢复损坏的SQL数据库文件(.MDF和.NDF)到可用状态。
- Kernel for SQL Database Recovery——这款工具可以从损坏和意外关闭的情况中恢复和还原SQL Server数据库。
- Aryson SQL Database Recovery——这款工具可以修复和还原SQL Server中的MDF和NDF文件。
结论
本文介绍了SQL数据库陷入“恢复中”模式时的含义、恢复的三个关键阶段((分析、重做和撤消),以及如何使数据库重新联机。此外还讨论了可能的原因,从大型事务日志到过多的虚拟日志文件(VLF)。
如果SQL数据库仍然陷入“在恢复中”模式,至关重要的是要保持耐心。避免运行RESTORE命令,因为这会重新启动恢复过程。至于那些无法通过人工干预解决的严重问题,可以考虑使用专业的SQL数据库修复工具来恢复数据。
原文标题:How to Fix SQL Database Stuck in Recovery Mode,作者:Daniel Calbimonte