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

来源:这里教程网 时间:2026-03-03 12:07:10 作者:

一、 数据库告警日志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信息 

 

相关推荐