由于主库切换归档路径导致的 Oracle DG 无法同步问题的解决过程
由于主库切换归档路径导致的 Oracle DG 无法同步问题的解决过程
在上一篇文章中,由于 Oracle 数据库的归档日志空间耗尽导致客户端无法连接数据库。在解决的过程中临时修改了归档路径。后来通过修改参数db_recovery_file_dest_size
的值解决了问题。
但该操作导致DG
无法与主库同步。本文给出了该问题的解决思路与方法。
使用如下两条命令开启数据库同步:
alter database recover managed standby database cancel; -- 停止同步
alter database recover managed standby database using current logfile disconnect from session; -- 开启同步
查看主库的进程:
SQL> select process, status, sequence# from v$managed_standby;PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 116083
ARCH OPENING 116057
ARCH CLOSING 116085
ARCH CLOSING 116053
LNS WRITING 116086
查看备库的进程:
SQL> select process, status, sequence# from v$managed_standby;PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 116085
ARCH CLOSING 325777
ARCH CONNECTED 0
ARCH CLOSING 325778
MRP0 APPLYING_LOG 325395
RFS IDLE 0
RFS IDLE 0
RFS IDLE 116086
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 32577912 rows selected.
发现主库的进行和备库的进程大都是正常的,但是 MRP0
的 SEQUENCE#
与RFS
的SEQUENCE#
差异较大。在主库中写入数据,发现不能同步。比如在主库的表中添加数据,才从库中查询不到。在主库上多次执行alter system switch logfile;
命令切换日志,问题仍然不能解决。
由于时间太晚,操作暂停。
==========================================================================================
第二天(7月27日)上午十点,远程连接服务器查看备库的进程。
==========================================================================================
发现了下列异常(MRP0
进程的状态变成了WAIT_FOR_GAP
):
SQL> select process, status, sequence# from v$managed_standby;PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 325842
ARCH CLOSING 325843
ARCH CONNECTED 0
ARCH CLOSING 116143
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 116144
RFS IDLE 0
MRP0 WAIT_FOR_GAP 116056
RFS IDLE 0
RFS IDLE 32584413 rows selected.
查询 GAP
信息如下:缺少两个归档文件(对应的SEQUENCE#
分别为 116056-116057
)
SQL> SELECT * FROM V$ARCHIVE_GAP;THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------2 116056 116057
基本可以确定昨晚备库无法同步的原因:
因为昨天修改了归档的地址,导致修改归档地址之后生成的归档文件没有被传送到备库中,备库无法接收到这些归档文件,导致备库的数据确实,备库和主库不一致,导致无法同步。
解决方法如下:
步骤1:进入到主库中(节点1和节点2同时操作)修改后的归档地址,把归档日志文件复制到 DG
备库的归档目录中。
结果如下:
[oracle@dghisdb:/archive/DGHISDB/archivelog]$ll
total 4056012
-rw-r----- 1 oracle oinstall 16284160 Jul 26 22:33 1_325744_1109379972.dbf
-rw-r----- 1 oracle oinstall 34625024 Jul 26 22:33 1_325745_1109379972.dbf
-rw-r----- 1 oracle oinstall 351205888 Jul 26 22:33 1_325746_1109379972.dbf
-rw-r----- 1 oracle oinstall 148878848 Jul 26 22:33 1_325747_1109379972.dbf
-rw-r----- 1 oracle oinstall 803595776 Jul 26 22:33 1_325748_1109379972.dbf
-rw-r----- 1 oracle oinstall 426488320 Jul 26 22:33 1_325749_1109379972.dbf
-rw-r----- 1 oracle oinstall 45056 Jul 26 22:33 1_325750_1109379972.dbf
-rw-r----- 1 oracle oinstall 115200 Jul 26 22:33 1_325751_1109379972.dbf
-rw-r----- 1 oracle oinstall 10448384 Jul 26 22:33 1_325752_1109379972.dbf
-rw-r----- 1 oracle oinstall 1524736 Jul 26 22:33 1_325753_1109379972.dbf
-rw-r----- 1 oracle oinstall 1793024 Jul 26 22:33 1_325754_1109379972.dbf
-rw-r----- 1 oracle oinstall 14848 Jul 26 22:33 1_325755_1109379972.dbf
-rw-r----- 1 oracle oinstall 1974784 Jul 26 22:33 1_325756_1109379972.dbf
-rw-r----- 1 oracle oinstall 5120 Jul 26 22:33 1_325757_1109379972.dbf
-rw-r----- 1 oracle oinstall 16760832 Jul 26 22:33 1_325758_1109379972.dbf
-rw-r----- 1 oracle oinstall 734867968 Jul 26 22:33 2_116052_1109379972.dbf
-rw-r----- 1 oracle oinstall 387082752 Jul 26 22:33 2_116054_1109379972.dbf
-rw-r----- 1 oracle oinstall 1024 Jul 26 22:33 2_116055_1109379972.dbf
-rw-r----- 1 oracle oinstall 803034112 Jul 26 22:35 2_116056_1109379972.dbf
-rw-r----- 1 oracle oinstall 260406272 Jul 26 22:35 2_116057_1109379972.dbf
-rw-r----- 1 oracle oinstall 107520 Jul 26 22:35 2_116058_1109379972.dbf
-rw-r----- 1 oracle oinstall 111630848 Jul 26 22:35 2_116059_1109379972.dbf
-rw-r----- 1 oracle oinstall 2964992 Jul 26 22:35 2_116060_1109379972.dbf
-rw-r----- 1 oracle oinstall 32430080 Jul 26 22:35 2_116061_1109379972.dbf
-rw-r----- 1 oracle oinstall 209408 Jul 26 22:35 2_116062_1109379972.dbf
-rw-r----- 1 oracle oinstall 6656512 Jul 26 22:35 2_116063_1109379972.dbf
.......
步骤2:在备库上注册archive log
,对应的文件为:2_116056_1109379972.dbf
和2_116057_1109379972.dbf
-rw-r----- 1 oracle oinstall 803034112 Jul 26 22:35 2_116056_1109379972.dbf
-rw-r----- 1 oracle oinstall 260406272 Jul 26 22:35 2_116057_1109379972.dbf
执行如下命令注册archive log
:
alter database register logfile '/archive/DGHISDB/archivelog/2_116056_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116057_1109379972.dbf';
步骤3:执行注册日志的命令后重启数据库同步。
alter database recover managed standby database cancel; -- 停止同步
alter database recover managed standby database using current logfile disconnect from session; -- 开启同步
然后重新查看备库的进程:
SQL> select process, status, sequence# from v$managed_standby;PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 325842
ARCH CLOSING 325843
ARCH CONNECTED 0
ARCH CLOSING 116143
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 116144
RFS IDLE 0
MRP0 WAIT_FOR_GAP 116059
RFS IDLE 0
RFS IDLE 32584413 rows selected.
重新查询 GAP
信息如下:缺少 5 个归档文件(对应的SEQUENCE#
分别为 116059-116063
)
SQL> SELECT * FROM V$ARCHIVE_GAP;THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
---------- ------------- --------------2 116059 116063
步骤4:在备库上注册archive log
,对应的文件为:2_116059_1109379972.dbf
和2_116063_1109379972.dbf
-rw-r----- 1 oracle oinstall 111630848 Jul 26 22:35 2_116059_1109379972.dbf
-rw-r----- 1 oracle oinstall 2964992 Jul 26 22:35 2_116060_1109379972.dbf
-rw-r----- 1 oracle oinstall 32430080 Jul 26 22:35 2_116061_1109379972.dbf
-rw-r----- 1 oracle oinstall 209408 Jul 26 22:35 2_116062_1109379972.dbf
-rw-r----- 1 oracle oinstall 6656512 Jul 26 22:35 2_116063_1109379972.dbf
执行如下命令注册archive log
:
alter database register logfile '/archive/DGHISDB/archivelog/2_116059_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116060_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116061_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116062_1109379972.dbf';
alter database register logfile '/archive/DGHISDB/archivelog/2_116063_1109379972.dbf';
步骤5:执行注册日志的命令后重启数据库同步。
alter database recover managed standby database cancel; -- 停止同步
alter database recover managed standby database using current logfile disconnect from session; -- 开启同步
然后重新查看备库的进程:
SQL> select process, status, sequence# from v$managed_standby;PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 325842
ARCH CLOSING 325843
ARCH CONNECTED 0
ARCH CLOSING 116143
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 0
RFS IDLE 116144
RFS IDLE 0
MRP0 APPLYING_LOG 325810
RFS IDLE 0
RFS IDLE 32584413 rows selected.
重新查询 GAP
信息如下:
SQL> SELECT * FROM V$ARCHIVE_GAP;no rows selected
由于 GAP
信息为空,表示已没有缺少的归档日志。
步骤6:重启备库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.Total System Global Area 2.7793E+10 bytes
Fixed Size 2266504 bytes
Variable Size 3288337016 bytes
Database Buffers 2.4495E+10 bytes
Redo Buffers 7307264 bytes
Database mounted.
Database opened.
启动数据库同步:
alter database recover managed standby database using current logfile disconnect
查看备库的进程信息:发现MRP0
进程的状态已经变成APPLYING_LOG
,并且MRP0
进程的SEQUENCE#(325845)
与RFS
进程的SEQUENCE#(325845)
完全相同。
SQL> select process, status, sequence# from v$managed_standby;PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 325844
ARCH CONNECTED 0
ARCH CONNECTED 0
ARCH CLOSING 116144
RFS IDLE 0
RFS IDLE 0
RFS IDLE 325845
RFS IDLE 116145
RFS IDLE 0
RFS IDLE 0
MRP0 APPLYING_LOG 32584511 rows selected.
测试发现,在主库上修改数据,在备库上立即可以查询到最新信息。
问题得到解决。