非system或undo表空间的数据文件即为非关键数据文件,反之即为关键数据文件,本文标题为《 归档模式恢复非关键数据文件》,所以我们先从数据库是否开启归档开始测试。
1:查看数据库归档情况,明确显示,数据库处于归档模式
SYS@ORA11GR2>archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/11.2.0/db_1/dbs/arch
Oldest online log sequence 35
Next log sequence to archive 37
Current log sequence 37
SYS@ORA11GR2>
2 : 创建测试所用表空间(ts_042_16_5)及用户并赋予相应的权限
3 : 创建测试用表,表的默认表空间为ts_042_16_5,并插入少量测试数据
4 : 人为删除测试表空间ts_042_16_5的数据文件ts_042_16_5.dbf
5 : 此时我们再次查询t表,发现依然可以返回结果,因为,表t的数据已经缓存到内存中
6 : 尝试插入一条记录,奇怪的事儿发生了,竟然插入成功,并且提交也成功了
数据能插入,我们可以理解,因为insert操作,数据并没有真正的写入到磁盘中,是将数据先写入内存中。可是我们已经commit了,告诉dbwr进程,应该将数据库高速缓冲区中的脏数据写入到磁盘了,理论上此时应该报错了,为什么还是告诉我成功了呢?
原因是,虽然我们的commit成功了,但dbwr进程实际上还没有工作(可以肯定的是,redo中一定记录了本次操作),不过已经纳入到写入队列中,dbwr并不着急,在慢慢的处理已经提交且还没有写入磁盘的数据。
7 : 我们回到sys用户,手工执行一次检查点事件,再xzq下的t表,此时,立刻就返回了错误信息。
8 : 在归档模式下,可以重新创建一个数据文件(注,这个数据文件,可以指向原来的目录,也可以指向其他的目录,这样就方便万一是硬件的故障,我们可以指向其他的目录,本次测试,将这个数据文件指向上一级目录)
SYS@ORA11GR2>alter database create datafile '/u01/app/oracle/oradata/ORA11GR2/ts_042_16_5.dbf' as '/u01/app/oracle/oradata/ts_042_16_5.dbf';
Database altered.
SYS@ORA11GR2>SYS@ORA11GR2>host ls /u01/app/oracle/oradata/ts*
/u01/app/oracle/oradata/ts_042_16_5.dbf
SYS@ORA11GR2>
9 : 通过日志恢复8号数据文件(当然,也可以在datafile后面写上数据文件的绝对路径)
SYS@ORA11GR2>recover datafile 8;
Media recovery complete.
SYS@ORA11GR2>
10 : 恢复完成后,再次查看t表,发现还报错误,不过,这个错误跟刚才的错误是有区别的,这个错误提示我们不能read,难道这个数据文件脱机了不成?
11 : 查看数据文件的状态,果然,8号数据文件变为offline
8 rows selected.
SYS@ORA11GR2>
12 : 将8号数据文件联机
13 : 再次验证数据是否恢复,查看t表,恢复完成。
14 : 小结
1)开启归档是非常重要的,且恢复教容易
2)类似这种错误(ORA-00376: file 8 cannot be read at this time),数据库是否启动的恢复步骤略有不同,如果是在数据库关闭的情况下删除数据文件,那么我们在mount下进行恢复,就不会出现数据文件offline的情况,请自行测试。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/685769/viewspace-750780/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/685769/viewspace-750780/