目录表 |
SQL Server数据库进入恢复状态
当SQL Server启动崩溃恢复时,数据库将经历三个恢复阶段(Analysis、Redo和Undo)以恢复在线状态。在恢复阶段,数据库显示为以下任何一种状态:怀疑', '在恢复',或'恢复'在SQL Server管理工作室(SSMS)。一旦恢复完成,数据库就会重新联机。但有时,在尝试使用数据库时,出现以下消息:
922号电话,14层,1州1线
数据库xxx正在恢复中。等待恢复完成。
在重新启动SQL Server、从备份恢复数据库或附加数据库时,可能会遇到此消息。
下一步该怎么做?
在处理此问题之前,请查看SQL错误日志,以查找完成数据库恢复过程所需的估计时间,如下所示:
数据库' Database_Name '(1)的恢复完成了0%(大约还剩95秒)。第一期共3期。这只是一个信息消息。无需用户操作。 数据库' Database_Name '(1)的恢复完成了3%(大约还剩90秒)。第一期共3期。这只是一个信息消息。无需用户操作。 |
在这里,您可以看到数据库处于阶段1(即Analysis状态),以及恢复完成之前的数据百分比。
错误产生的原因及解决方法
以下是错误背后最常见的原因和解决方案:
原因1 -日志文件过大
数据库恢复缓慢的常见原因是事务日志(.ldf)文件太大,生成了太多的虚拟日志文件(vlf)。
解决方案-应用Microsoft累积更新
应用Microsoft发布的累积更新来修复数据库恢复速度变慢的问题——当SQL Server 2005、2008和2008 R2的日志文件中有太多的VLFs时。详细信息请参见MicrosoftKB2455009.
原因2 - AUTO_CLOSE属性打开
启用AUTO_CLOSE属性后,数据库将在关闭所有与数据库的连接后关闭。因此,当用户尝试连接到数据库时,它将进入恢复阶段。通常,恢复将很快,因为数据库已完全关闭。但是,它可能会减慢大量使用的数据库的恢复速度,因为反复打开和关闭数据库会增加开销。
解决方案-关闭AUTO_CLOSE属性
要做到这一点,请遵循以下步骤:
- 在SSMS中,展开“数据库”。
- 右键单击有问题的数据库并选择Properties。
- 单击Database Properties屏幕中的Options选项卡,并将Auto Close值设置为FALSE。
- 单击OK。
现在检查数据库打开是否没有任何问题。
可选择的解决方案
使用一个SQL恢复工具,例如用于MS SQL的Stellar Repair,以将卡在恢复中的数据库恢复到原始状态。该软件帮助修复数据库(MDF)文件并恢复其所有数据。它提供了标准的扫描模式,可以快速扫描和修复数据库文件;提供了高级的扫描模式,可以扫描和修复大型数据库。
该软件还在保存修复文件之前提供了所有可恢复组件的预览。这有助于您验证恢复数据的准确性。
看看这个视频,了解软件是如何工作的:
常见问题
当尝试从备份恢复数据库时,出现一条消息说数据库正在恢复。但是,现在已经几天了,数据库似乎还停留在恢复状态。如何使数据库脱离恢复状态?
A.阅读博客SQL数据库处于恢复状态找到解决问题的方法。
问:是否有办法知道SQL数据库恢复操作何时完成?
您可以执行这个查询来查找处于恢复模式的数据库的最近的日志条目:
声明@ Database_Name VARCHAR(64) = '添加您的数据库名称在这里' 声明@ErrorLog为表([LogDate] CHAR(24), [ProcessInfo] VARCHAR(64), [TEXT] VARCHAR(MAX)) 插入到@ErrorLog 执行主. .sp_readerrorlog 0, 1, '数据库正在恢复',@Database_Name 插入到@ErrorLog 执行主. .sp_readerrorlog 0, 1, '恢复完成',@Database_Name 选择top 1 @DBName AS[数据库名称] , (LogDate) 、案例 当SUBSTRING([TEXT],10,1) = 'c'时 然后“100%” ELSE SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) 结束为PercentComplete 、案例 当SUBSTRING([TEXT],10,1) = 'c'时 0 ELSE CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remaining ', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 END AS MinutesRemaining 、案例 当SUBSTRING([TEXT],10,1) = 'c'时 0 ELSE CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remaining ', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 以剩余小时数结束 [文本]) FROM @ErrorLog ORDER BY CAST([LogDate] as datetime) DESC, [MinutesRemaining] |