Linux下利用文件描述符恢复的成功失败实验(2)

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%有效。如果时间很长,或者进行过很多特殊操作,这个微弱的文件描述符是会消失的!
 
下面我们进行一次成功的实验。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/053e4a77989c1a67543875c73287c365.html