#备机异常修复

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

# 备机有GAP

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

Note

  1. 主机和备机的datafile、redofile以及bucket的数量不一致或者版本不一致时,不可以通过build database incremental语句修复备机GAP。
  2. 如果备机的状态是need repair,或者备机未open,不可以通过build database incremental语句修复备机GAP。
  3. build database incremental也可用于修复级联备的GAP。
  4. 主机可以通过指定IP地址的方式来修复备机的GAP。
  5. 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

  1. 主机和备机的datafile、redofile以及bucket的数量不一致或者版本不一致时,不可以通过build database repair语句修复备机。
  2. 如果备机的状态是normal,或者备机未open,不可以通过build database repair语句修复备机。
  3. build database repair也可用于修复级联备。
  4. 脑裂有可能修复失败,失败的原因可能有:没有找到主机与备机的日志分歧点、主机与备机的数据差异较多修复效率低修复会失败等。
  5. 分布式下备机need repair可能会导致通过yasboot正常停止集群卡住,需通过yasboot强制重启集群。
  6. 共享集群不支持修复备机,出现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

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

示例

--关闭备机数据库
SHUTDOWN ABORT;

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

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

--参考[主一备部署架构],检查相关参数配置
--检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通
SQL> 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;