Oracle主从incarnation不一致问题解决

问题描述

在建立ADG主从库时,有时会出现主从化身不一致的问题,导致从库只能同步日志,而无法对日志进行应用。

2025年8月9日,历经36个小时的同步,ADG终于是搭建好了。

2025年8月11日,发现从库停止了日志应用,并比主库多了一个化身

从库已经从READ ONLY WITH APPLY 变回了 READ ONLY状态

查看当前数据库化身

复制代码
list incarnation;

思路:

  1. 核对主从归档日志
  2. 通过主库重建控制文件
  3. 从库重新开启日志应用

解决步骤:

  1. 关闭从库

    复制代码
    shutdown immediate;
  2. 检查归档日志,必须与主库一致

    查看归档日志目录:

    复制代码
    SHOW PARAMETER LOG_ARCHIVE_DEST;

    这次我的归档日志就少了一个,需要从主库传一个下来

  3. 主库生成standby控制文件,并传输至备库

    复制代码
    ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby_controlfile.ctl';

    将生成的控制文件利用scp传输到备库

    复制代码
    scp /tmp/standby_controlfile.ctl oracle@192.168.0.14:/home/app/oracle/12.2.0/oradata/bserpdbdgol/
  4. 备库修改配置文件

    把从库原来的.ctl文件删掉

    在配置文件中,把配置文件的路径也修改了

    复制代码
    vim initbserpdb1.ora
    
    *.control_files='/home/app/oracle/12.2.0/oradata/bserpdbdgol/standby_controlfile.ctl'
  5. 备库利用配置文件启动到nomount状态

    复制代码
    startup pfile='/home/app/oracle/12.2.0/db/dbs/initbserpdb1.ora' nomount;
  6. 切换从库为mount状态

    复制代码
    alter database mount;
  7. 确认从库角色为STANDBY后开库

    复制代码
    SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
    
    DATABASE_ROLE
    ----------------
    PHYSICAL STANDBY
    
    --启动MRP0日志应用
    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
    
    Database altered.
    
    --查看MRO0进程
    SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;
    
    PROCESS   STATUS	  THREAD#  SEQUENCE#	 BLOCK#     BLOCKS
    --------- ------------ ---------- ---------- ---------- ----------
    ARCH	  CLOSING		1      60284	 151552       1798
    DGRD	  ALLOCATED		0	   0	      0 	 0
    DGRD	  ALLOCATED		0	   0	      0 	 0
    ARCH	  CONNECTED		0	   0	      0 	 0
    ARCH	  CONNECTED		0	   0	      0 	 0
    ARCH	  CONNECTED		0	   0	      0 	 0
    RFS	    IDLE			0	   0	      0 	 0
    RFS	    RECEIVING		1      60283	 176129       2048
    RFS	    IDLE			0	   0	      0 	 0
    MRP0	  WAIT_FOR_GAP		1      60255	      0 	 0
    RFS	    RECEIVING		1      60255	  63489       2048
    
    11 rows selected.
    
    --查询数据库模式
    SQL> select open_mode from v$database; 
    
    OPEN_MODE
    --------------------
    MOUNTED
  8. 从库模式切换

    以上的步骤已经恢复了DG库的同步与日志应用,但却只能作为物理备库,无法提供查询服务

    从库仅用于日志应用(不对外提供查询服务),**MOUNTED**是正常的运行模式

    需要从库同时支持日志应用和只读查询,则可将其切换为 READ ONLY WITH APPLY 模式

    复制代码
    --开库
    alter database open;
    
    --查看模式
    SQL> select open_mode from v$database; 
    OPEN_MODE
    --------------------
    READ ONLY
    
    --启动日志应用进程
    SQL> alter database recover managed standby database disconnect; 
    
    Database altered.
    
    --验证模式
    
    SQL> select open_mode from v$database; 
    
    OPEN_MODE
    --------------------
    READ ONLY WITH APPLY
    
    --查看从库化身
    RMAN> list incarnation;
    
    List of Database Incarnations
    DB Key  Inc Key DB Name  DB ID            STATUS  Reset SCN  Reset Time
    ------- ------- -------- ---------------- --- ---------- ----------
    1       1       BSERPDB1 3574684876       PARENT  1890391    022-01-20 12.47.23
    2       2       BSERPDB1 3574684876       PARENT  9370202    022-03-15 09.34.13
    3       3       BSERPDB1 3574684876       CURRENT 11641114   022-03-31 10.34.18