由于主庫切換歸檔路徑導致的 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.
測試發現,在主庫上修改數據,在備庫上立即可以查詢到最新信息。
問題得到解決。