由于开发人员不小心删除业务表然后想通过我来恢复数据,我第一时间发现由于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日志,如果被覆盖就无能为力,以及需要知道被删的表面。
而日志挖掘虽然会截取更长时间的数据但是可能会缺失数据,这也是没有办法的办法了吧。
标签:闪回,timestamp,误删,seg,redo,sql,日志,数据 From: https://www.cnblogs.com/liusuForget/p/17407510.html