如果在没有备份的情况下,操作人员误操作导致删除了数据怎么办?别慌,如果你使用的是oracle数据库,不妨试一试日志挖掘logminer,mysql的话可以尝试使用binlog,当然前提是你开启了binlog日志,并且历史的binlog有备份或者一直没有清理。这里给大家介绍的是oracle的logminer技术。
在这里,强烈建议大家开启归档,如果没有归档,只能挖掘redo,误删除的数据可能找回的不全。
首先,确认下安装包的位置,这里使用的oracle版本为11.2.0.4.0
[oracle@db1 ~]$ cd $ORACLE_HOME/rdbms/admin
[oracle@db1 admin]$ ls dbmslm*
dbmslmd.sql dbmslm.sql dbmslms.sql
1.安装这三个包
SQL> @?/rdbms/admin/dbmslmd.sql
SQL> @?/rdbms/admin/dbmslm.sql
SQL> @?/rdbms/admin/dbmslms.sql
2.查看utl_file_dir参数
SQL> show parameter utl_file_dir
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir string
发现没有路径,那么就建立路径
SQL> alter system set utl_file_dir='/dblog' scope=spfile;
SQL> shut immediate;
SQL> startup
3.执行大量DML操作,并手动切换日志,产生归档
4.查看日志文件和归档文件路径
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- --------------------------------------------- ---
1 ONLINE /u01/app/oracle/oradata/PROD/redo01.log NO
2 ONLINE /u01/app/oracle/oradata/PROD/redo02.log NO
3 ONLINE /u01/app/oracle/oradata/PROD/redo03.log NO
SQL> select name from v$archived_log;
NAME
----------------------------------------
/bk/1_39_959811941.dbf
/bk/1_40_959811941.dbf
/bk/1_41_959811941.dbf
/bk/1_42_959811941.dbf
/bk/1_43_959811941.dbf
/bk/1_44_959811941.dbf
/bk/1_45_959811941.dbf
/bk/1_46_959811941.dbf
5.因为手工切换了日志,所以只对归档进行日志挖掘即可,创建日志挖掘的字典
execute dbms_logmnr_d.build(dictionary_filename=>'log.ora',dictionary_location=>'/dblog',options=>dbms_logmnr_d.store_in_flat_file);
6.添加归档日志
第一个归档日志为new,后面的直接add即可
exec dbms_logmnr.add_logfile('/bk/1_39_959811941.dbf',dbms_logmnr.new);
exec dbms_logmnr.add_logfile('/bk/1_40_959811941.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/bk/1_41_959811941.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/bk/1_42_959811941.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/bk/1_43_959811941.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/bk/1_44_959811941.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/bk/1_45_959811941.dbf',dbms_logmnr.addfile);
exec dbms_logmnr.add_logfile('/bk/1_46_959811941.dbf',dbms_logmnr.addfile);
7.开启日志挖掘
exec dbms_logmnr.start_logmnr(dictfilename=>'/dblog/log.ora');
8.查看日志挖掘记录,由于挖掘记录过多,建议使用spool功能
spool home/oracle/1.sql
select scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where seg_name='TEST' and seg_owner='TEST';
spool off
此时只针对TEST用户下的TEST表进行日志挖掘
9.关闭日志挖掘
exec dbms_logmnr.end_logmnr;
10.此时日志挖掘已经完毕,可以去看/home/oracle/1.sql中的内容恢复数据了