如何检查 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 数据库的恢复状态进度的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server Express DB 处于“恢复中”-如何检测/知道何时恢复