可用性组 & 数据库镜像 自动页修复类型及原理

数据库镜像和 Always On 一般以等效方式处理 I/O 错误,并且镜像已是后续不再支持的技术,下面主要以Always On介绍。

同步模式的Always On支持自动页修复。 在某些类型的错误导致页损坏,使其无法读取后,坏页节点会自动从正常节点请求该坏页的新副本。 如果请求成功,会自动替换坏页,修复成功。

自动页修复有别于 DBCC 修复,自动页修复会保留所有数据。相反,DBCC REPAIR_ALLOW_DATA_LOSS 选项更正错误可能需要删除某些页(从而会删除数据)。

一、 会触发自动页修复的错误类型

自动页修复只尝试修复特定数据文件中的页,即由于下表中的某一错误而失败的数据文件。

错误号 说明 导致自动页修复尝试的实例
823 仅当操作系统对数据执行循环冗余检查 (CRC) 失败时才执行此操作。 ERROR_CRC。 此错误的操作系统值为 23。
824 逻辑错误。 逻辑数据错误,例如残缺写或错误的页校验和。
829 页已标记为还原已挂起(restore pending)。 全部。

若要查看最近的 823 CRC 错误和 824 错误,请参阅 msdb 数据库中的 suspect_pages 表。

自动页修复是一个运行在后台的异步进程。请求不可读的页的数据库操作将失败,并且不管导致失败的条件是什么均返回错误代码。如果遇到 SQL Server 823、824 或 829报错,应暂停操作,稍后重试。

 

二、 无法进行自动页修复的页类型

  • page ID=0(文件头页)

  • page ID=9(数据库引导页)

  • 分配页:GAM、SGAM、PFS

三、 主库页面损坏

在主库中,仅当数据库处于 SYNCHRONIZED 状态且主库仍向从库发送日志记录时,才会尝试自动页修复。

对于Always On,自动页修复尝试步骤如下:

  • 当主库中的数据页上发生读取错误时,主库将相应的错误插入msdb.suspect_pages表

  • 主库将向所有从库广播请求,并且从第一个响应的从库中获取该页。此请求指定当前在刷新日志末尾的页 ID 和 LSN,并将坏页标记为"restore pending",这将使它在尝试自动页修复期间不可访问,访问会遇到报错 829(页已标记为restore pending)。

  • 收到页请求后,从库将等待,直到将日志apply到请求中指定的 LSN 处。然后,从库尝试在其数据库副本中访问此页。如果可以访问,则从库将此页的副本发送到主库。否则,从库将向主库返回错误,自动页修复失败。

  • 主库收到从库发来的修复页后进行处理和替换。

  • 修复坏页后,此页将在suspect_pages表中被标记为已还原 (event_type= 5)。

  • 如果页面损坏问题导致出现延迟的事务,修复后,主库将尝试解决这些事务。

四、 从库页面损坏

对于Always On,自动页修复尝试步骤如下:

  • 如果从库在apply日志时遇到坏页错误,则从库将进入 SUSPENDED 状态并将相应的错误插入msdb.suspect_pages表

  • 从库向主库请求此页副本。

  • 主库尝试在其数据库副本中访问此页。如果可以访问,则将此页副本发送到从库。

  • 如果从库收到了请求的页副本,将尝试继续apply日志,恢复同步。

  • 如果修复了坏页,此页将在suspect_pages表中被标记为已还原 (event_type= 4)。

  • 如果从库未从主库收到请求的页,则自动页修复尝试失败,从库将保持挂起。如果手动恢复从库,坏页将在被apply到时再次导致错误。

五、 如何查看自动页修复记录

下面的视图返回对应于给定可用性数据库或镜像数据库上最新自动页修复尝试的行,每个数据库最多可对应 100 行。

参考

https://docs.microsoft.com/zh-cn/sql/sql-server/failover-clusters/automatic-page-repair-availability-groups-database-mirroring?view=sql-server-ver15

发布了295 篇原创文章 · 获赞 35 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hehuyi_In/article/details/105036368
今日推荐