设置数据库离线并立即回滚需要一个小时才能完成

GUI*_*UIs 6 sql-server backup sql-server-2012

每天晚上,我们将生产数据库脱机、分离,然后重新附加它以在备份程序开始之前切断所有活动连接。第一个命令是:

USE master
ALTER DATABASE thedb SET OFFLINE WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

此命令过去需要 20 秒到两分钟才能完成,这是可以接受的。从过去几周开始,它需要 15 分钟到一个多小时才能完成。数据库使用情况没有任何变化会导致此问题,并且仅发生大约 3/4 的时间。

据我所知,我们没有更改任何会导致这种情况的设置。我的理解是 WITH ROLLBACK IMMEDIATE 切断了所有连接,数据库立即脱机。我曾尝试调查以下内容:

  • 恢复间隔设置为 0,因此检查点每隔几分钟发生一次,只需一秒钟即可完成
  • 统计信息不会异步更新
  • 在数据库脱机之前没有运行大型查询
  • 在数据库脱机时检查 sp_who2 显示没有用户连接到它
  • 数据库的日志文件非常小,约 30 MB

我们目前在没有镜像的简单恢复模式下运行 MSSQL Server 2012(标准版)。数据库大小约为 300 GB。

任何帮助表示赞赏,谢谢!

Sha*_*nky 5

我相信你所看到的是完全正常的。

每天晚上,我们将生产数据库脱机,分离它,然后重新创建它以切断所有连接作为我们备份过程的开始

你为什么这么做 ?。这并不总是正确的做法,这正是您面临问题的原因。您可以在数据库联机时对其进行备份,这就是您应该如何备份 SQL Server 数据库。数据库在线时您将进行的完整备份将包括备份完成时对数据库所做的所有已提交更改。在活动之前保持单用户和受限用户模式可能无法完全解决您的问题。

此命令过去需要 20 秒到 2 分钟才能完成,这是可以接受的。在过去的几周里,它需要 15 分钟到一个多小时才能完成。

您还说没有长时间运行的查询,为此我会说三重检查。更改数据库需要对数据库进行独占访问,它可能被其他一些查询阻止,您是否检查过。

您是否检查过任何正在运行的事务,begin transaction并且可能错过了提交。运行DBCC OPENTRAN()以查看任何打开的事务。错误日志会有更多关于这个的信息

我看到的另一件事是,有时当您运行 alter 命令时,几乎没有任何需要回滚的查询正在运行,因此该命令会很快完成,而其他时候,有一些命令正在运行,需要在数据库脱机之前完全回滚。根据需要完成的回滚量,时间会有所不同。

我不建议您将数据库置于离线模式,我认为这没有任何用处。