【IT168 服务器学院】Oracle9i可谓是8i和10g的过渡性产品,许多10g的新特性已经初露狰狞,给我们带来的极大的方便,为数据恢复提供了更多的选择!
如果在9i中进行了DML操作的误操作,有以下两种方法恢复:
1、使用DBMS_FLASHBACK包
如果你在进行数据库操作时,不小心进行了INSERT、UPDATE、DELETE误操作,可以使用以下方法将数据重新获得,然后进行恢复
但是首先要关注以下参数:undo_retention,单位秒,如果该值设置为900,说明如果你的误操作在15分钟之内,你可以使用这个包在UNDO中将你原来的数据找到,记住只是将原始数据找到,还是需要你手工将这部分数据恢复的。例如你20:01误操作了,那么用该用户执行:
EXEC DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP(‘2005-07-28 20:00:00’,’YYYY-MM-DD HH24:MI:SS’)) 注:如果没有权限要先授权。
20:00这个时间就是你进行误操作之前的时间,一定要比较准确。执行完上面的语句后,在你当前的SESSION中,你再查看相应的表时,你的数据就是20:00的了,那么你把数据查询出来,在进行相应的处理,最后执行:
EXEC DBMS_FLASHBACK.DISABLE之后你的看到的数据又是实时的了。
2、使用DBMS_LOGMNR包
如果超过undo_retention时间或者你需要获得UNDO的具体语句,那么你就需要REDO日志了。由于日志采用二进制格式,所以需要使用DBMS_LOGMNR包进行日志分析。使用SYS用户登陆,首先应该从V$LOG中得知你需要从哪组日志文件中获取数据,然后有两种方法:
一、需要首先导出数据字典文件,然后进行日志分析
1、设置UTL_FILE_DIR参数,这样ORACLE才可以对这个目录具有写权限,例如:/USER1/DATA,设置该参数需要重启数据库。
2、导出数据字典文件:
Exec DBMS_LOGMNR_D.BUILD(‘test.ora’,’/USER1/DATA’)
3、增加你需要分析的日志文件
Exec DBMS_LOGMNR.ADD_LOGFILE(‘日志文件’)
4、使用已经导出的数据字典文件进行日志分析
Exec DBMS_LOGMNR.START_LOGMNR(dictfilename=>’/USER1/DATA/test.ora’)
5、从V$LOGMNR_CONTENTS视图中查询需要的脚本。
Select seg_name,sql_redo,sql_undo from v$logmnr_contents where seg_owner=’用户名’,这样在sql _undo中的脚本就是你的恢复脚本了
6、完成后使用Exec DBMS_LOGMNR.END_LOGMNR()清空v$logmnr_contents视图,结束日志分析。
二、使用数据库内部的数据字典
1、Exec DBMS_LOGMNR.ADD_LOGFILE(‘日志文件1’)
2、如果你的时间格式与DBMS_LOGMNR.START_LOGMNR默认时间相符合,那么你分析时只需要执行:
Exec DBMS_LOGMNR.START_LOGMNR(OPTIONS=>SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)即可,否则就需要查看视图获取你需要分析日志的CHECKPOINT#号,就是V$LOG视图中FIRST_CHANGE#字段对应的值,例如你需要分析日志1,那么1的FIRST_CHANGE#是10000,日志2是CURRENT,它的FIRST_CHANGE#是10080,那么如果你想分析20:00到20:10中日志1的具体情况,那么执行:
Exec DBMS_LOGMNR.START_LOGMNR(STARTSCN=>10000,ENDSCN=>10080,
STARTTIME => TO_TIMESTAMP(‘2005-07-28 20:00:00’,’YYYY-MM-DD HH24:MI:SS’),
ENDTIME => TO_TIMESTAMP(‘2005-07-28 20:10:00’,’YYYY-MM-DD HH24:MI:SS’),
OPTIONS=>SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
3、从V$LOGMNR_CONTENTS视图中查询需要的脚本。
Select seg_name,sql_redo,sql_undo from v$logmnr_contents where seg_owner=’用户名’,这样在sql _undo中的脚本就是你的恢复脚本了
4、完成后使用Exec DBMS_LOGMNR.END_LOGMNR()清空v$logmnr_co