DBCC:不能专门locking数据库来执行操作

DBCC CHECKDB ([MyDb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, PHYSICAL_ONLY运行DBCC CHECKDB ([MyDb]) WITH NO_INFOMSGS, ALL_ERRORMSGS, PHYSICAL_ONLY

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

Msg 5030,Sev 16,State 12,Line 1:数据库不能独占locking执行操作。 [SQLSTATE 42000]

7926,Sev 16,状态1,第1行:检查语句中止。 由于无法创build数据库快照而无法locking数据库或表,因此无法检查数据库。 请参阅联机丛书以了解何时需要此行为以及存在哪些解决方法的详细信息。 另请参阅以前的错误了解更多详情。 [SQLSTATE 42000]

数据库是1TB,SQL Server 2005。

为什么DBCC需要独占的数据库锁? 我怎样才能完成检查?

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

SQL Server服务在本地pipe理员的windows帐户下运行。

SQL服务帐户很可能没有创build必要的快照文件的权限。

在一个活动数据库上,CHECKDB非常不可能获得运行分配检查所需的X数据库锁,这就是为什么我将锁超时改为20秒(IIRC)。

谢谢

我不确定停止快照的根本原因; 但是你有没有试过用Tablock选项运行DBCC CheckDB来查看它是否工作? ( 在线书籍明确指出tablock选项“包括对数据库的短期排他(X)locking” )。但至less不会占用快照,DBCC CheckDB可能会使用此选项成功。 另一种select是这不是一个关键的系统,你可以负担得起的时间; 尝试将其更改为单用户模式,然后再次运行DBCC或将其还原到其他位置,并在有testing环境的情况下执行DBCC。

CheckDB的所有东西都应该是Paul Randal的博客 。

我写了一个详细的博客文章,以摆脱这个错误。

  1. 断开连接。 (这样做: File > Disconnect Object Explorer
  2. 连接连接。 (要这样做: File > Connect Object Explorer
  3. 打开“新build查询”窗口,运行以下命令: use master (注意:在运行下面的命令之前,上面的命令会让你当前的数据库掌握重要。
  4. 在查询窗口中复制并粘贴以下命令序列。 将“MyDatabaseName”replace为试图获得独占访问权限的数据库名称。

ALTER DATABASE MyDatabaseName SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTER DATABASE MyDatabaseName SET ROLLBACK后SINGLE_USER 30

ALTER DATABASE MyDatabaseName使用NO_WAIT设置SINGLE_USER

ALTER DATABASE MyDatabaseName SET MULTI_USER WITH ROLLBACK IMMEDIATE;

你现在已经完成了,你现在可以尝试一下你之前试图执行的命令或者操作,这个命令或者操作给了你Database could not be exclusively locked to perform the operation错误。

我最终创build了一个快照,并在其上运行DBCC。

当隐藏的数据库快照耗尽空间时,有时会出现问题。 因为它是使用现有数据文件的备用stream实施的,所以数据库快照占用与现有数据文件相同位置的空间。 如果正在检查的数据库负载较重,则将越来越多的页面压入数据库快照,导致数据增长。 在托pipe数据库的卷没有太多空间的情况下,这可能意味着隐藏的数据库快照耗尽空间,DBCC CHECKDB停止并出现错误。 此处显示了一个示例(错误可能因数据库快照在空间不足的确切点而异):

试试这个链接

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