一.背景
oracle中当使用delete误删数据需要恢复数据时,如果归档文件还在,就可以利用logminer进行恢复,因为数据库所有的DML的操作都会记录在redo日志中。
二.恢复步骤
2.1.确定DML时间点日志信息
--模拟这条数据是误删数据
SQL> delete scott.dept where deptno=90;
1 row deleted.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> select t.thread#,t.sequence#,t.name
2 from v$archived_log t
3 where t.first_time >= to_date('2022-05-05 23:00:00','yyyy-mm-dd hh24:mi:ss')
4 and t.next_time <= to_date('2022-05-05 23:06:00','yyyy-mm-dd hh24:mi:ss');
THREAD# SEQUENCE# NAME
---------------------------------------------------------------------------
1 59
/data/app/oracle/fast_recovery_area/ORCL/archivelog/2022_05_05/o1_mf_1_59_k77stw
jh_.arc
1 60
/data/app/oracle/fast_recovery_area/ORCL/archivelog/2022_05_05/o1_mf_1_60_k77svp
hw_.arc
SQL>
2.2.安装logminer安装包,默认系统自带该安装包
SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql
Package created.
Grant succeeded.
Synonym created.
SQL>
2.3.添加挖掘日志
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/data/app/oracle/fast_recovery_area/ORCL/archivelog/2022_05_05/o1_mf_1_59_k77stwjh_.arc',options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
SQL> execute dbms_logmnr.add_logfile(logfilename=>'/data/app/oracle/fast_recovery_area/ORCL/archivelog/2022_05_05/o1_mf_1_60_k77svphw_.arc',options=>dbms_logmnr.addfile);
PL/SQL procedure successfully completed.
SQL>
注意:第一个添加日志选项是new,后续添加选项是addfile。
2.4.开启logminer
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.
2.5.查询v$logmnr_contents视图来挖掘信息
--sql_redo 用于记录当时DML的操作记录
SQL> select sql_redo from v$logmnr_contents where seg_owner='SCOTT';
SQL_REDO
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
delete from "SCOTT"."DEPT" where "DEPTNO" = '90' and "DNAME" = 'xue' and "LOC" = 'bai' and ROWID = 'AAAVRCAAEAAAACDAAA';
--sql_undo 可以使用sql_undo进行还原操作
SQL> select sql_undo from v$logmnr_contents where seg_owner='SCOTT';
SQL_UNDO
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
insert into "SCOTT"."DEPT"("DEPTNO","DNAME","LOC") values ('90','xue','bai');
SQL>
三.总结
3.1.恢复数据
当我们DML误操作时,如果归档还在,可以利用logminer来挖掘日志,利用sql_undo来恢复数据。
3.2.分析归档内容
同样,当我们发现归档量快速增长的时候,我们也可以通过logminer来挖掘归档,看到底是什么操作。
3.3.利用undo闪回查询
SQL> delete scott.emp;
14 rows deleted.
SQL> commit;
Commit complete.
SQL> select * from scott.emp as of timestamp to_timestamp('2022-05-05 23:30:00','YYYY-MM-DD HH24:MI:SS');
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL>
但是此方法受限于undo_retention的配置,默认值为900秒,即在删除数据900秒后,undo中的数据会过期。但如果业务比较繁忙,在undo表空间不足的情况下,即使镜像没有过期,数据还是会被覆盖。此时查询就会收到“ORA-08180:no snapshot found based on specified time”的错误信息。
最后修改时间:2022-05-05 23:40:20
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




