程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORA-16014與ORA-00312

ORA-16014與ORA-00312

編輯:Oracle教程

ORA-16014與ORA-00312


場景:

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進行了緩存的恢復並對死進程進行了處理。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved