KB3054530 - 修复:将辅助副本 (replica) 更改为不可读时,辅助副本 (replica) 页上发生损坏

应用对象
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard

症状

假设你在 Microsoft SQL Server 2012 中使用 AlwaysOn 可用性组功能。 将次要副本 (replica) 的连接访问权限从“可读”更改为“不可读”时,给定副本 (replica) 中使用页面压缩的页面上会发生损坏。

由于在同步的重做阶段期间出错,在次要副本 (replica) 遇到此问题的可用性数据库无法恢复。 辅助副本 (replica) 不会与主副本 (replica) 同步,并报告同步状态“SUSPEND_FROM_REDO”。此外,你会在托管次要副本 (replica) 的 SQL Server 的错误日志中收到以下错误消息:

注意

< 日期><Time> spid<ID> 错误:17066,严重性:16,状态:1。
< 日期><Time>spid<ID> SQL Server 断言:文件:<page.cpp>,行=3898 失败 断言 = '!pageFull'。 此错误可能与计时有关。 如果重新运行语句后错误仍然存在,请使用 DBCC CHECKDB 检查数据库的结构完整性,或重启服务器以确保内存中数据结构未损坏。
< 日期><Time> spid<ID> 错误:3624,严重性:20,状态:1。
< 日期><Time>spid<ID> 系统断言检查失败。 查看 SQL Server 错误日志了解详细信息。 断言失败通常是由软件 bug 或数据损坏导致的。 若要检查数据库损坏,请考虑运行 DBCC CHECKDB。 如果你同意在安装过程中向 Microsoft 发送转储,则将向 Microsoft 发送一个小型转储。 更新可能来自最新 Service Pack 中的 Microsoft 或技术支持的 QFE 中提供。
< 日期><Time>spid<ID> AlwaysOn 可用性组 数据库“数据库>名称<”的数据移动已暂停,原因如下:“system” (Source ID 2;源字符串:“SUSPEND_FROM_REDO”) 。 若要恢复数据库上的数据移动,需要手动恢复数据库。 有关如何恢复可用性数据库的信息,请参阅 SQL Server 联机丛书。
< 日期><Time> spid<ID> 错误:3313,严重性:21,状态:2。
< 日期><Time>spid<ID> 在数据库“数据库名称><”中重做记录的操作期间,日志记录 ID (1786:4978584:74) 发生错误。 通常,特定故障以前会在 Windows 事件日志服务中记录为错误。 从完整备份还原数据库,或修复数据库。
< 日期><Time> spid<ID> ALTER DB param option: RESUME
< 日期><Time>spid<ID> AlwaysOn 可用性组 数据库“数据库>名称<”的数据移动已恢复。 这只是信息提供的消息。 无需用户操作。
< 日期><Time>spid<ID> 数据库数据库中<正在回滚不合格的事务 AlwaysOn 可用性组状态更改的数据库名称>。 预计回退完成度:100%。 这只是信息提供的消息。 无需用户操作。
< 日期><Time>spid<ID> AlwaysOn 可用性组与主数据库的连接终止,以用于副本 ID 为 {bbdedecb-f26b-47e9-9e7d-7c22f99edb23} 的可用性副本 (replica #>C1 上的辅助数据库“数据库名称<”。 这只是信息提供的消息。 无需用户操作。
< 日期><Time>spid<ID> 正在启动数据库“数据库名称><”。
< 日期><Time>spid<ID> 数据库“数据库名称><”恢复 (13) 已完成 0%, (剩余约 781 秒) 。 阶段 1/3。 这只是信息提供的消息。 无需用户操作。
……

解决方法

此问题已首先在 SQL Server 的以下累积更新中修复。

SQL Server 2012 SP2 累积更新 6

            
             SQL Server 2012 SP1 累积更新 16
          

关于 SQL Server 的累积更新

SQL Server 的每个新累积更新都包含上一个累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:

      

详细信息

更改次要副本 (replica) 的读取访问权限时,可能会出现上一个问题。
可以使用以下两种方法在次要副本 (replica) 上设置可用性数据库的读取访问权限:

  • 使用 ALTER AVAILABILITY GROUP 命令设置读取访问权限:

    ALTER AVAILABILITY GROUP [AGName]
    MODIFY REPLICA ON N'<SRV>' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = NO))
    
  • 通过更改SQL Server Management Studio (SSMS) 对象资源管理器中的设置来设置读取访问权限:

    • 连接到服务器,然后打开 AlwaysOn Availability 文件夹。
    • 打开可用性组文件夹。
    • 右键单击可用性组,然后选择“属性”。
    • 将辅助副本 (replica) 的“可读辅助”属性更改为“否”,然后单击“确定”。

状态

Microsoft 已确认在 "适用于" 部分中所列的 Microsoft 产品中存在问题。