#主备切换
YashanDB支持在主备机同步正常的情况下进行主备机的手动Switchover切换,也支持在主机异常的情况下进行备机的手动Failover切换,需要注意的是Failover手动切换在开启自动选举模式下不支持。
# Switchover切换
Switchover切换方式适用于主备机同步正常的情况,可选择任意一个备机执行操作,步骤如下:
1.检查主备机同步状态,确认主备机同步无异常,并确认主备机的角色。
--确认主备机的角色,为主机或备机
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
2.在备机中执行Switchover切换,此时主机的所有事务将被中断,且Switchover执行过程中,主机无法连接。
ALTER DATABASE SWITCHOVER;
3.切换完成后,按步骤1再次检查主备机的角色是否已经交换,以及同步情况是否正常。
Caution:
- Switchover过程中,主机已连接的会话将全部断连,并且主机不可连接新的会话,直到切换完成或失败。
- Switchover过程中,如果主备网络断连,切换将失败。
- 如果备机transport_lag或apply_lag不为0,即备机有待接收和回放的redo,Switchover过程可能时间较久,通过查询V$RECOVERY_PROGRESS视图查看剩余回放时间。
- Switchover完成后,主备机会重新进行连接,将出现短暂的网络断连。
# Failover切换
Failover切换方式适用于主机数据库损坏,或者服务器宕机等不可用时,必须立即进行故障切换,尽快恢复业务。
# 选择备机升主
在紧急状态下进行的故障切换可能会丢失数据,为尽可能降低损失,在多台备机中,应该选择日志量最多的一个备机执行Failover。
1.检查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
2.在被选定的备机上执行Failover,将备机激活为可读写状态。
ALTER DATABASE FAILOVER;
3.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;
Caution:
- Failover可能丢失数据,只能在主机故障的情况下进行,否则可能出现双主,脑裂( 多个节点实例提供写服务 )等问题。
- Failover之后,如果旧主机环境恢复,需要对其手动降备,切记不可直接OPEN,否则也将出现双主,脑裂问题。
- 最大保护模式,或最大可用模式且同步状态正常的情况下,选择redo最多的备机Failover,可以保证不发生数据丢失。
# 旧主机降备
Failover之后,如果旧主机环境恢复,需要对其手动降备。步骤如下:
1.将旧主机实例启动到MOUNT状态。
2.执行降备命令。
3.OPEN数据库。
##启动旧主机到mount状态
$ nohup yasdb mount &
--旧主机降备
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
--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可能是因为:
1.在最大性能或者最大可用模式下,旧主机宕机前,有一些redo没来得及发送到备机。备机升主,旧主机降备后,旧主机将比新主机多一些redo,这些redo中如果包含已提交事务,那么旧主机和新主机数据就会不一致,此时旧主机不能直接作为新主机的备机,而需要人工介入修复,处理这种不一致状态。
2.在最大保护模式下,如果选择的备机不是redo最多的那个,旧主机降备连到新主机时可能报NEED REPAIR,甚至其他备机连到新主机时也可能报NEED REPAIR,因此Failover应尽量选择redo最多的备机。
REDO MISMATCH
REDO MISMATCH和NEED REPAIR类似,只是不一致的redo较少,并且这些redo内容还未被应用到数据库文件中。因此这些redo可以直接丢弃,并从分歧点开始接收和应用新主机的redo,从而达到快速修复的目的。
# yasboot执行主备切换
单机部署中,上述命令可通过yasboot工具远端执行。
示例
#switchover
$ yasboot node switchover -c yashandb -n 4-1
#failover
$ yasboot node failover -c yashandb -n 4-1