#闪回恢复数据库

闪回可以回退指定时间跨度期间内除数据文件外的几乎一切数据库操作

根据需要闪回的对象,本文将操作步骤分为以下场景:

  • 闪回整个数据库(若为主备高可用部署,则主备库均会回退)

    当YashanDB部署为容器数据库(配置参数ENABLE_PLUGGABLE_DATABASE=TRUE)时,“闪回整个数据库”延申为“闪回根容器”(即登录根容器进行操作)或“闪回某个PDB”(即登录某个PDB进行操作)。

  • 闪回主备高可用部署中的指定备库

    在主备集群部署中,“备库”延申为“备集群”,后文可能直接以“备库”代称。

存算一体分布式集群部署中暂无全库闪回功能。

# 闪回整个数据库

闪回整个数据库的过程中,可能会影响数据库的持续运行:

  • 若为单机单库或单集群部署,需启动/重启数据库至MOUNT阶段。

  • 若为主备高可用部署,需先启动/重启主库至MOUNT阶段进行闪回,主库闪回完成后需闪回所有备库以保持同步。且备库闪回的目标时间点T2不得晚于主库闪回所抵达的目标时间点T1,否则会发生主备脑裂问题。

    • T2 = T1:正常

    • T2早于T1:正常,且备库会自动追平主库

    • T2晚于T1:主备脑裂,备库将被置于need repair状态

    Note:

    在主备集群部署中,“主库”延申为“主集群”,后文可能直接以“主库”代称。

# 前提条件

  • 确保数据库(或主库)已开启全库闪回功能,可通过查询V$DATABASE视图的FLASHBACK_ON字段确认是否开启。

  • 已确认闪回目标时间点(即恢复至哪个时间点),并获取该时间点对应的SCN、时间戳或还原点信息。

    • 通过时间戳或SCN进行全库闪回时,可闪回恢复到的最早时间点获取方法可参考可恢复到的时间范围

    • 通过还原点进行全库闪回时,需先创建还原点并获取目标时间点对于的还原点名称。

  • 在主备高可用部署中,还需确认备库是否已开启全库闪回功能、能否闪回至上述目标时间点。确认结果将决定后续将备库与主库追平的操作方法:

    • 若全为是,则可直接通过备库原位闪回进行追平。

    • 否则,需重建备库(BUILD DATABASE)。

# 操作步骤

# 步骤1:临时关闭自动选主

仅在采用主备高可用部署且数据库处于非关闭状态的环境中,需要执行本操作。

  • 以安装用户登录主库/主集群任一实例所在服务器,检查并关闭yasom仲裁选主

    # 检查yasom仲裁选主是否开启(回显信息仅供参考)
    $ yasboot election config show -c yashandb
    group 1
       Protection Mode: MAXIMUM PROTECTION
       Members:
         [1-1:1] - Primary database
           [1-2:2] - Physical standby database
                       Transport Lag: 0 seconds
                       Apply Lag:     0 seconds
                       Apply Rate:    3.79 MByte/s
    
       Properties:
         FailoverThreshold      = 9
         FailoverAutoReinstate  = false
         ZeroDataLossMode       = true
    
    Automatic Failover: Enabled in Zero Data Loss Mode # Enabled表示已开启yasom仲裁选主
    
    # 若已开启,关闭yasom仲裁选主
    $ yasboot election enable off -c yashandb
    
  • 以安装用户登录主库/主集群任一实例所在服务器,检查并关闭自动选主

    # 检查自动选主是否开启(回显信息仅供参考)
    $ yasboot cluster config show -c yashandb -q HA_ELECTION_ENABLED
    +------------------------------+
    | node   | HA_ELECTION_ENABLED |
    +------------------------------+
    | db-1-1 | TRUE                |
    +--------+---------------------+
    | db-1-2 | TRUE                |
    +--------+---------------------+
    # TRUE表示已开启自动选主
    
    # 若已开启,需关闭自动选主
    $ yasboot cluster config set -c yashandb -k HA_ELECTION_ENABLED -v FALSE
    

# 步骤2:启动/重启数据库至MOUNT阶段

  1. 以安装用户登录目标节点所在服务器。

  2. 启动/重启数据库(或主库)至MOUNT阶段。

    Note:

    不同部署形态的操作存在一定差异。在同一种部署形态下,非租户环境与多租户根容器的操作完全一致,但在多租户环境中,PDB的操作步骤与根容器有所不同。

    $ yasboot cluster restart -c yashandb -m mount
    
  3. 以sys用户连接并登录目标PDB。

  4. 查看数据库状态。

    SELECT status FROM V$INSTANCE;
    
    STATUS
    -------------
    MOUNTED
    

# 步骤3:执行全库闪回

  1. 根据目标时间点相关信息执行全库闪回:

    -- 场景1:基于还原点闪回
    FLASHBACK DATABASE TO RESTORE POINT G20241201_01;
    
    -- 场景2:基于SCN闪回
    FLASHBACK DATABASE TO SCN 725539138356854784;
    
    -- 场景3:基于时间戳闪回
    FLASHBACK DATABASE TO TIME '2025-08-12 11:58:05.847545';
    
  2. 启动数据库(或主库)并重置redo时间线。

    ALTER DATABASE OPEN RESETLOGS;
    

# 步骤4:备库追平主库

仅在采用主备高可用部署中,需要执行本操作。

  1. 根据实际情况选择备库与主库追平的方法:

    • 若备库已开启闪回功能且能闪回至不晚于步骤3中主库闪回的时间点,则可通过闪回备库至目标时间点进行追平,具体操作请查阅备库原位闪回

    • 若备库未开启闪回功能、或无法闪回至目标时间点,则只能通过重建备库(BUILD DATABASE)进行追平。

  2. 若在步骤1中临时关闭了自动选主功能,还需进行配置还原。

    SQL> exit
    
    # 如需还原yasom仲裁选主相关配置
    $ yasboot election enable on -c yashandb
    
    # 如需还原自动选主相关配置
    $ yasboot cluster config set -c yashandb -k HA_ELECTION_ENABLED -v TRUE
    

# 闪回备库

在高可用部署中,闪回备库需根据实际运维需求选择对应场景,不同场景的操作步骤存在差异,具体分类及说明如下:

  • 备库原位闪回:在不改变现有主备架构的前提下,单独对备库执行闪回操作,闪回过程中主备同步关系保持不变,主库正常运行、业务写入不受任何影响。适用场景主要包括:

    • 主库闪回的后置操作或备库脑裂恢复:当备库出现脑裂现象(主库闪回后所有备库脑裂),导致主备数据同步异常时,通过备库原位闪回至脑裂发生前的正常状态,快速恢复主备同步关系。

    • 数据恢复验证:主库发生误操作、数据损坏后,在备库执行闪回操作,验证数据恢复的可行性和完整性,为后续主库数据恢复提供依据,避免影响主库业务。

    • 历史数据捞回:主库发生误删、误改数据等操作后,在不中断主库运行和业务写入的前提下,通过闪回备库至数据丢失前的时间点,提取误操作前的历史版本数据,再导入主库完成数据恢复。

  • 备库演练校准闪回:部分场景下需将目标备库从主备架构中临时脱离(解除与主库的同步关系),单独执行数据操作(例如业务模拟、测试等)。操作完成后若需重新加入主备架构,可通过闪回修复其主备同步状态。

    建议仅在一主多备部署中进行备库临时脱离,适用场景主要包括:

    • 主备业务模拟演练:在业务低峰期,将某个备库脱离主备架构,利用脱离后的备库模拟后续重要业务操作(例如系统升级、大批量数据导入、业务流程变更等),提前识别操作风险、验证业务兼容性。演练完成后,再将该备库重新加入主备架构,整个过程不影响主库正常业务运行。

# 备库原位闪回

# 前提条件

  • 确保目标备库已开启全库闪回功能,可通过查询V$DATABASE视图的FLASHBACK_ON字段确认是否开启。

  • 已确认闪回恢复至哪个时间点,并获取该时间点对应的SCN、时间戳或还原点信息:

    • 通过时间戳或SCN进行全库闪回时,可闪回恢复到的最早时间点获取方法可参考可恢复到的时间范围

    • 通过还原点进行全库闪回时,需先创建还原点并获取目标时间点对于的还原点名称。

# 操作步骤

  1. 以安装用户登录目标节点所在服务器。

  2. 启动/重启目标备库(或实例)至MOUNT阶段。

    Note:

    不同部署形态的操作存在一定差异。在同一种部署形态下,非租户环境与多租户根容器的操作完全一致,但在多租户环境中,PDB的操作步骤与根容器有所不同。

    # 查看数据库信息,获取目标实例的nodeid
    $ yasboot cluster status -c yashandb -d
    
    # 重启目标备库
    $ yasboot node restart -c yashandb -n 1-2 -m mount
    
  3. 以sys用户连接并登录目标PDB。

  4. 查看数据库状态。

    SELECT status FROM V$INSTANCE;
    
    STATUS
    -------------
    MOUNTED
    
  5. 根据目标时间点相关信息执行闪回:

    -- 场景1:基于还原点闪回
    FLASHBACK DATABASE TO RESTORE POINT G20241201_01;
    
    -- 场景2:基于SCN闪回
    FLASHBACK DATABASE TO SCN 725539138356854784;
    
    -- 场景3:基于时间戳闪回
    FLASHBACK DATABASE TO TIME '2025-08-12 11:58:05.847545';
    
  6. 启动目标备库(或实例)。

    ALTER DATABASE OPEN;
    
  7. 开启目标备库的redo日志回放功能。

    ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;
    
  8. 检查主备状态是否正常。

    SELECT THREAD#,CONNECTION,STATUS,PEER_ROLE,PEER_ADDR FROM V$REPLICATION_STATUS;
    
  9. 若在主备集群部署中,还需启动目标集群的其他实例。

    SQL> exit
    
    # 查看数据库信息,获取目标实例的nodeid
    $ yasboot cluster status -c yashandb -d
    
    # 启动当前集群的其他实例,例如:
    $ yasboot node start -c yashandb -n 2-2
    

# 后续操作

备库闪回后不会清理归档日志文件和redo文件,可按需进行管理,例如清理不必要的归档日志文件

# 备库演练校准闪回

# 步骤1:选定并准备演练备库

  1. 以DBA用户连接并登录数据库。

  2. 查看数据库的保护模式和主备链路配置等信息,选定执行演练操作的备库(后文将其称为“演练备库”)。

    -- 查看ARCHIVE_DEST_n配置
    SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME LIKE 'ARCHIVE_DEST_%' AND VALUE IS NOT NULL;
       
    NAME                                                             VALUE                                                  
    ---------------------------------------------------------------- ----------------------------------------------------------------
    ARCHIVE_DEST_2                                                   SERVICE=192.168.1.3:1688 NODE_ID=1-2:2
    ARCHIVE_DEST_3                                                   SERVICE=192.168.1.4:1688 NODE_ID=1-3:3
       
    -- 查看保护模式
    SELECT PROTECTION_MODE,PROTECTION_LEVEL FROM V$DATABASE;
    PROTECTION_MODE                                                  PROTECTION_LEVEL                                       
    ---------------------------------------------------------------- ----------------------------------------------------------------
    MAXIMUM PROTECTION                                               MAXIMUM PROTECTION
       
    -- 若保护模式为MAXIMUM PROTECTION,还需查看同步备
    SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME = 'REQUIRED_SYNC_STANDBYS' OR NAME = 'QUORUM_SYNC_STANDBYS';
       
    NAME                                                             VALUE
    ---------------------------------------------------------------- ----------------------------------------------------------------
    QUORUM_SYNC_STANDBYS                                             MAJORITY
    REQUIRED_SYNC_STANDBYS
    

    根据配置信息选择执行业务演练的操作节点(本文以备库1-3为例),建议选择未被明确定义为同步备的备库节点,以简化操作。另外,请记录上述配置信息,执行完演练操作后还需还原相应配置。

  3. 主库上执行以下操作,临时解除主库与演练备库的关联。

    1. ) 以DBA用户连接并登录目标节点。

    2. ) 根据去掉演练备库1-3后的主备规模调整保护模式和同步备配置。

      -- 场景1:仅剩主库,则改为最大性能
      ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
      
      -- 场景2:还剩1主1备,则改为最大可用
      ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
      
      -- 场景3:若还剩1主多备,则无需调整保护模式
      -- 但需确保备库1-3未被显式指定为同步备
      SELECT NAME,VALUE FROM V$PARAMETER WHERE NAME = 'REQUIRED_SYNC_STANDBYS' OR NAME = 'QUORUM_SYNC_STANDBYS';
      
      -- 若备库1-3被显式指定为同步备库,则还需调整对应参数
      
  4. 演练备库上执行以下操作,临时解除其与主库的关联。

    1. ) 以DBA用户连接并登录目标节点。

    2. ) 查看REPLICATION_ADDR、ARCHIVE_DEST_n和REQUIRED_SYNC_STANDBYS参数配置并记录参数值,再将这些参数全部置空。

      -- REPLICATION_ADDR
      SHOW PARAMETER REPLICATION_ADDR;
      ALTER SYSTEM SET REPLICATION_ADDR ='' SCOPE=SPFILE;
      
      -- ARCHIVE_DEST_n
      SELECT name,value FROM V$PARAMETER WHERE ( NAME LIKE 'ARCHIVE_DEST_%' ) AND ( value IS NOT NULL );
      -- 根据查询结果依次清空所有ARCHIVE_DEST_n的值
      ALTER SYSTEM SET ARCHIVE_DEST_1 ='' SCOPE=BOTH;
      ALTER SYSTEM SET ARCHIVE_DEST_2 ='' SCOPE=BOTH;
      ……
      
      -- REQUIRED_SYNC_STANDBYS
      SHOW PARAMETER REQUIRED_SYNC_STANDBYS;
      -- 若参数值不为空则置空
      ALTER SYSTEM SET REQUIRED_SYNC_STANDBYS ='' SCOPE=BOTH;
      
    3. ) 以安装用户登录目标节点所在服务器,重启演练备库使配置生效。

      $ yasboot node restart -c yashandb -n 1-3
      

# 步骤2:演练备库完成闪回基础配置

  1. 以安装用户登录目标节点所在服务器:

    • 单机(主备)部署:演练备库

    • 主备集群部署:演练备集群的master实例

  2. 以sys用户连接并登录目标节点。

  3. 检查并确保全库闪回功能已开启。

    SELECT FLASHBACK_ON FROM V$DATABASE;
    
    FLASHBACK_ON
    -----------------
    NO
    -- FLASHBACK_ON = NO表示暂未开启闪回,可按需执行后续操作将其开启。
    -- FLASHBACK_ON = YES表示已开启闪回。
    
    -- 开启闪回
    ALTER DATABASE FLASHBACK ON;
    
  4. 将演练备库的角色切换为主,切换后数据库会自动创建还原点。

    -- 查看当前已有还原点
    SELECT NAME,SCN,IS_GUARANTEE FROM V$RESTORE_POINT;
    
    -- 切换其角色
    ALTER DATABASE FAILOVER;
    
    -- 再次查看还原点,并记录新还原点的名称用于后续的闪回操作
    SELECT NAME,SCN,IS_GUARANTEE FROM V$RESTORE_POINT;
    
    -- 若未自动创建还原点,可手动创建
    CREATE RESTORE POINT G202412011100 GUARANTEE FLASHBACK DATABASE;
    

# 步骤3:执行演练业务

在演练备库上,执行相应的演练业务。

# 步骤4:还原高可用配置

  1. 演练备库上执行以下操作,使其恢复至主备架构中。

    1. ) 以安装用户登录目标节点所在服务器:
    • 单机(主备)部署:演练备库

    • 主备集群部署:演练备集群的master实例

    1. )启动/重启目标备库(或实例)至MOUNT阶段。

    Note:

    不同部署形态的操作存在一定差异。在同一种部署形态下,非租户环境与多租户根容器的操作完全一致,但在多租户环境中,PDB的操作步骤与根容器有所不同。

    # 查看数据库信息,获取目标实例的nodeid
    $ yasboot cluster status -c yashandb -d
    
    # 重启目标备库
    $ yasboot node restart -c yashandb -n 1-3 -m mount
    
    1. ) 以sys用户连接并登录演练备库。

    2. ) 还原演练备库上的REPLICATION_ADDR、ARCHIVE_DEST_n或REQUIRED_SYNC_STANDBYS等参数的配置至前序操作中所记录的值。

    3. ) 再次重启演练备库至MONUT阶段,使配置生效。

    4. ) 将演练备库强制降备。

      ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
      
  2. 主库上执行以下操作,使演练备库恢复至主备架构中。

    1. ) 以DBA用户连接并登录数据库。

    2. ) 还原主库上的保护模式或同步备相关配置至前序操作中所记录的值。

# 步骤5:闪回备库

  1. 将演练备库闪回至步骤2中记录的还原点。

    FLASHBACK DATABASE TO RESTORE POINT G202501011000;
    
  2. 检查主备状态是否正常。

    SELECT THREAD#,CONNECTION,STATUS,PEER_ROLE,PEER_ADDR FROM V$REPLICATION_STATUS;
    
  3. 启动演练备库(或演练备集群的当前实例)至OPEN状态。

    ALTER DATABASE OPEN;
    
  4. 若在主备集群部署中,还需启动演练备集群的其他实例。

    SQL> exit
    
    # 查看数据库信息,获取目标实例的nodeid
    $ yasboot cluster status -c yashandb -d
    
    # 启动当前集群的其他实例,例如:
    $ yasboot node start -c yashandb -n 2-2
    

# 后续操作

备库闪回后不会清理归档日志文件和redo文件,可按需进行管理,例如清理不必要的归档日志文件

edit-icon
反馈
coperate-icon
coperate
合作
communication-icon
communicate
交流