我跑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
答案3
- 断开连接。(操作方法
File > Disconnect Object Explorer
:) - 连接连接。(操作方法
File > Connect Object Explorer
:) - 打开“新查询”窗口并运行以下命令:(
use master
注意:上述命令将使您当前的数据库成为主数据库,这在我们运行以下命令序列之前很重要。) - 在查询窗口中复制并粘贴以下命令序列。将“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