一、 数据库告警日志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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29863023/viewspace-2216734/