使用SQL Server镜像体系结构时镜像服务器上的断言失败

本文讨论使用SQL Server镜像体系结构时合作伙伴服务器上可能发生的 Microsoft SQL Server断言失败。

原始产品版本:SQL Server 2014、SQL Server 2012、SQL Server 2008 R2、SQL Server 2008
原始 KB 编号: 2729953

症状

在SQL Server镜像体系结构中,合作伙伴 (镜像) 服务器上可能会遇到SQL Server断言检查失败。 在这种情况下,检查SQL Server错误日志了解详细信息。 在日志中,你会发现类似于以下消息的错误消息。 此错误通常意味着必须重新生成镜像对。

SQL Server断言:文件:loglock.cpp,行=834 失败断言 = 'result == LCK_OK' 。 此错误可能与计时相关。 如果错误在重新运行语句后仍然存在,请使用 DBCC CHECKDB 检查数据库以确保结构完整性,或重启服务器以确保内存中的数据结构不会损坏。

错误:3624,严重性:20,状态:1。

通常,断言失败是由软件 bug 或数据损坏引起的。 若要检查数据库损坏,请考虑运行 DBCC CHECKDB。 如果你同意在安装过程中向 Microsoft 发送转储,则会向 Microsoft 发送一个小型转储。 Microsoft 可能会在最新的 Service Pack 或技术支持的 QFE 中获取更新。

注意

发生此问题时,会在错误日志文件夹中生成SQL Server小型转储文件。 此文件的名称类似于 SQLDumpnnnn.mdmp 文件名。

原因

此问题可能在不同的方案中发生。 每个方案都有不同的原因和解决方法,每个方案都可能导致相同的错误消息和断言失败。

注意

  • 尽管错误签名似乎非常具体,但实际错误是由失败的断言引起的。 例如,错误可能是由断言引起的,该断言在SQL Server代码中执行主动检查,该代码验证正常条件是否尽可能干净地失败,而不是导致进程范围的崩溃。
  • 你无法轻易确定实际原因。 Microsoft 客户支持服务通常确定原因。 通常通过收集主体数据库完整备份文件和涵盖问题时间的事务日志备份来完成。 此外,可能需要镜像的完整进程转储文件才能在特定设置中重现问题。

解决方案

若要解决此问题,请获取SQL Server版本的最新修补程序。 有关详细信息,请参阅下表。

原因 知识库文章 首先修复了
主要和镜像之间的不同锁定行为 2938828修复:数据库镜像命中断言,镜像会话在 2012 SQL Server 或 2014 SQL Server 显示挂起状态 2931693 2014 SQL Server累积更新 1,SQL Server 2012 SP1 2931078累积更新 9
使用Check_Constraints OFF 批量插入/BCP SQL Server 2012
加密密钥的更改:数据库主密钥、服务器实例主密钥 SQL Server 2012

注意

  • 在上表中,最后一列仅列出了包含修补程序的第一个内部版本。 由于SQL Server版本是累积的,因此更高版本的生成(如 SQL Server 2014 SP1)包含这些修补程序。 但是,表中未列出这些内部版本。
  • 有关如何获取SQL Server版本的最新 Service Pack 的详细信息,请参阅确定版本、版本和更新级别。 BCP/Bulk Insert 方案是一种常见方案,对于 SQL Server 2008 和 SQL Server 2008 R2,它是这些版本lck_ok断言的最可能已知原因。 此问题在 2012 SQL Server首次修复。 在早期版本中未修复此问题的原因是,它需要重新构建SQL Server事务日志内部结构。 此类更改只能包含在 SQL Server 的主要版本中。

另请参阅

执行批量插入或 BCP 时的断言