前言:

        文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover),在主库、备库运行的ogg进程(经典模式)如何进行恢复。

        测试恢复场景:

        1 主备发生switchover切换,主库为ogg源端

        2 主备发生switchover切换,备库为ogg源端

        3 主备发生failover切换,主库为ogg源端

        4 主备发生failover切换,备库为ogg源端

        5 主备发生switchover切换,主库为ogg目标端

        6 主备发生failover切换,主库为ogg目标端

测试环境:

OGG软件:19.1.0.0.4

       源端:

               extract :ext_text

               pump :pum_test

        目标端:

                replicat:rep_test

恢复场景:

        1 主备发生switchover切换,主库为ogg源端

        发生主备switchover切换后,在主库的ogg源端extract进程会abend,出现01028错误

Oracle主备切换,ogg恢复方法(经典模式)-LMLPHP

        恢复方式一:直接在主备切换之后的新备库,也就是原环境直接通过抽取DG进行同步,switchover切换之后,主备的 log日志是连续的,所以只要在参数文件里面配置抽取DG模式即可

--在extract ext_test添加抽取ADG日志模式 
TRANLOGOPTIONS MINEFROMACTIVEDG
--如果使用DBLOGREADER模式访问,在ADG模式下不能使用要删除,通过配置asmuser访问asm实例
--在grid用户下测试可以访问asm实例
sqlplus sys/oracle@172.20.10.60:1521/+ASM as sysasm
--添加到extract的配置
tranlogoptions asmuser sys@172.20.10.61/+ASM,asmpassword oracle
--DDLOPTIONS ADDTRANDATA不能使用,需要删除
--启动进程
GGSCI> start EXT_TEST
--这时正常会出现报错遇到ADG角色转化,提示Alter Extract to SCN 1,098,590 and restart Extract
ERROR   OGG-02803  Encountered a Data Guard role transition. Alter Extract to SCN 1,098,590 and restart Extract, or recreate Extract with the correct number of threads at SCN 1,098,590.
--修改extract的捕获scn为报错显示的scn
GGSCI> ALTER EXTRACT ext_test  scn 1098590;
--再重新启动extract进程恢复正常,目标端不用操作
GGSCI> stats EXTRACT

        DG模式的参考配置文件

Oracle主备切换,ogg恢复方法(经典模式)-LMLPHP

        OGG-02803错误里面的scn是备库变成主库时的scn,可以通过alert日志查看SwitchOver after complete recovery through change 1098590,或者通过v$database视图的列STANDBY_BECAME_PRIMARY_SCN获取

        恢复方式二:在主备切换之后的新主库进行抽取,也就是在目标端新环境主库配置新的抽取进程

--关闭全部进程
GGSCI> info all
​
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
​
MANAGER     STOPPED                                           
EXTRACT     ABENDED     EXT_TEST    00:00:00      00:05:30    
EXTRACT     STOPPED     PUM_TEST    00:00:00      00:00:09    
--将安装目录打包拷贝到目标端
tar -cvf ogg.tar ogg/
scp -rp ogg.tar root@172.20.10.50:/u01/
--在目标端解压到相同路径下
tar xvf ogg.tar
--如果两边的数据库安装目录,实例名配置不一样,则修改配置文件里面的配置ORACLE_HOME,ORACLE_SID
--启动进程
GGSCI> start mgr 
GGSCI> start pum_test
GGSCI> start EXT_TEST
--这时正常会出现报错遇到ADG角色转化
2023-10-29 17:03:31  ERROR   OGG-02803  Encountered a Data Guard role transition. Alter Extract to SCN 1,220,815 and restart Extract, or recreate Extract with the correct number of threads at SCN 1,220,815.
--修改extract 的捕获scn
GGSCI> ALTER EXTRACT ext_test  scn 1220815
--启动
GGSCI> START EXTRACT EXT_TEST
 
--如果OGG的安装目录不一样,即dirdat的存放路径发生变化则需要修改extract,pump的exttrail文件路径
--extract进程
--修改配置文件里面的exttrail路径配置
--修改extract进程的exttrail文件路径
GGSCI> delete EXTTRAIL /u01/ogg/dirdat/eo
GGSCI> ADD EXTTRAIL /ogg/ogg/dirdat/eo, EXTRACT EXT_TEST
--pump进程保留当前读取的exttrail位置
GGSCI> info pum_test,detail
--重新创建投递进程pump,分配新的路径
GGSCI> delete PUM_TEST
GGSCI> add extract PUM_TEST, exttrailsource /ogg/ogg/dirdat/eo
GGSCI> add rmttrail /u01/ogg/dirdat/ro,extract PUM_TEST,MEGABYTES 1000
--如果exttrail没有保留全部的exttrail日志,即不是从0开始的,那么需要指定读取的序列
alter PUM_TEST,EXTSEQNO 10
--再启动进程

        如果由于日志线程不一样,导致进程异常的可以通过drop+add方式重建

GGSCI> DROP EXTRACT ext_test
GGSCI> ADD EXTRACT ext_test THREADS t BEGIN SCN s
GGSCI> START EXTRACT ext_test

        如果启动出现以下错误,注意要检查ogg方法asm实例的配置

        OGG-02829  Not able to establish initial position for SCN 0.1268918 (1268918)

Getting attributes for ASM file +FRA/dgocs/archivelog/2023_10_29/thread_1_seq_51.286.1151515025, 
SQL <BEGIN dbms_diskgroup.getfileattr('+FRA/dgocs/archivelog/2023_10_29/thread_1_seq_51.286.1151515025', :filetype, :filesize, :lblksize); END;>: (15056) 
ORA-15056: additional error message
ORA-15173: entry 'dgocs' does not exist in directory '/'
ORA-06512: at "SYS.X$DBMS_DISKGROUP", line 322

2 主备发生switchover切换,备库为ogg源端

       主备发生switchover切换,备库ogg源端会出现错误ERROR  OGG-02803  Encountered a Data Guard role transition. Alter Extract to SCN 1,125,395 and restart Extract, or recreate Extract with the correct number of threads at SCN 1,125,395.

Oracle主备切换,ogg恢复方法(经典模式)-LMLPHP

        恢复方式一:直接在主备切换之后的新主库,也就是原环境直接通过抽取主库进行同步,switchover切换之后,主备的 log日志是连续的,所以只要在参数文件里面配置抽取主库模式即可

--删除adg配置模式
ATRANLOGOPTIONS MINEFROMACTIVEDG
--添加主库模式的参数配置
--修改extract 的捕获scn为OGG-02803报错的scn
GGSCI> ALTER EXTRACT ext_test  scn 1125395
--重新启动
GGSCI> START EXTRACT ext1

        extract的参考配置文件

Oracle主备切换,ogg恢复方法(经典模式)-LMLPHP

        恢复方式二:在主备切换之后的新备库进行抽取,也就是在目标端新环境备库配置新的抽取进程

--关闭全部进程
GGSCI> info all
​
Program     Status      Group       Lag at Chkpt  Time Since Chkpt
​
MANAGER     STOPPED                                           
EXTRACT     ABENDED     EXT_TEST    00:00:00      00:05:30    
EXTRACT     STOPPED     PUM_TEST    00:00:00      00:00:09    
--将安装目录打包拷贝到目标端
tar -cvf ogg.tar ogg/
scp -rp ogg.tar root@172.20.10.50:/u01/
--在目标端解压到相同路径下
tar xvf ogg.tar
--如果两边的数据库安装目录,实例名配置不一样,则修改配置文件里面的配置ORACLE_HOME,ORACLE_SID
--启动进程
GGSCI> start mgr 
GGSCI> start pum_test
GGSCI> start EXT_TEST
--这时正常会出现报错遇到ADG角色转化
2023-10-29 17:03:31  ERROR   OGG-02803  Encountered a Data Guard role transition. Alter Extract to SCN 1,220,815 and restart Extract, or recreate Extract with the correct number of threads at SCN 1,220,815.
--修改extract 的捕获scn
GGSCI> ALTER EXTRACT ext_test  scn 1220815
--启动
GGSCI> START EXTRACT EXT_TEST
 
--如果OGG的安装目录不一样,即dirdat的存放路径发生变化则需要修改extract,pump的exttrail文件路径
--extract进程
--修改配置文件里面的exttrail路径配置
--修改extract进程的exttrail文件路径
GGSCI> delete EXTTRAIL /u01/ogg/dirdat/eo
GGSCI> ADD EXTTRAIL /ogg/ogg/dirdat/eo, EXTRACT EXT_TEST
--pump进程保留当前读取的exttrail位置
GGSCI> info pum_test,detail
--重新创建投递进程pump,分配新的路径
GGSCI> delete PUM_TEST
GGSCI> add extract PUM_TEST, exttrailsource /ogg/ogg/dirdat/eo
GGSCI> add rmttrail /u01/ogg/dirdat/ro,extract PUM_TEST,MEGABYTES 1000
--如果exttrail没有保留全部的exttrail日志,即不是从0开始的,那么需要指定读取的序列
GGSCI> alter PUM_TEST,EXTSEQNO 10
--再启动进程

3 主备发生failover切换,主库为ogg源端

        主备发生failover切换,通常是由于主库已经出现了极端的破坏,比如存储损坏,服务器损坏,导致主库已经无法正常启动,这时候的ogg只能在failover之后的主库上进行抽取

        恢复方式一:如果主库的ogg软件还保留,可以直接将主库的ogg软件直接拷贝到failover之后的主库      

--将安装目录打包拷贝到目标端
tar -cvf ogg.tar ogg/
scp -rp ogg.tar root@172.20.10.50:/u01/
--在目标端解压到相同路径下
tar xvf ogg.tar
--查看备库成为主库时的scn,STANDBY_BECAME_PRIMARY_SCN
SQL> select STANDBY_BECAME_PRIMARY_SCN
     from v$database;
​
STANDBY_BECAME_PRIMARY_SCN
--------------------------
                   1400705
​
--修改进程的scn为STANDBY_BECAME_PRIMARY_SCN
GGSCI> alter extract EXT_TEST scn 1400705
--如果两边的数据库安装目录,实例名配置不一样,则修改配置文件里面的配置ORACLE_HOME,ORACLE_SID
--启动进程
GGSCI> start mgr 
GGSCI> start pum_test
GGSCI> start EXT_TEST

          恢复方式二:安装新的ogg目录,重建extract,pump进程

--安装ogg软件
--配置mgr,extract,pump的配置文件
--重新添加extract
GGSCI> add extract EXT_TEST tranlog,begin now,threads 2
GGSCI> add exttrail /u01/ogg/dirdat/eo,extract EXT_TEST,megabytes 1000
--scn为STANDBY_BECAME_PRIMARY_SCN
GGSCI> alter extract EXT_TEST scn 1400705
--重新添加pump
GGSCI> add extract PUM_TEST, exttrailsource /u01/ogg/dirdat/eo
GGSCI> add rmttrail /u01/ogg/dirdat/ro,extract PUM_TEST,MEGABYTES 1000
--启动extract,pump进程
--replicat不用重建,rmtrail队列文件会自动往下产生

   4 主备发生failover切换,备库为ogg源端

        恢复方式:只能在新主库上抽取,所以将ogg配置的DG抽取模式修改为在主库抽取的配置

--删除adg配置模式
ATRANLOGOPTIONS MINEFROMACTIVEDG
--添加主库模式的参数配置
--查看切换的scn
SQL>select STANDBY_BECAME_PRIMARY_SCN
  2 from v$database
​
STANDBY_BECAME_PRIMARY_SCN
--------------------------
                   1475226
--修改extract 的捕获scn
GGSCI> ALTER EXTRACT ext_test  scn 1475226
--启动
GGSCI> START EXTRACT ext1

5 主备发生switchover切换,主库为ogg目标端

        主备发生switchover,replicat进程会出现报错OGG-01004  Aborted grouped transaction on TEST.T_20200308, Database error 16000 (OCI Error ORA-16000: database open for read-only access (status = 16000),

        由于ogg的目标端应用进程需要写入数据,所以不能在物理DG上运行

        恢复方式:将ogg拷贝到新主库进行应用        

--目录拷贝之前,记得要将源端的pump进程stop,确保应用端的trial日志没有再写入,再进行拷贝
--将安装目录打包拷贝到目标端
tar -cvf ogg.tar ogg/
scp -rp ogg.tar root@172.20.10.50:/u01/
--在目标端解压到相同路径下
tar xvf ogg.tar
--如果拷贝到新路径目录不一致
--要修改应用进程的trial路径
--先记录replicat进程的trail rba
GGSCI> info rep_test,detail
--再修改replicat的trial
GGSCI> alter replicat rep_test,exttrail /ogg/ogg/dirdat/ro
GGSCI> alter replicat rep_test EXTSEQNO 0, EXTRBA 1713507
--修改源端pump进程的目标IP为新环境IP
GGSCI> rmthost 172.20.10.100, mgrport 7810
--如果新环境的目录不一致,则修改配置文件
GGSCI> rmttrail /u01/ogg/dirdat/ro
--重新添加rmttrail
GGSCI> delete RMTTRAIL /u01/ogg/dirdat/ro, EXTRACT PUM_TEST
GGSCI> ADD RMTTRAIL /ogg/ogg/dirdat/ro, EXTRACT PUM_TEST
--启动replicat进程
GGSCI> stat rep_test

6 主备发生failover切换,主库为ogg目标端

        主备发生failover切换,通常是由于主库已经出现了极端的破坏,比如存储损坏,服务器损坏,导致主库已经无法正常启动,这时候的ogg只能在failover之后的主库上进行应用

        恢复方式一:将ogg拷贝到新主库进行应用

--目录拷贝之前,记得要将源端的pump进程stop,确保应用端的trial日志没有再写入,再进行拷贝
--将安装目录打包拷贝到目标端
tar -cvf ogg.tar ogg/
scp -rp ogg.tar root@172.20.10.50:/u01/
--在目标端解压到相同路径下
tar xvf ogg.tar
--如果拷贝到新路径目录不一致
--要修改应用进程的trial路径
--先记录replicat进程的trail rba
GGSCI> info rep_test,detail
--再修改replicat的trial
GGSCI> alter replicat rep_test,exttrail /ogg/ogg/dirdat/ro
GGSCI> alter replicat rep_test EXTSEQNO 0, EXTRBA 1713507
--修改源端pump进程的目标IP为新环境IP
GGSCI> rmthost 172.20.10.100, mgrport 7810
--如果新环境的目录不一致,则修改配置文件
GGSCI> rmttrail /u01/ogg/dirdat/ro
--重新添加rmttrail
GGSCI> delete RMTTRAIL /u01/ogg/dirdat/ro, EXTRACT PUM_TEST
GGSCI> ADD RMTTRAIL /ogg/ogg/dirdat/ro, EXTRACT PUM_TEST
--启动replicat进程
GGSCI> stat rep_test

        恢复方式二:安装一个新的OGG软件,重新配置replicat进程

--安装ogg软件
--配置mgr,replicat的配置文件
--重新添加replicat
GGSCI> dblogin userid ogg,password "go_20230_W506"
GGSCI> delete checkpointtable ogg.rep_chkpt
GGSCI> add checkpointtable ogg.rep_chkpt
GGSCI> add replicat rep_test,exttrail ./dirdat/ro,checkpointtable ogg.rep_chkpt
GGSCI> alter replicat rep_test, EXTSEQNO 0, EXTRBA 0
​
--修改源端pump进程的目标IP为新环境IP
GGSCI> rmthost 172.20.10.100, mgrport 7810
--如果新环境的目录不一致,则修改配置文件
GGSCI> rmttrail /u01/ogg/dirdat/ro
--重新添加rmttrail
GGSCI> delete RMTTRAIL /ogg/ogg/dirdat/ro, EXTRACT PUM_TEST
GGSCI> ADD RMTTRAIL /u01/ogg/dirdat/ro, EXTRACT PUM_TEST
--修改源端pump进程读取exttrail位点,读取的日志要在切换之前,这样数据才不会丢失
GGSCI> ALTER EXTRACT pum_test, EXTSEQNO 0, EXTRBA 0
--replicat进程添加数据冲突检查参数,要确保表有主键或者唯一键
HANDLECOLLISIONS
--启动replicat进程
GGSCI> stat rep_test
11-13 08:52