Logminer的最终章,START_LOGMNR的参数的介绍。

先说一下参数如何使用:dbms_logmnr.start_logmnr(
        dictfilename => '/home/oracle/logminer/logminer_dict.ora',options => dbms_logmnr.PRINT_PRETTY_SQL+dbms_logmnr.COMMITTED_DATA_ONLY+...);
类似于这样来指定多个参数。

通常情况下我们在跑START_LOGMNR这个子程序时不选定任何的选项,但是事实上START_LOGMNR提供了很多选项帮助我们做一些分析:

COMMITTED_DATA_ONLY:字面意思,只有提交了的数据才会在Logminer中显示,简单测试了一下

 
  
  1. SQL> insert into logmnr_test values (1); 
  2.  
  3. 1 row created. 
  4.  
  5. SQL> rollback
  6.  
  7. Rollback complete.
 
  
  1. SQL> @logminer '/home/oracle/archive/1_25_769218757.dbf' 
  2. old   5:         logfilename => '&1' ); 
  3. new   5:         logfilename => '/home/oracle/archive/1_25_769218757.dbf' ); 
  4.  
  5. PL/SQL procedure successfully completed. 
  6.  
  7. SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST'
  8.  
  9. SQL_REDO 
  10. -------------------------------------------------------------------------------- 
  11. insert into "SYS"."LOGMNR_TEST"("ID"values ('1'); 
  12. delete from "SYS"."LOGMNR_TEST" where ROWID = 'AAAR9DAABAAAU3JAAB'
  13.  
  14. SQL> @logminertmp '/home/oracle/archive/1_25_769218757.dbf' 
  15. old   5:         logfilename => '&1' ); 
  16. new   5:         logfilename => '/home/oracle/archive/1_25_769218757.dbf' ); 
  17.  
  18. PL/SQL procedure successfully completed. 
  19.  
  20. SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST'
  21.  
  22. no rows selected 
  23.  
  24. SQL>  

在原来的脚本logminer.sql中添加了options => dbms_logmnr.committed_data_only成为logminertmp.sql,就可以看到rollback的数据就不再显示了。

SKIP_CORRUPTION:跳过在redo log中损坏的部分,继续显示其他可以挖到的日志部分(不好测试,不测试了)。

DDL_DICT_TRACKING:重点想要说明的一个很实用的参数,我曾经把自己的脚本贴出来过,可以看到每次都重建了一下数据字典文件,为什么要这样做呢?假设我们不这样做,当我们创建一个表,然后对其进行一些dml操作,这时再logminer的时候就只有ddl的内容,dml内容却丢失了,我们再次更改logminertmp中的代码,实验如下:

 
  
  1. SQL> create table logmnr_new(id number); 
  2.  
  3. Table created. 
  4.  
  5. SQL> insert into logmnr_new values (1); 
  6.  
  7. 1 row created. 
  8.  
  9. SQL> commit
  10.  
  11. Commit complete. 
  12.  
  13. SQL> alter system archive log current
  14.  
  15. System altered. 
  16.  
  17. SQL> @logminertmp '/home/oracle/archive/1_26_769218757.dbf' 
  18. old   4:         logfilename => '&1' ); 
  19. new   4:         logfilename => '/home/oracle/archive/1_26_769218757.dbf' ); 
  20.  
  21. PL/SQL procedure successfully completed. 
  22.  
  23. SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_NEW'
  24.  
  25. SQL_REDO 
  26. -------------------------------------------------------------------------------- 
  27. create table logmnr_new(id number);

果然,我们看不到insert的那句语句了,那我们使用DDL_DICT_TRACKING这个参数试试。

 
  
  1. SQL> @logminertmp '/home/oracle/archive/1_26_769218757.dbf' 
  2. old   4:         logfilename => '&1' ); 
  3. new   4:         logfilename => '/home/oracle/archive/1_26_769218757.dbf' ); 
  4.  
  5. PL/SQL procedure successfully completed. 
  6.  
  7. SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_NEW'
  8.  
  9. SQL_REDO 
  10. -------------------------------------------------------------------------------- 
  11. create table logmnr_new(id number); 
  12. insert into "SYS"."LOGMNR_NEW"("ID"values ('1'); 

可以明显感觉到跑脚本的时间变长了,但是结果却完整了。DML丢失的问题通过每次重建数据字典文件和指定该参数来解决。(o小白猜其实这个参数就是重建了数据字典文件)

DICT_FROM_ONLINE_CATALOG:使用数据库的数据字典文件而不使用Logminer指定的数据字典文件,使用这个参数就不能使用DDL_DICT_TRACKING这个参数了。

DICT_FROM_REDO_LOGS:在重做日志中找到数据字典文件,就像之前说过的,我们可以指定数据字典文件是普通文件还是重做日志文件。

NO_SQL_DELIMITER:去除sql分界符,那可以防止直接拿里面的数据去执行,而是方便用cursor之类的方法把逻辑整合在一起之后再使用。

NO_ROWID_IN_STMT:也是可以从字面理解的,在数据字典文件里不存ROWID了,而是存其他的信息,详细请看supplemental logging那章,那使用这个参数也请务必保证supplemental logging开启。

PRINT_PRETTY_SQL:使用了以后呢,oracle会把当前的Logminer的显示做些改变,使其对使用者更友好,但是这些sql语句就无法执行了。例如:

 

 
  
  1. SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST'
  2.  
  3. SQL_REDO 
  4. -------------------------------------------------------------------------------- 
  5. insert into "SYS"."LOGMNR_TEST" 
  6.  values 
  7.     "ID" = 1; 
  8.  
  9. delete from "SYS"."LOGMNR_TEST" 
  10.  where 
  11.     ROWID = 'AAAR9DAABAAAU3JAAB'

CONTINUOUS_MINE:很智能的一直参数,你只需要指定一个开始scn号/时间,或者开始Logminer的一个日志,指定了以后oracle会自动添加所需的在线的/归档的日志。如果使用这个参数必须保证Logminer所在库跟所分析的库是同一个,且必须开启归档模式。

Logminer到这里就结束了,o小白觉得也算是比较完整对Logminer做了一个交代,一直强调的是工具总是很强大,而如何发挥工具的作用,就看dba是不是强大了。