SQL> alter system checkpoint;
System altered
--alert log中信息如下:
Sun Feb 02 02:27:51 2014
Beginning global checkpoint up to RBA [0x1ef.2532.10], SCN: 5374358
Errors in file /u01/diag/rdbms/wilson/wilson/trace/wilson_ckpt_4814.trc:
ORA-01171: datafile 11 going offline due to error advancing checkpoint
ORA-01116: error in opening database file 11
ORA-01110: data file 11: '/u01/oradata/WILSON/datafile/rmdtest01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
Completed checkpoint up to RBA [0x1ef.2532.10], SCN: 5374358
Sun Feb 02 02:27:52 2014
Checker run found 1 new persistent data failures
Check Point是Oracle内部控制的一件大事。经过check point,Oracle要保证所有数据文件、控制文件SCN信息保持一致,和日志文件在恢复时间点(RBA+SCN)达成一致。这个过程就强制回去访问到数据文件,结果文件丢失被发现。
此后,查询出错。
SQL> select count(*) from rmtest.rm_tab;
select count(*) from rmtest.rm_tab
ORA-00376: 此时无法读取文件 11
ORA-01110: 数据文件 11: '/u01/oradata/WILSON/datafile/rmdtest01.dbf'
注意:如果放任不管,Oracle自动的incremental checkpoint也会有类似的效果。同时,周期性的Global Check也会发现“文件丢失了”。
这个时候,我们进行修复操作。使用文件描述符恢复文件的方法,第一步找到一个Oracle后台进程,最典型的就是dbwr。
[oracle@bspdev datafile]$ ps -ef | grep dbw
oracle 4806 1 0 02:12 ? 00:00:00 ora_dbw0_wilson
oracle 9076 4491 0 02:29 pts/0 00:00:00 grep dbw
使用lsof –p命令,找出dbwr进程对应的文件描述符信息。
[root@bspdev datafile]# lsof -p 4806
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
oracle 4806 oracle cwd DIR 253,0 4096 10574090 /u01/oracle/dbs
oracle 4806 oracle rtd DIR 253,0 4096 2 /
oracle 4806 oracle txt REG 253,0 173515991 10579756 /u01/oracle/bin/oracle
(篇幅原因,有省略……)
racle 4806 oracle 33uW REG 253,0 10493952 2978999 /u01/oradata/WILSON/datafile/mvtbltest01.dbf
oracle 4806 oracle 34uW REG 253,0 30416896 524875 /u01/oradata/WILSON/datafile/o1_mf_temp_7xt46489_.tmp
oracle 4806 oracle 35r REG 253,0 1074176 10595009 /u01/oracle/rdbms/mesg/oraus.msb
里面包括了dbwr打开的所有文件描述符,我们没有能看到删除的文件rmdtest01.dbf。文件描述符目录也没有相应的FD内容。说明:由于一些情况,Oracle进程将文件描述符删除了!
此时,我们检查文件状态。
SQL> select online_status from dba_data_files where file_id=11;
ONLINE_STATUS
-------------
RECOVER
文件已经被offline,强制剔除文件体系了。仔细想起来,这个过程是check point的一个结果。
Check Point的最终效果,是所有数据文件在文件头标注相同的SCN记录,之前脏块被写入到数据文件中。如果一个数据文件实体不存在了,这个操作一定不能完成。Oracle选择了一种方法,就是强制将这个文件“剔除”。所以我们在日志中,看到了下面一段内容。
ORA-01171: datafile 11 going offline due to error advancing checkpoint
被剔除的文件,Oracle关闭文件描述符也是可以理解的了。
这个实验失败,告诉我们一个道理:使用文件描述符进行数据恢复,并不是100%有效。如果时间很长,或者进行过很多特殊操作,这个微弱的文件描述符是会消失的!
下面我们进行一次成功的实验。