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中显示,简单测试了一下
:
- SQL> insert into logmnr_test values (1);
- 1 row created.
- SQL> rollback;
- Rollback complete.
- SQL> @logminer '/home/oracle/archive/1_25_769218757.dbf'
- old 5: logfilename => '&1' );
- new 5: logfilename => '/home/oracle/archive/1_25_769218757.dbf' );
- PL/SQL procedure successfully completed.
- SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST';
- SQL_REDO
- --------------------------------------------------------------------------------
- insert into "SYS"."LOGMNR_TEST"("ID") values ('1');
- delete from "SYS"."LOGMNR_TEST" where ROWID = 'AAAR9DAABAAAU3JAAB';
- SQL> @logminertmp '/home/oracle/archive/1_25_769218757.dbf'
- old 5: logfilename => '&1' );
- new 5: logfilename => '/home/oracle/archive/1_25_769218757.dbf' );
- PL/SQL procedure successfully completed.
- SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST';
- no rows selected
- SQL>
在原来的脚本logminer.sql中添加了options => dbms_logmnr.committed_data_only成为logminertmp.sql,就可以看到rollback的数据就不再显示了。
SKIP_CORRUPTION:跳过在redo log中损坏的部分,继续显示其他可以挖到的日志部分(不好测试,不测试了)。
DDL_DICT_TRACKING:重点想要说明的一个很实用的参数,我曾经把自己的脚本贴出来过,可以看到每次都重建了一下数据字典文件,为什么要这样做呢?假设我们不这样做,当我们创建一个表,然后对其进行一些dml操作,这时再logminer的时候就只有ddl的内容,dml内容却丢失了,我们再次更改logminertmp中的代码,实验如下:
- SQL> create table logmnr_new(id number);
- Table created.
- SQL> insert into logmnr_new values (1);
- 1 row created.
- SQL> commit;
- Commit complete.
- SQL> alter system archive log current;
- System altered.
- SQL> @logminertmp '/home/oracle/archive/1_26_769218757.dbf'
- old 4: logfilename => '&1' );
- new 4: logfilename => '/home/oracle/archive/1_26_769218757.dbf' );
- PL/SQL procedure successfully completed.
- SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_NEW';
- SQL_REDO
- --------------------------------------------------------------------------------
- create table logmnr_new(id number);
果然,我们看不到insert的那句语句了,那我们使用
DDL_DICT_TRACKING这个参数试试。
- SQL> @logminertmp '/home/oracle/archive/1_26_769218757.dbf'
- old 4: logfilename => '&1' );
- new 4: logfilename => '/home/oracle/archive/1_26_769218757.dbf' );
- PL/SQL procedure successfully completed.
- SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_NEW';
- SQL_REDO
- --------------------------------------------------------------------------------
- create table logmnr_new(id number);
- 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语句就无法执行了。例如:
- SQL> select sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST';
- SQL_REDO
- --------------------------------------------------------------------------------
- insert into "SYS"."LOGMNR_TEST"
- values
- "ID" = 1;
- delete from "SYS"."LOGMNR_TEST"
- where
- ROWID = 'AAAR9DAABAAAU3JAAB';
CONTINUOUS_MINE:很智能的一直参数,你只需要指定一个开始scn号/时间,或者开始Logminer的一个日志
,指定了以后oracle会自动添加所需的在线的/归档的日志。如果使用这个参数必须保证Logminer所在库跟所分析的库是同一个,且必须开启归档模式。
Logminer到这里就结束了,o小白觉得也算是比较完整对Logminer做了一个交代,一直强调的是工具总是很强大,而如何发挥工具的作用,就看dba是不是强大了。