DBCC:无法独占锁定数据库来执行操作

DBCC:无法独占锁定数据库来执行操作

我跑DBCC CHECKDB ([MyDb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, PHYSICAL_ONLY

20 秒后,它会失败并出现错误:

消息 5030,严重性 16,状态 12,第 1 行:无法独占锁定数据库来执行操作。[SQLSTATE 42000]

消息 7926,严重性 16,状态 1,第 1 行:检查语句中止。无法检查数据库,因为无法创建数据库快照,并且无法锁定数据库或表。请参阅联机丛书,了解何时会出现此行为以及存在哪些解决方法的详细信息。另请参阅以前的错误以了解更多详细信息。[SQLSTATE 42000]

数据库为1TB,SQL Server 2005。

为什么 DBCC 需要独占数据库锁?我该如何完成检查?

添加:当我终止与数据库的所有连接然后运行检查时,DBCC 成功运行。sp_who2 显示用户使用 .Net SQLClient 提供程序从 Web 服务器访问数据库

SQL Server 服务在 Windows 帐户下运行,即本地管理员。

答案1

最有可能的是,SQL 服务帐户没有创建必要快照文件的权限。

在活动数据库上,CHECKDB 不太可能获得运行分配检查所需的 X 数据库锁,这就是我将锁超时更改为仅 20 秒(IIRC)的原因。

谢谢

答案2

我不确定停止拍摄快照的根本原因;但您是否尝试过运行DBCC CheckDB选项Tablock来查看它是否有效?(明确在线图书国家tablock选择权“包括数据库上的短期排他(X)锁。”) 但至少它不会拍摄快照,并且 DBCC CheckDB 这次可能会通过此选项成功。另一个选项是这不是一个关键系统,您可以承受停机时间;尝试将其更改为单用户模式并再次运行 DBCC,或者如果您有测试环境,则将其还原到其他地方并执行 DBCC。

你应该找的人保罗·兰德尔的博客针对 CheckDB 的所有内容。

答案3

为了消除这个错误,我写了一篇详细的博客文章。

  1. 断开连接。(操作方法 File > Disconnect Object Explorer:)
  2. 连接连接。(操作方法 File > Connect Object Explorer:)
  3. 打开“新查询”窗口并运行以下命令:(use master注意:上述命令将使您当前的数据库成为主数据库,这在我们运行以下命令序列之前很重要。)
  4. 在查询窗口中复制并粘贴以下命令序列。将“MyDatabaseName”一词替换为您尝试获取独占访问权限的数据库名称。

更改数据库 MyDatabaseName 设置 SINGLE_USER 并立即回滚

更改数据库 MyDatabaseName 设置 SINGLE_USER 并在 30 后回滚

更改数据库 MyDatabaseName 设置 SINGLE_USER WITH NO_WAIT

更改数据库 MyDatabaseName 设置 MULTI_USER 立即回滚;

现在您已完成,现在可以尝试之前尝试执行的导致Database could not be exclusively locked to perform the operation错误的命令或操作。

答案4

有时,当隐藏的数据库快照空间不足时,就会出现问题。由于它是使用现有数据文件的备用流实现的,因此数据库快照会占用与现有数据文件相同位置的空间。如果被检查的数据库更新工作量很大,则会将越来越多的页面推送到数据库快照中,从而导致其增长。在托管数据库的卷没有太多空间的情况下,这可能意味着隐藏的数据库快照空间不足,并且 DBCC CHECKDB 会因错误而停止。下面显示了一个示例(错误可能因数据库快照空间不足的确切时间点而异):

尝试此链接

http://sqlism.blogspot.com/2014/10/a-database-snapshot-cannot-be-created.html

相关内容