ORA-1122/ORA-1208 資料檔案頭寫丟失故障

darren__chan發表於2018-10-17


一、 資料庫告警日誌09:22分出現報錯:

Thu Feb 25 09:22:04 2016

Errors in file /opt/oracle/app/oracle/diag/rdbms/cspora/cspora10/trace/cspora10_ckpt_165762.trc:

ORA-01171: datafile 163 going offline due to error advancing checkpoint

ORA-01122: database file 163 failed verification check

ORA-01110: data file 163: '/dev/rlv_index062'

ORA-01208: data file is an old version - not accessing current version

 

資料庫alert log報錯ORA-1122/ORA-1208

CKPT 程式執行checkpoint時檢查資料檔案header記錄的SCN值是否與控制檔案中記錄的資料檔案header的SCN值同步,如果發現控制檔案內容與資料檔案內容一致,那麼將最新checkpoint scn寫人控制檔案和資料檔案header,如果發現不一致,那麼會報錯ORA-1122/ORA-1208。

我們以第一個出現問題的資料檔案#163為例分析: 
ORA-1208
說明控制檔案中記錄的資料檔案#163的Checkpoint scn (scn: 0x0b5b.4b96748e (十進位制12486738080910) 02/25/2016 09:00:40) 大於資料檔案#163 header的Checkpoint scn (scn: 0x0b5b.4b819fa1 (十進位制12486736715681) 02/25/2016 07:31:25). 
資料檔案#163 header中記錄的Checkpoint scn 是一個比較舊的值。 

透過CKPT trace檔案可以說明資料檔案#163 header中記錄的Checkpoint是一箇舊的值: 

*** 2016-02-25 09:22:03.942 
V10 STYLE FILE HEADER:    File Number=163, Blksiz=8192, File Type=3 DATA 
Checkpointed at scn:  0x0b5b.4b819fa1 02/25/2016 07:31:25 <==========Checkpointed at scn:  0x0b5b.4b819fa1 

<======
資料檔案#163 header中記錄的Checkpoint scn: 0x0b5b.4b819fa1 (十進位制12486736715681) 02/25/2016 07:31:25 


DATA FILE #163:  (name #172) /dev/rlv_index062 
Checkpoint cnt:142959 scn: 0x0b5b.4b96748e 02/25/2016 09:00:40 <========Checkpoint scn: 0x0b5b.4b96748e 

<======
控制檔案中記錄的資料檔案#163的Checkpoint scn: 0x0b5b.4b96748e (十進位制12486738080910) 02/25/2016 09:00:40 

說明資料檔案#163 header中記錄的Checkpoint scn是一箇舊值。 
ORA-1122/ORA-1208
是一種由於ORACLE以外的問題導致checkpoint scn 沒有成功寫入資料檔案header,或者寫入資料檔案header後,又被ORACLE以外軟體將舊的資料block覆蓋。 

 

二、 進一步論證

透過下面的測試模擬資料庫以外的問題導致了lost write(寫丟失)能夠重現問題ORA-1208。


1.
重建新的資料檔案 datafile#6 
create tablespace test datafile '/u03/oradata/fsdb/test01.dbf' size 10M; 
select file#,name from v$datafile; 
    FILE#   NAME 
----------  -------------------------------------- 
     6  /u03/oradata/fsdb/test01.dbf 

2. 手動執行checkpoint,然後檢視datafile#6 header記錄的SCN和控制檔案中記錄的SCN是一致的: 
--手動執行checkpoint 
alter system checkpoint; 

--查詢v$datafile_header,檢查datafile header: 
select file#,checkpoint_change# from v$datafile_header; 
          FILE# CHECKPOINT_CHANGE# 
          ---------- ------------------ 
        1            1073505 
        2            1073505 
        3            1073505 
        4            1073505 
        5            1073505 
        6            1073505 <===SCN 1073505 

--dump header資訊來檢查datafile header:
alter session set events 'immediate trace name file_hdrs level 10'; 

DATA FILE #6: 
 name #10: /u03/oradata/fsdb/test01.dbf 
Checkpoint cnt:3 scn: 0x0000.00106161 03/02/2016 17:10:37 

<===scn: 0x0000.00106161 (十六進位制) ==>轉換為十進位制 1073505 
以上2種方法驗證datafile#6 header記錄的SCN 1073505 


-- 控制檔案中記錄的資料檔案Checkpoint scn 
alter session set events 'immediate trace name controlf level 8'; 

DATA FILE #6: 
 name #10: /u03/oradata/fsdb/test01.dbf 
creation size=1280 block size=8192 status=0xe head=10 tail=10 dup=1 
tablespace 7, index=7 krfil=6 prev_file=0 
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 
Checkpoint cnt:3 scn: 0x0000.00106161 03/02/2016 17:10:37<===1073505 

<===scn: 0x0000.00106161(十六進位制) ==>轉換為十進位制 1073505 

以上說明 datafile#6 header記錄的SCN和控制檔案中記錄的SCN是一致的 1073505 

3. DD備份datafile#6 header block,因此datafileheader6.dd備份檔案中儲存的資訊是SCN=1073505 (一箇舊的SCN) 
dd if=/u03/oradata/fsdb/test01.dbf of=/tmp/datafileheader6.dd bs=8192 skip=1 count=1 conv=notrunc 
1+0 records in 
1+0 records out 
8192 bytes (8.2 kB) copied, 0.00201189 s, 4.1 MB/s 


4. 手動執行checkpoint,讓checkpoint SCN增長,然後檢視datafile#6 header記錄的SCN和控制檔案中記錄的SCN是一致的: 

SQL> alter system checkpoint; 
System altered. 

--確認當前datafile#6 header記錄資訊 
SQL> alter session set events 'immediate trace name file_hdrs level 10'; 
Session altered. 

DATA FILE #6: 
 name #10: /u03/oradata/fsdb/test01.dbf 
creation size=1280 block size=8192 status=0xe head=10 tail=10 dup=1 
tablespace 7, index=7 krfil=6 prev_file=0 
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 
Checkpoint cnt:4 scn: 0x0000.001063e8 03/02/2016 17:21:53 <====1074152 

<===scn: 0x0000.001063e8 (十六進位制) ==>轉換為十進位制 1074152 

SQL> select file#,checkpoint_change# from v$datafile_header; 
    FILE# CHECKPOINT_CHANGE# 
---------- ------------------ 
        1            1074152 
        2            1074152 
        3            1074152 
        4            1074152 
        5            1074152 
        6            1074152 <=== 

6 rows selected. 

以上2種方法驗證datafile#6 header記錄的SCN已經增長到 1074152 

-- 控制檔案中記錄的資料檔案Checkpoint scn 
alter session set events 'immediate trace name controlf level 8'; 
DATA FILE #6: 
 name #10: /u03/oradata/fsdb/test01.dbf 
creation size=1280 block size=8192 status=0xe head=10 tail=10 dup=1 
tablespace 7, index=7 krfil=6 prev_file=0 
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 
Checkpoint cnt:4 scn: 0x0000.001063e8 03/02/2016 17:21:53<====1074152 

<===scn: 0x0000.001063e8 (十六進位制) ==>轉換為十進位制 1074152 

以上資訊說明datafile#6 header記錄的SCN和控制檔案中記錄的SCN都增長,並且保持一致的 1074152 
同時說明當觸發checkpoint後,資料庫可以自動同步datafile#6 header和控制檔案中的scn值,並且保持一致,沒有任何問題。 


5. 模擬lost write 

alter system flush buffer_cache; 

用舊的datafile#6 header block (儲存的資訊是SCN=1073505 (一箇舊的SCN))來替換當前的block 
# dd if=/tmp/datafileheader6.dd of=/u03/oradata/fsdb/test01.dbf bs=8192 count=1 seek=1 conv=notrunc 
1+0 records in 
1+0 records out 
8192 bytes (8.2 kB) copied, 0.00228945 s, 3.6 MB/s 


--替換後,驗證當前資料檔案6 header block已經是一箇舊scn: 
SQL> select file#,checkpoint_change# from v$datafile_header; 
    FILE# CHECKPOINT_CHANGE# 
---------- ------------------ 
        1            1074152 
        2            1074152 
        3            1074152 
        4            1074152 
        5            1074152 <====其他datafile是current SCN 
        6            1073505 <====old SCN 

6 rows selected. 

6. 手動執行checkpoint報錯: 

SQL>  alter system checkpoint; 
alter system checkpoint 

ERROR at line 1: 
ORA-03113: end-of-file on communication channel 
Process ID: 3679 
Session ID: 1 Serial number: 9 

--分析alert log日誌: 
Wed Mar 02 17:30:08 2016 
Beginning global checkpoint up to RBA [0x49.3aed.10], SCN: 1074328 
Read of datafile '/u03/oradata/fsdb/test01.dbf' (fno 6) header failed with ORA-01208 
Rereading datafile 6 header failed with ORA-01208 
Errors in file /u01/app/oracle/diag/rdbms/fsdb/fsdb/trace/fsdb_ckpt_3052.trc: 
ORA-63999: data file suffered media failure 
ORA-01122: database file 6 failed verification check 
ORA-01110: data file 6: '/u03/oradata/fsdb/test01.dbf' 
ORA-01208: data file is an old version - not accessing current version 

<==== 問題重現,報錯ORA-01122/ORA-01208 資料檔案過舊 

--分析CKPT trace檔案 /u01/app/oracle/diag/rdbms/fsdb/fsdb/trace/fsdb_ckpt_3052.trc 

datafile 6 header 記錄的SCN: 
Rereading datafile 6 header failed with ORA-01208 
V10 STYLE FILE HEADER: 
       Compatibility Vsn = 186646528=0xb200000 
       Db ID=1117087836=0x4295685c, Db Name='FSDB' 
       Activation ID=0=0x0 
       Control Seq=10639=0x298f, File size=1280=0x500 
       File Number=6, Blksiz=8192, File Type=3 DATA 
.... 
Checkpointed at scn:  0x0000.00106161 03/02/2016 17:10:37 

<====記錄的scn是一箇舊scn 

控制檔案記錄的SCN資訊: 
DATA FILE #6: 
 name #10: /u03/oradata/fsdb/test01.dbf 
creation size=1280 block size=8192 status=0xe head=10 tail=10 dup=1 
tablespace 7, index=7 krfil=6 prev_file=0 
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00 
Checkpoint cnt:4 scn: 0x0000.001063e8 03/02/2016 17:21:53 
<=====最新SCN資訊 

 



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

相關文章