場景:
SQL> alter system archive log current;
alter system archive log current
*
第 1 行出現錯誤:
ORA-16014: 日志 2 sequence# 34 未歸檔, 沒有可用的目的地
ORA-00312: 聯機日志 2 線程 1: '+DATA_DG/orcl/onlinelog/group_2.258.885126161'
ORA-00312: 聯機日志 2 線程 1: '/orabak/clog/orcl02.log'
環境是個人的實驗環境。
排查:
切日志時發現該日志無法歸檔了,然後進行以下排查
1. 檢查日志格式,確定日志格式log_archive_format正確
2. 檢查日志歸檔目錄正常,包括位置、權限、可用空間,確定無誤
3. 查看錯誤日志
cat /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_18338.trc
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
DDE: Problem Key 'ORA 313' was flood controlled (0x1) (no incident)
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
Initial buffer sizes: read 1024K, overflow 832K, change 805K
DDE: Problem Key 'ORA 313' was flood controlled (0x1) (no incident)
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
可以看到內存有一定溢出
分析:
經過排查可以確定是日志本身出現了問題,比較官方的解釋如下
ORA-01624: log string needed for crash recovery of instance string (thread string).
Cause: A log cannot be dropped or cleared until the thread's checkpoint has advanced out of the log..
Action: If the database is not open, then open it. Crash recovery will advance the checkpoint. If the database is open force a global checkpoint. If the log is corrupted so that the database cannot be opened, it may be necessary to do incomplete recovery until cancel at this log.
大概意思是檢查點進程在一直在處理該文件,不能被刪除或清除其內容,類似於卡死,可以通過recover來恢復。通過錯誤日志,我們推測該問題很有可能是因為內存溢出造成的。
查看內存:
[root@rac1 ~]# free -m
total used free shared buffers cached
Mem: 1878 1736 142 0 6 683
-/+ buffers/cache: 1045 832
Swap: 3999 354 3645
空閒內存不足,並且swap分區發生了交換,確實內存不足。
解決方案:
數據庫有rman備份,啟動到mount狀態進行recover.
SQL>shutdown immediate
SQL>startup mount;
SQL>recover
ORA-00283: 恢復會話因錯誤而取消
ORA-00264: 不要求恢復
SQL>alter database open;
數據庫已更改。
SQL>alter system archive log current;
系統已更改。
回顧:
recover的時候報錯了,但庫啟動後可以歸檔,並且是無損恢復,數據沒有任何的丟失。那麼這個過程發生了什麼?
recover會讀取日志文件、undo等文件,進行數據庫事務的回滾前滾等操作,而在open數據庫的時候還會對數據庫文件的一致進行處理。
查看alert可以看到以下過程
Thread 2 advanced to log sequence 33 (before internal thread enable)
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_18338.trc:
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_18338.trc:
ORA-00313: 無法打開日志組 4 (用於線程 2) 的成員
Archived Log entry 56 added for thread 2 sequence 32 ID 0xb9a2cd8c dest 1:
Thread 2 advanced to log sequence 34 (after internal thread enable)
Wed Jul 22 18:28:47 2015
ARC2 started with pid=35, OS id=18513
Wed Jul 22 18:28:47 2015
Thread 1 opened at log sequence 39
Current log# 1 seq# 39 mem# 0: +DATA_DG/orcl/onlinelog/group_1.257.885126161
Current log# 1 seq# 39 mem# 1: /orabak/clog/orcl01.log
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Wed Jul 22 18:28:47 2015
SMON: enabling cache recovery
Instance recovery: looking for dead threads
Instance recovery: lock domain invalid but no dead threads
ARC1: Archival started
可以看到Oracle進行了緩存的恢復並對死進程進行了處理。