Oracle Database does not provide any supplemental logging, which means that by default LogMiner is not usable

写在前面,在研究Oracle logmnr 的时候看到 http://www.askmaclean.com/archives/dbms_logmnr-unsupported-sqlredo.html 的文章,其中有一句

不知道maclean测试的是哪个版本的数据库,我测试的情况是可以的。

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
View Code

查看是否启用 supplemental log

SQL> select supplemental_log_data_min from v$database;

SUPPLEME
--------
NO

SQL>

创建测试实例

[oracle@localhost ~]$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Sat Oct 11 02:00:49 2014

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> set linesize 180;
SQL> set pagesize 80;
SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
DEPT
EMP
BONUS
SALGRADE
DEPT_2

SQL> create table emp2 as select * from emp where 1 =2;

Table created.

SQL> insert into emp2 select * from emp;

14 rows created.

SQL> commit;

Commit complete.

SQL> delete from emp where deptno =30;

6 rows deleted.

SQL> commit;

Commit complete.
View Code

 

查看测试结果

SQL> begin                                                                                                                  2  dbms_logmnr.add_logfile(logfilename=>/u01/app/flash_recovery_area/ORCL/archivelog/2014_10_11/o1_mf_1_12_b3kwq3qz_.arc,options=>dbms_logmnr.NEW);
  3  dbms_logmnr.add_logfile(logfilename=>/u01/app/flash_recovery_area/ORCL/archivelog/2014_10_11/o1_mf_1_11_b3kv67v1_.arc,options=>dbms_logmnr.ADDFILE);
  4  end;
  5  /

PL/SQL procedure successfully completed.

SQL> select sql_redo from v$logmnr_contents t where t.seg_name =EMP2;
select sql_redo from v$logmnr_contents t where t.seg_name =EMP2
                     *
ERROR at line 1:
ORA-01306: dbms_logmnr.start_logmnr() must be invoked before selecting from v$logmnr_contents


SQL> execute dbms_logmnr.start_logmnr(options=> dbms_logmnr.dict_from_online_catalog + dbms_logmnr.committed_data_only);

PL/SQL procedure successfully completed.

SQL>  select sql_redo from v$logmnr_contents t where t.seg_name =EMP2;

SQL_REDO
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
create table emp2 as select * from emp where 1 =2;
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7369,SMITH,CLERK,7902,TO_DATE(17-DEC-80, DD-MON-RR),800,NULL,20);
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7499,ALLEN,SALESMAN,7698,TO_DATE(20-FEB-81, DD-MON-RR),1600,300,30
);

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7521,WARD,SALESMAN,7698,TO_DATE(22-FEB-81, DD-MON-RR),1250,500,30
);

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7566,JONES,MANAGER,7839,TO_DATE(02-APR-81, DD-MON-RR),2975,NULL,20)
;


SQL_REDO
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7654,MARTIN,SALESMAN,7698,TO_DATE(28-SEP-81, DD-MON-RR),1250,1400,
30);

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7698,BLAKE,MANAGER,7839,TO_DATE(01-MAY-81, DD-MON-RR),2850,NULL,30)
;

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7782,CLARK,MANAGER,7839,TO_DATE(09-JUN-81, DD-MON-RR),2450,NULL,10)
;

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7788,SCOTT,ANALYST,7566,TO_DATE(19-APR-87, DD-MON-RR),3000,NULL,20)
;

SQL_REDO
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7839,KING,PRESIDENT,NULL,TO_DATE(17-NOV-81, DD-MON-RR),5000,NULL,10);
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7844,TURNER,SALESMAN,7698,TO_DATE(08-SEP-81, DD-MON-RR),1500,0,30
);

insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7876,ADAMS,CLERK,7788,TO_DATE(23-MAY-87, DD-MON-RR),1100,NULL,20);
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7900,JAMES,CLERK,7698,TO_DATE(03-DEC-81, DD-MON-RR),950,NULL,30);
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7902,FORD,ANALYST,7566,TO_DATE(03-DEC-81, DD-MON-RR),3000,NULL,20);
insert into "SCOTT"."EMP2"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values (7934,MILLER,CLERK,7782,TO_DATE(23-JAN-82, DD-MON-RR),1300,NULL,10);

15 rows selected.
View Code

 

同样 对于david 的文章貌似也存在描述的不妥的情况

http://blog.csdn.net/tianlesoftware/article/details/6554674

不知道是不是也是测试的环境不同。

还是说我的测试具有偶然性。

经过测试至少可以证明几件事情:(基于当前测试环境 Oracle 11.2)

1.必须要创建utl_file_dir,创建之后必须重启数据库。

2.即便是没有启用supplemental log,在没有其他更好的办法的时候还是可以尝试logmnr恢复特定表的特定数据。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。