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