#备库异常修复

对某些特定的异常场景,YashanDB提供快速修复功能,保证高可用环境的平稳运行,相关语法定义及描述请参考开发手册BUILD DATABASE

# 备库有GAP

在高可用运行的过程中,备库可能会因为网络传输、磁盘IO等原因导致与主库的差距较大,且短时间无法同步主库业务。出现此类场景时,可以采用build database incremental语句快速修复GAP,缩小主备差距,正常同步主库业务。

Note

  • 主库和备库的datafile、redofile以及bucket的数量不一致或版本不一致时,不可以通过build database incremental语句修复备库GAP。
  • 如果备库的状态是need repair,或备库未open,不可以通过build database incremental语句修复备库GAP。
  • build database incremental也可用于修复级联备的GAP。
  • 主库可以通过指定IP地址的方式来修复备库的GAP。
  • build database incremental语句只能在同一主备或级联备集群间执行,不可以跨集群修复GAP。

# 同步备修复

如果高可用环境中已配置了同步备,或存在主备差距较小的备库,可以通过该备库去修复日志落后较多的备库,可以避免对主库产生较大的影响,影响业务的运行。

示例(单机部署)

-- 主库上检查异常备库和同步备库的状态、数据库模式、网络连接状态以及IP地址,STATUS应为NORMAL,CONNECTION应为CONNECTED,DATABASE_MODE应为OPEN
SELECT CONNECTION,STATUS,DATABASE_MODE,PEER_ADDR FROM V$ARCHIVE_DEST_STATUS;

-- 同步备执行build database去修复备库GAP (standby_addr是异常备库的IP地址)
BUILD DATABASE INCREMENTAL TO REMOTE standby_addr;

-- 检查备库的状态、网络连接,主备差距等
SELECT * FROM V$REPLICATION_STATUS;

# 主库修复

如果高可用环境中没有部署同步备,且所有备库均落后于主库较多日志,此时需通过主库修复备库的GAP。

示例(单机部署)

-- 检查备库的状态、数据库模式、网络连接状态,STATUS应为NORMAL,CONNECTION应为CONNECTED,DATABASE_MODE应为OPEN
SELECT CONNECTION,STATUS,DATABASE_MODE,PEER_ADDR FROM V$ARCHIVE_DEST_STATUS;

-- 查询备库的DB_UNIQUE_NAME为standby_name
SELECT DB_UNIQUE_NAME FROM V$ARCHIVE_DEST;

-- 执行build database去修复备库GAP
BUILD DATABASE INCREMENTAL TO STANDBY standby_name;

-- 检查备库的状态、网络连接,主备差距等
SELECT * FROM V$REPLICATION_STATUS;

# 备库NEED REPAIR

在高可用运行的过程中,可能会因为部署异常、用户误操作清理了主库归档或出现脑裂现象等问题,导致备库无法正常同步主库,备库被置为NEED REPAIR状态,此时需对该异常备库进行修复。

脑裂现象是指出现了多个主库提供服务的情况,这种现象会造成数据丢失或不一致问题。例如,在旧主库上提交的事务,新主库上不存在,数据丢失。旧主库降备后,redo日志与新主库不匹配,无法和新主库建立正常的主备关系。

# 快速修复

因如下原因而导致的备库无法正常同步时,可以通过build database repair语句快速修复异常备库:

  • 主库的归档被清理
  • 备库的归档损坏
  • 脑裂

Note

  • 主库和备库的datafile、redofile以及bucket的数量不一致或版本不一致时,不可以通过build database repair语句修复备库。
  • 如果备库的状态为normal,或备库未open,不可以通过build database repair语句修复备库。
  • build database repair也可用于修复级联备。
  • 脑裂有可能修复失败,失败的可能原因有:没有找到主库与备库的日志分歧点、主库与备库的数据差异较多修复效率低修复会失败等。
  • 分布式下备库need repair可能会导致通过yasboot正常停止集群卡住,需通过yasboot强制重启集群。
  • 共享集群只能通过下述全量同步方式修复need repair问题。

示例(单机部署)

-- 查询备库的状态、网络连接状态以及need repair的错误原因,STATUS应为NEED REPAIR,CONNECTION应为CONNECTED
SELECT STATUS,CONNECTION,ERROR FROM V$REPLICATION_STATUS;

-- 主库上查询备库的DB_UNIQUE_NAME为standby_name
SELECT DB_UNIQUE_NAME FROM V$ARCHIVE_DEST;

-- 主库上执行build database repair来快速修复备库
BUILD DATABASE REPAIR STANDBY standby_name;

-- 检查备库的状态、网络连接等,STATUS应为NORMAL,CONNECTION应为CONNECTED
SELECT * FROM V$REPLICATION_STATUS;

# 全量同步

因快速修复中列示原因之外的其他原因导致的备库无法正常同步或无法快速修复,只能通过全量build database修复备库。

Note

  • 如果存在多个备库need repair,可以在主库上执行build database同时修复多个备库,提高修复效率,具体操作请参考一主多备部署备库扩缩容
  • 出现need repair时,DBA需要分析备库异常的原因,选择恰当的修复策略,建议优先考虑快速修复方案。

示例(单机部署)

-- 关闭备库
SHUTDOWN ABORT;

-- 清理data目录、local_fs目录以及archive所在目录下的子文件和子文件夹
-- 重启备库至nomount

$ yasboot cluster start -c yashandb -m nomount
$ yasql sys/sys

-- 参考[一主一备部署],检查相关参数配置
-- 检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通
SELECT CONNECTION,STATUS,PEER_ADDR,TRANSPORT_LAG,APPLY_LAG FROM v$replication_status;
 
-- 主备网络连接正常时,在备库上执行build database
BUILD DATABASE;

-- 检查node_2的实例状态是否正常,STATUS应为OPEN
SELECT STATUS FROM v$instance;

-- 检查node_2的状态、打开模式和角色信息是否正常,STATUS应为NORMAL,OPEN_MODE应为READ_ONLY,DATABASE_ROLE应为STANDBY
SELECT STATUS, OPEN_MODE, DATABASE_ROLE FROM v$database;