#修复异常备库
对某些特定的异常场景,YashanDB提供快速修复功能,保证高可用环境的平稳运行,相关语法定义及描述请参考BUILD DATABASE。
本文主要介绍单机部署中的备库修复方案。
当YashanDB部署为容器数据库(配置参数ENABLE_PLUGGABLE_DATABASE=TRUE)时,应根据待构建的对象选择BUILD DATABASE语句的执行容器:
连接根容器
执行BUILD DATABASE:构建整个备容器数据库(含根容器和所有PDB)
执行BUILD DATABASE ROOT:构建备根容器
直连PDB执行BUILD DATABASE:仅构建对应的备PDB
另外,构建备PDB还可以连接根容器执行BUILD PLUGGABLE 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同时修复多个备库
BUILD DATABASE TO STANDBY (standby1,standby2);,提高修复效率。- 出现need repair时,DBA需要分析备库异常的原因,选择恰当的修复策略,建议优先考虑快速修复方案。
示例(单机部署)
-- 关闭备库
SQL> shutdown abort;
-- 清理data目录、local_fs目录以及archive所在目录下的子文件和子文件夹
-- 重启备库至nomount
$ yasboot cluster start -c yashandb -m nomount
$ yasql / as sysdba
-- 检查网络是否连通,CONNECTION为CONNECTED则主备网络连接正常,为DISCONNECTED则主备网络不相通
SQL> SELECT CONNECTION,STATUS,PEER_ADDR,TRANSPORT_LAG,APPLY_LAG FROM V$REPLICATION_STATUS;
-- 主备网络连接正常时,在备库上执行build database
SQL> BUILD DATABASE;
-- 检查node_2的实例状态是否正常,STATUS应为OPEN
SQL> SELECT STATUS FROM v$instance;
-- 检查node_2的状态、打开模式和角色信息是否正常,STATUS应为NORMAL,OPEN_MODE应为READ_ONLY,DATABASE_ROLE应为STANDBY
SQL> SELECT STATUS, OPEN_MODE, DATABASE_ROLE FROM v$database;
# CDB中的其他异常修复
当YashanDB部署为容器数据库(配置参数ENABLE_PLUGGABLE_DATABASE=TRUE)时,备PDB异常修复还可以通过根容器进行统一运维管理,以及如果只是备根容器单独出现异常无需构建整个容器数据库只需单独构建备根容器即可。
# 批量备PDB异常修复
如果备PDB出现异常情况时,也可以通过根容器进行统一运维,通过执行BUILD PLUGGABLE DATABASE快速重建恢复单个或批量PDB。
示例(单机部署)
# 1. 登录主PDB1。
$ yasql sys/********@192.168.1.2:1688/pdb1
-- 2. 查询备PDB的状态、网络连接状态以及need repair的错误原因,STATUS应为NEED REPAIR,CONNECTION应为CONNECTED
SQL> SELECT STATUS,CONNECTION,ERROR FROM V$REPLICATION_STATUS;
SQL> exit
# 3. 关闭备PDB1
$ yasboot pdb stop -c yashandb -n 1-2 --pdb pdb1
# 4. 登录根容器。
$ yasql sys/********@192.168.1.2:1688
-- 5. 清理目标备PDB1的数据文件(但必须保留PDB元数据)。
SQL> DROP PLUGGABLE DATABASE pdb1 INCLUDING ARCHIVELOG KEEP METADATA;
-- 6. 执行BUILD PLUGGABLE DATABASE重建目标备PDB1。
SQL> BUILD PLUGGABLE DATABASE pdb1;
SQL> exit
# 7. 登录主PDB1。
$ yasql sys/********@192.168.1.2:1688/pdb1
-- 8. 检查备PDB的状态、网络连接等,STATUS应为NORMAL,CONNECTION应为CONNECTED
SELECT CONNECTION,STATUS,PEER_ROLE,PEER_MODE FROM V$REPLICATION_STATUS;
# 备根容器异常修复
如果备根容器出现异常情况,需要重建备根容器。
示例(单机部署)
# 1. 以安装用户登录备根容器所在服务器。
# 2. 清理备根容器的data目录、local_fs目录以及archive所在目录下的子文件和子文件夹。
# 3. 重启备根容器至NOMOUNT阶段。
$ yasboot node restart -c yashandb -n 1-2 -m nomount
# 4. 登录备根容器。
$ yasql / as sysdba
-- 5. 查询备根容器的状态、网络连接状态以及need repair的错误原因,STATUS应为NEED REPAIR,CONNECTION应为CONNECTED。
SQL> SELECT STATUS,CONNECTION,ERROR FROM V$REPLICATION_STATUS;
-- 6. 执行build database root快速修复备根容器。
SQL> BUILD DATABASE ROOT;
-- 7. 检查备根容器的状态、网络连接等,STATUS应为NORMAL,CONNECTION应为CONNECTED。
SQL> SELECT CONNECTION,STATUS,PEER_ROLE,PEER_MODE FROM V$REPLICATION_STATUS;

