#主备切换

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完成后,主备库会重新进行连接,将出现短暂的网络断连。
  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检查主备库的角色是否已交换以及同步情况是否正常。

# Failover切换

Failover切换方式适用于主库损坏,或者服务器宕机等不可用时,必须立即进行故障切换,尽快恢复业务。

# 选择备库升主

在紧急状态下进行的故障切换可能会丢失数据,为尽可能降低损失,应该在多个备库中选择日志量最多的一个备库执行Failover。

Caution

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

# 旧主库降备

Failover完成后,如果旧主库环境恢复,需要对其手动降备。

Warn

启动旧主库时要严格按照手动降备的流程操作,确保旧主库先只启动到MOUNT状态并完成降备后再启动至OPEN状态

如果选出新主库后,旧主库仍直接启动至OPEN状态再执行降备操作,可能会导致脑裂现象(即旧主库降为备库后变为NEED REPAIR状态)。

  1. 将旧主库实例启动到MOUNT状态。

    # 启动旧主库(例如1-1)到mount状态
    $ yasboot node start -c yashandb -n 1-1 -m mount
    
  2. 执行降备命令。

    -- 旧主库降备
    ALTER DATABASE CONVERT TO PHYSICAL STANDBY;  
    
  3. 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进行主备切换。