Oracle primary DB與standby DB之間是透過ADSL網路,有一次因為電信維修,中斷網路,時間還蠻長的。而在網路恢復之後,卻一直沒有恢復同步。
檢查standby DB的alert log,發現有下列的錯誤:
Media Recovery Waiting for thread 1 sequence 72754
Fetching gap sequence in thread 1, gap sequence 72754-72756
Mon Aug 02 19:52:33 2021
FAL[client]: Failed to request gap sequence
GAP - thread 1 sequence 72754-72756
DBID 259219464 branch 847381128
FAL[client]: All defined FAL servers have been attempted.
------------------------------------------------------------
Check that the CONTROL_FILE_RECORD_KEEP_TIME initialization
parameter is defined to a value that's sufficiently large
enough to maintain adequate log switch information to resolve
archivelog gaps.
------------------------------------------------------------
在standby DB執行下列的SQL,可以查詢到缺少的日誌
SQL> select * from v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
------- ------------- --------------
1 72754 72756
發生原因在於因為電信維修而網路中斷,所以沒有即時同步,但是primary DB的archive log又已經移至其他,所以standby DB於primary DB中找不到對應的日誌檔案72754、72755、72756
此時先將archive log(72754、72755、72756)複製到standby DB中,再將它們註冊到standby DB,standby DB就會開始恢復它們。
在standby DB輸入下列的語法來註冊
ALTER DATABASE REGISTER PHYSICAL LOGFILE '/tmp/PROD_72754.arc';
如果需要恢復的日誌檔很多,則可以改用下列的SQL來產生相應的語法:
select 'ALTER DATABASE REGISTER PHYSICAL LOGFILE ''/tmp/'||substr(name,35)||''';' from v$archived_log where SEQUENCE#>=72754 and SEQUENCE#<=72756 and thread#=1 and NAME<>'standby service name';
將缺少的日誌都補上後,standby DB就可以正常與primary DB同步了。
因為DB的作業平台是Solaris,所以附上scp的語法,記錄一下檔案傳遞的方法:
scp 來源檔案 <遠端帳號>@<遠端伺服器>:<遠端目錄>
例:scp PROD_72754.arc PROD_72754.arc oracle@192.168.1.22:/tmp,指令輸入之後,系統會提示要求密碼,密碼正確檔案就會開始傳輸
本文參考我的Blog:https://blog.twtnn.com/