0

在新的 Azure 文件共享上存储 SQL Server 数据库文件。无法针对这些数据库运行完整/全面的 CHECKDB - 我认为这与无权创建快照的用户帐户有关。结果,我将这些检查卸载到了另一个服务器,我也可以在该服务器上测试 .baks。一切正常,除了主数据库,当您将其还原为用户数据库并针对它运行 CHECKDB(https://www.itprotoday.com/my-master-database-really-corrupt)时,它会注册损坏,即使它是不腐败。

问题:

1) 是否有人在 Azure 文件共享上存储的 SQL db 文件上运行 CHECKDB 时遇到同样的问题?有解决方法吗?

2) 如果我不能在 PROD 中运行 CHECKDB,那么在 master 上运行 CHECKDB 的替代方法是什么?我可以以某种方式将 master 恢复到另一个 SQL 实例并在那里检查吗?

在 PROD 中执行 DBCC CHECKDB (master) 时出错:

消息 5030,级别 16,状态 12,第 4 行 无法以独占方式锁定数据库以执行操作。消息 7926,级别 16,状态 1,第 4 行检查语句中止。无法检查数据库,因为无法创建数据库快照并且无法锁定数据库或表。请参阅联机丛书以了解有关何时会出现此行为以及存在哪些变通方法的详细信息。另请参阅以前的错误以获取更多详细信息。

当我在 PROD 中的用户 db 上运行 DBCC CHECKDB 时的消息:

DBCC CHECKDB 不会检查 SQL Server 目录或 Service Broker 的一致性,因为无法创建数据库快照或指定了 WITH TABLOCK。

4

1 回答 1

0

请参考此 Azure 支持文档:在 SQL Server 中运行任何 DBCC CHECK 命令时出现错误消息:“无法以独占方式锁定数据库以执行操作”

在 Microsoft SQL Server 中,当您运行以下任何 DBCC 命令时,您可能会收到一条错误消息:

  • DBCC CHECKDB
  • DBCC 检查表
  • DBCC CHECKALLOC
  • DBCC 检查目录
  • DBCC 检查文件组

错误消息包含以下文本:

Msg 5030, Level 16, State 12, Line 1 The database could not be exclusively locked to perform the operation. 
Msg 7926, Level 16, State 1, Line 1 
Check statement aborted. The database could not be checked as a database snapshot could not be created and the database or table could not be locked. See Books Online for details of when this behavior is expected and what workarounds exist. Also see previous errors for more details.

原因:

如果满足以下条件,则会出现此问题:

  • 至少一个其他连接正在使用您对其运行 DBCC CHECK 命令的数据库。
  • 数据库包含至少一个标记为只读的文件组。

从 SQL Server 2005 开始,当 DBCC CHECK 命令执行任何检查时,出于一致性目的,DBCC CHECK 命令会创建并使用内部数据库快照。如果数据库中存在只读文件组,则不会创建内部数据库快照。要继续执行检查,DBCC CHECK 命令会尝试获取 EX 数据库锁。如果其他用户连接到此数据库,则获取 EX 锁的尝试将失败。因此,您会收到一条错误消息。

解析度

若要解决此问题,请按照以下步骤操作,而不是对数据库运行 DBCC CHECK 命令:

  1. 创建要执行检查的数据库的数据库快照。有关如何创建数据库快照的详细信息,请参阅 SQL Server 联机丛书中的“创建数据库快照 (Transact-SQL)”主题。
  2. 针对数据库快照运行 DBCC CHECK 命令。
  3. 在 DBCC CHECK 命令完成后删除数据库快照。

该文档可以为解决问题提供更多帮助。

更新:

对于系统数据库,它不使用数据库快照,但它会持有表锁。

您还可以参考此博客:Checkdb 为 master 数据库提供错误:Mike Walsh 为我们提供了有关该错误的更多信息。

希望这可以帮助。

于 2019-08-09T01:41:40.370 回答