如何使用logminer
日志挖掘恢复
创建字典路径,并生效
mkdir -p /oracle/logmnr
alter system set utl_file_dir='/oracle/logmnr' scope=spfile;
shutdown immediate
startup
开启补充日志
select supplemental_log_data_pk,supplemental_log_data_ui from v$database
alter database add supplemental log data (primary key, unique index) columns;
根据大致的用户错误时间,找到所需要的所有的日志(归档日志和在线重做日志)
select name from v$archived_log where first_time >=
(select max(first_time) from v$archived_log
where first_time <= to_date('2022-04-24 13:00:00','yyyy-mm-dd hh24:mi:ss'))
union all
select member from v$logfile where group#=
(select group# from v$log where archived='NO') order by name;
构建挖掘脚本
set trim on
set trims on
set term off
set heading off
set feedback off
set echo off
set linesize 500
set pagesize 0
spool /oracle/logmnr.sql
select q'[exec dbms_logmnr.add_logfile(']' || name || q'[',dbms_logmnr.addfile);]' from v$archived_log
where first_time >=
(select max(first_time) from v$archived_log where first_time <= to_date('2021-08-24 13:00:00','yyyy-mm-dd hh24:mi:ss'))
union all
select q'[exec dbms_logmnr.add_logfile(']' ||member ||q'[',dbms_logmnr.addfile);]' from v$logfile
where group#=
(select group# from v$log where archived='NO') order by 1
spool off
开始挖掘
@logmnr.sql
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
获取挖掘结果
set trim on
set trims on
set term off
set heading off
set feedback off
set echo off
set linesize 500
set pagesize 0
spool /oracle/logmnr/undo_logmnr.sql
select sql_undo from v$logmnr_contents
where table_name='TEST'
and lower(sql_redo) like 'insert%';
因为做的是误删除操作,所以在undo里面是insert
SQL> select sql_undo from v$logmnr_contents
2 where table_name='TEST';
insert into "QY"."TEST"("ID") values ('2');
也可以创建一张临时表,创建完成后关闭挖掘
create table tmp as select * from v$logmnr_contents
spool off
结束挖掘
exec dbms_logmnr.end_logmnr;
根据产生的undo_logmnr.sql 进行恢复数据