ITPub博客

首页 > 数据库 > Oracle > ORA-1122/ORA-1208 数据文件头写丢失故障

ORA-1122/ORA-1208 数据文件头写丢失故障

原创 Oracle 作者:darren__chan 时间:2018-10-17 23:23:38 0 删除 编辑


一、 数据库告警日志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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
永远只是个追逐者 有广州工作机会请联系wx: darren_chan

注册时间:2014-09-09

  • 博文量
    155
  • 访问量
    1030501