LOGMNR(三)DICT_FROM_REDO_LOGS模式
之前写过关于LOGMNR的DICT_FROM_ONLIE_CATALOG模式的用法(详见http://www.dbdream.com.cn/?p=394),和dictory模式的用法(详见http://www.dbdream.com.cn/?p=405),今天介绍下LOGMNR的第三种用法DICT_FROM_REDO_LOGS。
LOGMNR的三种模式:
1.DICT_FROM_ONLIE_CATALOG:10g开始,ORACLE开始支持DICT_FROM_ONLIE_CATALOG模式,可以直接使用数据库的的数据字典查看相关的元数据信息,该模式要求数据库必须处于open 状态,而且只能对当前数据库的日志进行分析,效率快,但对数据库会产生一定的压力。
2. dictory模式:这种模式是将数据库的数据字典抽取到操作系统的一个文件里,利用这种方法也可以使用其他数据库来分析生产库的日志,但是这种方式必须设置UTL_FILE_DIR参数,这个参数是静态参数,修改后必须重启数据库才会生效。
3.DICT_FROM_REDO_LOGS:这种方法必须启动supplemental log,否则会报ORA-01354错误,如下:
SQL> exec dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs); BEGIN dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs); END; * 第 1 行出现错误: ORA-01354: 必须添加补充日志数据才能运行此命令 ORA-06512: 在 "SYS.DBMS_LOGMNR_INTERNAL", line 6003 ORA-06512: 在 "SYS.DBMS_LOGMNR_INTERNAL", line 6101 ORA-06512: 在 "SYS.DBMS_LOGMNR_D", line 12 ORA-06512: 在 line 1
使用DICT_FROM_REDO_LOGS方式,进程会将数据库的数据字典信息抽取到online redo log里去,如果数据库的数据字典较大,或者redo log太小,或者DML操作较频繁,就有可能在抽取数据字典信息时发生日志切换操作。利用这种方式可以使用其他数据库(测试数据库)来分析生产库的归档日志信息,需要将包含所有数据字典信息的归档日志和需要分析归档日志一起发送到其他数据库(测试服务器),以减少直接在生产库上操作对生产数据库带来的压力。下面演示下如何使用LOGMNR的DICT_FROM_REDO_LOGS模式。
- 首先打开数据库的附加日志
SQL> alter database add SUPPLEMENTAL log data; 数据库已更改。
- 切换下日志
SQL> alter system switch logfile; 系统已更改。
- 做一些操作,后文测试用
SQL> create table logmnr_test(id number,name varchar2(10)); Table created. SQL> insert into logmnr_test values(1,'stream'); 1 row created. SQL> insert into logmnr_test values(2,'dbdream'); 1 row created. SQL> commit; Commit complete. SQL> update logmnr_test set name='streamsong' where name='stream'; 1 row updated. SQL> commit; Commit complete.
- 将数据字典抽取到online redo log
SQL> exec dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs); PL/SQL procedure successfully completed.
- 查看相关日志信息
SQL> select RECID,NAME,DICTIONARY_BEGIN,DICTIONARY_END from v$archived_log; RECID NAME DIC DIC ---------- -------------------------------------------------------------- --- --- 408 /u01/app/oracle/fast_recovery_area/STANDBY/1_258_798315732.dbf NO NO 409 /u01/app/oracle/fast_recovery_area/STANDBY/1_259_798315732.dbf NO NO 410 /u01/app/oracle/fast_recovery_area/STANDBY/1_260_798315732.dbf YES YES
DICTIONARY_BEGIN表示开始抽取数据字典,DICTIONARY_END表示数据字典抽取完成,也就是数据字典信息包含在DICTIONARY_BEGIN状态是YES和DICTIONARY_END状态是YES的日志文件内,上文中,数据字典信息包含在1_260_798315732.dbf日志中,也就是在抽取日志的过程中,日志没有发生切换。
- 将上面查询出的3个归档日志上传到测试服务器
[oracle@dbdream ~]$ cd /u01/app/oracle/fast_recovery_area/STANDBY/ [oracle@dbdream STANDBY]$ scp 1_258_798315732.dbf 1_259_798315732.dbf 1_260_798315732.dbf 192.168.249.56:/home/oracle/arch The authenticity of host '192.168.249.56 (192.168.249.56)' can't be established. RSA key fingerprint is 90:77:13:80:91:dd:8c:42:c0:24:ee:f7:06:36:1c:7f. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.249.56' (RSA) to the list of known hosts. oracle@192.168.249.56's password: 1_258_798315732.dbf 100% 288KB 287.5KB/s 00:00 1_259_798315732.dbf 100% 958KB 958.0KB/s 00:00 1_260_798315732.dbf 100% 6864KB 6.7MB/s 00:01
- 测试服务器没有过多要求,不需要打开归档模式,只要OPEN就可以分析
SQL> archive log list Database log mode No Archive Mode Automatic archival Disabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 15 Current log sequence 17
- 添加LOGMNR日志
SQL> exec dbms_logmnr.add_logfile(logfilename=>'/home/oracle/arch/1_258_798315732.dbf',options=>dbms_logmnr.new); PL/SQL procedure successfully completed. SQL> exec dbms_logmnr.add_logfile(logfilename=>'/home/oracle/arch/1_259_798315732.dbf',options=>dbms_logmnr.addfile); PL/SQL procedure successfully completed. SQL> exec dbms_logmnr.add_logfile(logfilename=>'/home/oracle/arch/1_260_798315732.dbf',options=>dbms_logmnr.addfile); PL/SQL procedure successfully completed.
- 开始分析
SQL> EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_REDO_LOGS); PL/SQL procedure successfully completed.
- 查看分析结果
SQL> select timestamp,sql_redo from v$logmnr_contents where table_name='LOGMNR_TEST' TIMESTAMP SQL_REDO --------- -------------------------------------------------------------------------------------- 08-MAR-13 create table logmnr_test(id number,name varchar2(10)); 08-MAR-13 insert into "STREAM"."LOGMNR_TEST"("ID","NAME") values ('1','stream'); 08-MAR-13 insert into "STREAM"."LOGMNR_TEST"("ID","NAME") values ('2','dbdream'); 08-MAR-13 update "STREAM"."LOGMNR_TEST" set "NAME" = 'streamsong' where "NAME" = 'stream' and ROW ID = 'AAAD3MAAEAAAAF3AAA';
DICT_FROM_REDO_LOGS模式相对用的比较广泛,比如客户需要帮他们看下4天之内一条记录的修改情况,客户的数据库又没有设置UTL_FILE_DIR参数,就可以用这种方法把数据字典抽取到日志文件中,然后客户只需要将包含数据文件的日志和分析时间段的日志发给我就可以了,而不需要设置UTL_FILE_DIR参数和重启数据库。