單例項歸檔空間佔滿故障模擬實驗

realkid4發表於2011-05-30

 

歸檔日誌(Archived Log File)是Oracle資料庫進行備份還原的重要要素之一。開啟歸檔模式(Archived Log Mode)、指定合理的備份計劃是生產資料庫環境的必要條件。

 

 

Oracle資料庫在執行中,會不斷的生成Redo Log(重做日誌記錄),當這些記錄生成後,會依據一定規則寫入到Online Redo Log File(線上重做日誌檔案中)。一般資料庫Online Redo Log會以多個組的形式進行迴圈切換,寫完一組Log切換switch到下一組Log。所謂的歸檔模式就是在切換結束之後,Oracle會將完成的Redo Log儲存在一個位置上,用於進行完全恢復使用。

 

 

系統不斷的執行,會生成大量的Redo Log記錄,在歸檔模式下不斷寫入的歸檔日誌量也會越來越多。通常設定的歸檔存放空間是有限制的,如果一旦寫滿就會發生資料庫暫時hange住的現象。下面透過實驗來模擬這個過程,並且解釋如果解決。

 

1、實驗環境構建

 

因為是模擬實驗,所以選擇Linux環境下的Oracle 11gR2進行。首先,要將系統調整為歸檔模式,並且檢查各種歸檔相關引數指標。

 

//檢查當前歸檔狀態(非歸檔模式)

SQL> archive log list

Database log mode              No Archive Mode

Automatic archival             Disabled

Archive destination            USE_DB_RECOVERY_FILE_DEST //預設的歸檔存放位置;

Oldest online log sequence     107

Current log sequence           109

 

//歸檔核心引數

SQL> show parameter db_recovery_file

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest                string      /u01/flash_recovery_area

db_recovery_file_dest_size           big integer  3852M

 

 

預設情況下,Oracle存放歸檔的位置是在引數db_recovery_file_dest指定的目錄下,安裝時候進行指定,通常是與$ORACLE_HOME相關路徑。當然,此外還有如log_archive_dest_n類引數指定的其他位置。本篇就不加以涉及了。

 

引數db_recovery_file_dest_size指定的是該目錄能夠存放的大小。這個引數的作用就是從Oracle資料庫層面對歸檔空間大小進行一定的限制。我們先從Linux檔案系統檢視該目錄空間使用。注意,通常該空間中還會保留一部分控制檔案controlfileonlinelog的備份。

 

//檢視目錄

[oracle@oracle11g ~]$ cd /u01/flash_recovery_area/WILSON/

[oracle@oracle11g WILSON]$ ls

controlfile  onlinelog

 

//檢視空間

[oracle@oracle11g WILSON]$ du -h

151M    ./onlinelog

9.4M    ./controlfile

160M    .

 

 

為了儘快看到實驗效果,手工調整該目錄引數。設定該目錄容量最大為300M

 

//該引數要求在重新啟動之後才能生效;

SQL> alter system set db_recovery_file_dest_size=300M scope=spfile;

System altered.

 

 

其次,就是透過重新啟動資料庫,切換到歸檔模式。切換歸檔模式通常需要在mount狀態實現。

 

--重新啟動並且切換到歸檔模式

[oracle@oracle11g onlinelog]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on Thu May 26 16:02:27 2011

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected.

//停止資料庫

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

 

//啟動到nomount狀態

SQL> startup nomount

ORACLE instance started.

 

Total System Global Area  414298112 bytes

Fixed Size                  1336904 bytes

Variable Size             314575288 bytes

Database Buffers           92274688 bytes

Redo Buffers                6111232 bytes

//進入mount狀態

SQL> alter database mount;

Database altered.

 

SQL> alter database archivelog;

Database altered.

 

//open資料庫

SQL> alter database open;

Database altered.

 

SQL> archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     107

Next log sequence to archive   109

Current log sequence           109

SQL>

//檢視引數已經被修改

SQL> show parameter db_recovery

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest                string      /u01/flash_recovery_area

db_recovery_file_dest_size           big integer 300M

 

 

 

2、檢查歸檔,構造故障環境

 

剛開始,歸檔日誌記錄v$archived_log中,是沒有任何記錄資訊的。

 

 

SQL> select recid from v$archived_log;

     RECID   

----------

 

 

進行一些DML操作之後,就會生成redo log記錄。同時,我們保持對db_recovery_file_dest目錄的容量監控。直到出現下面情況:

 

//檢查目錄容量

[oracle@oracle11g WILSON]$ du -h

151M    ./onlinelog

9.4M    ./controlfile

126M    ./archivelog/2011_05_26

126M    ./archivelog

285M    .

 

//此時v$archived_log記錄為

SQL> select recid, stamp, name, sequence# from v$archived_log;

 

     RECID      STAMP NAME                                  SEQUENCE#

---------- ---------- -------------------------------------------------------------------------------- - ----------

         1  752170209   &&/2011_05_26/o1_mf_1_109_6xw2q1rg_.arc  109 

         2  752170245   &&/2011_05_26/o1_mf_1_110_6xw2r574_.arc  110 

         3  752170247   &&/2011_05_26/o1_mf_1_111_6xw2r7t1_.arc   111 

         4  752170351   &&/2011_05_26/o1_mf_1_112_6xw2vggx_.arc  112 

         5  752170392   &&/2011_05_26/o1_mf_1_113_6xw2wpyb_.arc  113

         6  752170397   &&/2011_05_26/o1_mf_1_114_6xw2wwd6_.arc  114 

 

6 rows selected

 

說明:

篇幅原因,結果有剪裁,其中&&表示路徑:/u01/flash_recovery_area/WILSON/archivelog

 

 

此時,db_recovery_file_dest目錄已經接近容量限額300M。故障環境構造成功。

 

 

3Archive Redo Log寫滿故障現象

 

此時,我們觀察到如下幾個現象:

 

ü        進行所有DML等生成Redo Log操作,系統無響應

 

此時,任何會生成Redo Log記錄的操作,都不能獲取到響應。Online Redo Log要保證在被下次覆寫之前,完成歸檔操作。由於歸檔空間不能實現寫入,所以歸檔操作程式arch就被停止住,進而寫redo log的動作也會被block住。

 

ü        sys使用者外的普通使用者,連線失敗

 

當我們嘗試使用非sys使用者登入系統時,Oracle提出拒絕。

 

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 5 28 21:45:44 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

SQL> conn scott/tiger@wilson ;

ERROR:

ORA-00257: archiver error. Connect internal only, until freed.

 

//只能sys使用者登入;

SQL> conn sys/Sys@wilson as sysdba;

已連線。

 

 

ü        Alert_log中寫入錯誤資訊

 

此時觀察alert_log,可以看到錯誤提示。

 

 

--alert log資訊

Thu May 26 16:18:52 2011

Errors in file /u01/diag/rdbms/wilson/wilson/trace/wilson_arc3_5893.trc:

ORA-19815: WARNING: db_recovery_file_dest_size of 314572800 bytes is 100.00% used, and has 0 remaining bytes available.

Errors in file /u01/diag/rdbms/wilson/wilson/trace/wilson_arc3_5893.trc:

ORA-19809: limit exceeded for recovery files

ORA-19804: cannot reclaim 47672320 bytes disk space from 314572800 limit

ARC3: Error 19809 Creating archive log file to '/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_115_%u_.arc

 

 

 

 

4、解決問題

 

嘗試解決此型別問題,要根據不同的資料庫配置環境依據不同的方法來確定。如果是生產環境,可以考慮暫時擴大恢復區、或者直接刪除歸檔日誌之後全庫備份的策略。

 

 

刪除歸檔日誌的方式上,有一些注意方面。因為歸檔記錄是寫入進控制檔案Control File的,所以即使直接從檔案系統中刪除,Oracle資料庫也不會認為該檔案已經刪除。解決的方式就是使用RMAN工具。

 

 

[oracle@oracle11g trace]$ rman nocatalog

 

Recovery Manager: Release 11.2.0.1.0 - Production on Thu May 26 16:20:32 2011

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

RMAN> connect target /

 

connected to target database: WILSON (DBID=3851616883)

using target database control file instead of recovery catalog

//顯示歸檔日誌

RMAN> crosscheck archivelog all;

 

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=23 device type=DISK

validation succeeded for archived log

archived log file name=/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_109_6xw2q1rg_.arc RECID=1 STAMP=752170209

validation succeeded for archived log

archived log file name=/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_110_6xw2r574_.arc RECID=2 STAMP=752170245

validation succeeded for archived log

archived log file name=/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_111_6xw2r7t1_.arc RECID=3 STAMP=752170247

validation succeeded for archived log

archived log file name=/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_112_6xw2vggx_.arc RECID=4 STAMP=752170351

validation succeeded for archived log

archived log file name=/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_113_6xw2wpyb_.arc RECID=5 STAMP=752170392

validation succeeded for archived log

archived log file name=/u01/flash_recovery_area/WILSON/archivelog/2011_05_26/o1_mf_1_114_6xw2wwd6_.arc RECID=6 STAMP=752170397

Crosschecked 6 objects

 

 

刪除日誌。

 

//刪除當前日期之前的所有日誌;

RMAN> delete archivelog all completed before 'sysdate';

 

released channel: ORA_DISK_1

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=23 device type=DISK

List of Archived Log Copies for database with db_unique_name WILSON

=====================================================================

(篇幅原因,有省略

 

Do you really want to delete the above objects (enter YES or NO)? yes

Deleted 6 objects

(篇幅原因,有省略

 

RMAN>

 

此時,歸檔儲存日誌已經釋放。已經下降到安全範圍。

 

 

[oracle@oracle11g flash_recovery_area]$ du -h

151M    ./WILSON/onlinelog

9.4M    ./WILSON/controlfile

4.0K    ./WILSON/archivelog/2011_05_26

8.0K    ./WILSON/archivelog

160M    ./WILSON

160M    .

 

 

此時,普通使用者可以登入,其他故障現象消除。

 

//scott使用者登入;

SQL> conn scott/tiger@wilson;

已連線。

 

 

 

5、結論

 

本篇演示了最基本的歸檔空間滿引起hange住的情況和解決。從這個例子出發,我們可以得到如下經驗:

 

ü        不同的資料庫結構、用途和系統要求,恢復archived log寫滿的方案是不同的。針對不同的結構,指定出不同的解決策略方法;

ü        關注歸檔空間策略和儘早制定解決之道。在系統切換或者計劃切換到歸檔模式的那一刻起,就要開始針對歸檔日誌、空間的管理策略制度。同時,要保證時刻進行空間監控,不要等出現hange住,特別是生產環境業務峰期hange住再解決問題;

ü        對歸檔環境下的大規模dml操作要慎重,防止短時間內redo log歸檔生成失控;(筆者有此教訓)

ü        不要貿然rm掉歸檔,要關注整體的備份集合狀態和系統要求;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-696711/,如需轉載,請註明出處,否則將追究法律責任。

相關文章