记一次数据误删操作通过闪回以及日志挖掘恢复

发布时间 2023-05-17 09:16:55作者: 闪存第一流苏-

由于开发人员不小心删除业务表然后想通过我来恢复数据,我第一时间发现由于undo_retention参数只保留15分钟,通过闪回这种方法并不能恢复数据,

然后通过日志挖掘来截取该时间段数据,然后通过创建记录表来保存到记录表里方便查询。通过记录表里的数据来恢复数据。以下命令是一些操作的命令

 

 

日志挖掘通过指定时间段来挖取数据。--_--尽量时间点要靠近一些不然时间点差距过大而导致数据量过大

BEGIN
DBMS_LOGMNR.START_LOGMNR(STARTTIME => to_date('2022-07-12 09:35:00' ,'yyyy-mm-dd hh24:mi:ss'),
ENDTIME => to_date('2022-07-12 09:45:00' ,'yyyy-mm-dd hh24:mi:ss' ),
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +DBMS_LOGMNR.CONTINUOUS_MINE);
END;
/

通过创建记录表保留数据以及查询

create table 记录表 tablespace 表空间 as select * from v$logmnr_contents;

select t.scn,t.timestamp,t.xid,t.seg_owner,t.seg_name,t.operation,t.sql_redo,t.sql_undo from 记录表 T where seg_owner='用户' and operation='DELETE';

数据量过大就用时间段查询数据

set echo off
set termout off
set lines 132 pages 2000
col sql_redo for a80
col seg_name for a5
select seg_name,sql_redo,to_char(START_TIMESTAMP,'yyyy-mm-dd hh24:mi:ss')START_TIMESTAMP from v$logmnr_contents
where sql_redo like 'update "SYS"."OBJ$"%'
and sql_redo like '%"DATAOBJ#" = ''96786''%';

 

如果undo没有过期也可以用闪回恢复,这样是最方便的

select * from 被误删表 as of timestamp to_timestamp('20230310 20:59:00','yyyymmdd hh24:mi:ss');

开启行移动

alter table 表名  enable row movement; 

数据恢复

flashback table 表名 to timestamp to_timestamp('20230310 20:59:00','yyyymmdd hh24:mi:ss')

 

 

总的来说各有优劣吧,通过闪回可以快速恢复以及数据不会缺失,但是太依赖undo日志,如果被覆盖就无能为力,以及需要知道被删的表面。

而日志挖掘虽然会截取更长时间的数据但是可能会缺失数据,这也是没有办法的办法了吧。