如何检查 SQL Server 数据库的恢复状态进度

Posted

技术标签:

【中文标题】如何检查 SQL Server 数据库的恢复状态进度【英文标题】:How to check recovery status progress of a SQL Server database 【发布时间】:2021-02-24 18:09:30 【问题描述】:

我是一名新晋的 SQL 程序员,正在使用具有 250GB 数据的生产数据仓库。我(事后看来)写了一个非常繁琐的大规模查询,其中包含一个 for-each 循环,它必须在某个地方有一个无限循环,因为它运行的时间太长并且占用了越来越多的内存。此时,我决定取消查询,但它仍在执行(我现在知道它正在回滚)。

我试图用KILL SPID 终止回滚过程,但实际上并没有做任何事情。我做了KILL SPID WITH STATUSONLY,它返回了transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds

此时,我决定服务器一定是卡住了,所以我重新启动了服务器。当它返回时,在 SSMS 中,受影响的数据库现在显示 MyDatabase (In Recovery)。我知道它要么完成回滚,要么检查数据完整性?是否有任何命令可以查看它正在取得多少进展或剩余多少时间?

【问题讨论】:

【参考方案1】:

我自己找到的,其他有同样问题的人。

对象资源管理器 > YourServerName > 管理 > SQL Server 日志 > 最近的/当前

打开一个显示数据库恢复过程的日志查看器:

'数据库'MyDatabase' (10) 的恢复已完成 55%(大约还剩 1066 秒)'

今天我学到了关于 SQL 中的 for-each 循环以及在恐慌中杀死服务器进程的宝贵经验。

【讨论】:

但是您错过了最重要的一课 - 切勿运行未经测试和验证在生产数据库中正确的 sql。当作者是“新的 SQL 程序员”时,这一点更为重要。如果该代码更改了数据库的状态,请确保您有一个灾难恢复计划。 有什么好的方法来处理这个问题?我的本地桌面上有一个测试服务器。我应该将我需要的表克隆到我的测试服务器吗?它不会是最新的数据,但仍然会有很多。【参考方案2】:

您应该能够从 DMV sys.dm_exec_requests 获得一些信息,尽管它并不完全准确并且通常显示为 0%。如果 SSMS 设法得到它,那么它可能会显示相同:

SELECT command, percent_complete, start_time
FROM sys.dm_exec_requests
WHERE session_id = @otherSPID;

【讨论】:

以上是关于如何检查 SQL Server 数据库的恢复状态进度的主要内容,如果未能解决你的问题,请参考以下文章

winserver2012r2进不了桌面,启动显示恢复

SQL Server Express DB 处于“恢复中”-如何检测/知道何时恢复

sql server 2005 恢复数据库

日志链和 SQL Server 事务日志 - 健全性检查

当在 .net 上调用恢复存储过程但在 SQL Server 上运行时数据库卡在恢复状态

SQL Server 紧急状态下的数据库恢复