#主备切换

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

  1. Switchover过程中,主机已连接的会话将全部断连,并且主机不可连接新的会话,直到切换完成或失败。
  2. Switchover过程中,如果主备网络断连,切换将失败。
  3. 如果备机transport_lag或apply_lag不为0,即备机有待接收和回放的redo,Switchover过程可能时间较久,通过查询V$RECOVERY_PROGRESS视图查看剩余回放时间。
  4. 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

  1. Failover可能丢失数据,只能在主机故障的情况下进行,否则可能出现双主,脑裂( 多个节点实例提供写服务 )等问题。
  2. Failover之后,如果旧主机环境恢复,需要对其手动降备,切记不可直接OPEN,否则也将出现双主,脑裂问题。
  3. 最大保护模式,或最大可用模式且同步状态正常的情况下,选择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