主库备库坏块修复功能

在数据库运行过程中,会因为某些磁盘问题(例如数据意外覆盖)等问题,导致磁盘数据损坏,从而影响数据库的正常运行。为了解决这类问题,openGauss数据库提供了主库备库坏块恢复功能,用于解决主库备库坏块问题。通过该方式,可以解决主库备库坏块问题,从而保证数据库的可用性。

  • 备库修复主库: openGauss目前支持在数据读取过程中,通过备库修复主库坏块。在主库读取数据时,需要从磁盘上扫描页到内存中,当发现数据页损坏时,主库会在页面读取函数,通过远程连接到备库,将备库上的正常数据页返回给主库,返回给上层,从而不感知坏块的产生。在该场景中,主库并不进行坏块修复,而是通过备库数据向上返回,因此严格意义上说,只是规避了主库坏块问题,并没有解决主库坏块问题。

  • 主库修复备库: 与备库修复主库不同,备库如果发现数据页损坏,备库会从主库获取数据,进行修复,但是这种修复是真实的修复,会覆盖底层数据页面,从而进行修复,但是受限于备机与主机版本差异问题,备机只能在回放过程中修复页面。且该方式需要主库和备库之间建立连接,因此需要主库和备库之间网络正常。

整体的逻辑和流程大致如下:

  1. 当备库正常回放业务期间,如果回放线程遇到了坏块,此时会尝试从主机通过remote read方式寻求主机页面,即从主机读取该物理页面;
  2. 当获得主机页面后,备库会判断页面版本,如果该版本较新,则会记录,等待LSN回放到该点位,此时不进行修复;
  3. 如果继续回放用到该页面,则会从记录中寻求该页面。该页面如果确实是当前回放的页面,则直接将该页面视为回放完成,正常置脏落盘;

通过上述流程,即使在业务线程扫描到了坏块,也可以保证回放过程中会使备机数据与主机统一,规避坏块无法修复的风险。

对于该修复功能,约束为仅支持单集群备节点的用户数据修复,且不支持压缩表、列存表,只支持回放过程中修复,不支持备机读业务修复。

意见反馈
编组 3备份
    openGauss 2025-07-04 22:43:02
    取消