#主备切换
YashanDB支持在主备库同步正常的情况下进行主备库的手动Switchover切换,也支持在主库异常的情况下进行备库的手动Failover切换,但在开启自动选主时无法使用Failover切换。
共享集群部署中,仅备集群的master节点支持手动Switchover切换以及未开启自动选主时手动Failover切换。
Note:
手动执行Switchover或Failover时,新主实例升主流程分为修改角色前和修改角色后,如果修改数据库角色后流程失败,新主实例会自动shutdown后尝试重启。
例如XFMR(后台自动转换)模块的启动是在更改角色后执行的,如果启动失败,升主时会自动shutdown后重启。
# Switchover切换
Switchover切换方式适用于主备库同步正常的情况,可选择任意一个备库执行操作。
Caution:
- Switchover过程中,主库已连接的会话将全部断连,并且主库不可连接新的会话,直到切换完成或失败。
- Switchover过程中,如果主备网络断连,切换将失败。
- 如果备库transport_lag或apply_lag不为0,即备库有待接收和回放的redo,Switchover过程可能时间较久,通过查询V$RECOVERY_PROGRESS视图查看剩余回放时间。
- Switchover完成后,主备库会重新进行连接,将出现短暂的网络断连。
检查主备库同步状态,确认主备库同步无异常,并确认主备库的角色。
-- 确认主备库的角色,为主库或备库 SELECT database_id,database_name,log_mode,open_mode,database_role FROM V$DATABASE; DATABASE_ID DATABASE_NAME LOG_MODE OPEN_MODE DATABASE_ROLE ------------ -------------- ------------- ------------ -------------- 569377301 yasdb ARCHIVELOG READ_ONLY STANDBY -- 确认备库连接正常,状态正常 SELECT connection, status, peer_addr, transport_lag, apply_lag FROM V$REPLICATION_STATUS; CONNECTION STATUS PEER_ADDR TRANSPORT_LAG APPLY_LAG ----------- -------- ---------------------- ------------- ------------ CONNECTED NORMAL 127.0.0.1:1688 0 0
在备库中执行Switchover切换。
此时主库的所有事务将被中断,且Switchover执行过程中客户端无法连接主库。
ALTER DATABASE SWITCHOVER;
重复步骤1检查主备库的角色是否已交换以及同步情况是否正常。
# Failover切换
Failover切换方式适用于主库损坏,或者服务器宕机等不可用时,必须立即进行故障切换,尽快恢复业务。
# 选择备库升主
在紧急状态下进行的故障切换可能会丢失数据,为尽可能降低损失,应该在多个备库中选择日志量最多的一个备库执行Failover。
Caution:
- Failover可能丢失数据,只能在主库故障的情况下进行,否则可能会出现双主、脑裂(多个节点实例提供写服务)等问题。
- Failover完成后,如果旧主库环境恢复,需要对其手动降备,切记不可直接OPEN,否则将出现双主、脑裂等问题。
- 最大保护模式下,或最大可用模式且同步状态正常的情况下,选择redo最多的备库执行Failover可以更大程度地避免数据丢失。
检查V$REPLICATION_STATUS视图中的received_lfn和gap_seq#字段:
如果gap_seq#都为0,选择received_lfn值最大的备库。
如果某个备库gap_seq#不为0,说明该备库缺少一些归档,升主后将丢失一部分数据,此时需要查看所有备库上的该视图,选择gap_seq#值最大且received_lfn值最大的备库。
-- 确认主备库的角色,为主库或备库 SELECT database_id,database_name,log_mode,open_mode,database_role FROM V$DATABASE; DATABASE_ID DATABASE_NAME LOG_MODE OPEN_MODE DATABASE_ROLE ------------ --------------- ------------ -------------- -------------- 569377301 yasdb ARCHIVELOG READ_ONLY STANDBY -- 确认备库连接已经断连,并且RECEIVED_LFN是剩余备库里最大的,GAP_SEQ#为0 SELECT connection,status,received_lfn,gap_seq# FROM V$REPLICATION_STATUS; CONNECTION STATUS RECEIVED_LFN GAP_SEQ# ----------------- ----------------- --------------------- ------------ DISCONNECTED NORMAL 1420 0
在被选定的备库上执行Failover,将备库激活为可读写状态。
ALTER DATABASE FAILOVER;
Failover执行成功后,确认备库的角色和open_mode读写模式。
open_mode值为READ_WRITE,database_role值为PRIMARY时,表示Failover操作成功,该备库已被升为新的主库。
SELECT database_id,database_name,log_mode,open_mode,database_role FROM V$DATABASE;
# 旧主库降备
Failover完成后,如果旧主库环境恢复,需要对其手动降备。
Warn:
启动旧主库时要严格按照手动降备的流程操作,确保旧主库先只启动到MOUNT状态并完成降备后再启动至OPEN状态。
如果选出新主库后,旧主库仍直接启动至OPEN状态再执行降备操作,可能会导致脑裂现象(即旧主库降为备库后变为NEED REPAIR状态)。
将旧主库实例启动到MOUNT状态。
# 启动旧主库(例如1-1)到mount状态 $ yasboot node start -c yashandb -n 1-1 -m mount
执行降备命令。
-- 旧主库降备 ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
OPEN数据库。
-- OPEN数据库 ALTER DATABASE OPEN; -- 查询角色已经转换 SELECT open_mode,database_role FROM V$DATABASE; OPEN_MODE DATABASE_ROLE ----------------- ----------------- READ_ONLY STANDBY
降备后,查看视图V$REPLICATION_STATUS中的connection和status可以确认新备库状态:
- 如果连接到了新主库,并且status为NORMAL,说明降备后的新备库状态正常。
- 如果status值为NEED REPAIR,说明发生了脑裂,新旧主库的redo和data有分歧。需要对旧主库进行快速修复或全量修复,具体操作请查阅备库异常修复。
- 如果status值为REDO MISMATCH,说明发生了脑裂,新旧主库的redo有分歧。可以使用alter system ignore standby mismatched redo快速修复新备库。
NEED REPAIR
通常情况下,旧主库降备后报NEED REPAIR的可能原因有:
在最大性能或最大可用模式下,旧主库宕机前存在部分redo暂未发送至备库。备库升主、旧主库降备后,旧主库会比新主库多出此部分redo,若此部分redo中包含已提交事务,则旧主库和新主库数据会不一致,旧主库无法直接作为新主库的备库,需要人工介入修复不一致状态。
在最大保护模式下,若所选备库并非redo最多的,旧主库降备连到新主库时可能报NEED REPAIR,其他备库连到新主库时也可能报NEED REPAIR。因此执行Failover操作时,应尽可能选择redo最多的备库。
REDO MISMATCH
REDO MISMATCH与NEED REPAIR类似,但不一致的redo相对较少且redo内容还未被应用到数据库文件中。因此可以直接丢弃不一致的redo,从分歧点开始接收和应用新主库的redo,实现快速修复。
# yasboot执行主备切换
YashanDB支持通过yasboot工具远端执行yasboot node switchover或yasboot node failover进行主备切换。