当前位置: 首页 > Oracle, oracle 10g, oracle 11g > 正文

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模式。

  1. 首先打开数据库的附加日志
SQL> alter database add SUPPLEMENTAL log data;

数据库已更改。
  1. 切换下日志
SQL> alter system switch logfile;

系统已更改。
  1. 做一些操作,后文测试用
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.
  1. 将数据字典抽取到online redo log
SQL> exec dbms_logmnr_d.build(options => dbms_logmnr_d.store_in_redo_logs);

PL/SQL procedure successfully completed.
  1. 查看相关日志信息
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日志中,也就是在抽取日志的过程中,日志没有发生切换。

  1. 将上面查询出的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
  1. 测试服务器没有过多要求,不需要打开归档模式,只要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
  1. 添加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.
  1. 开始分析
SQL> EXECUTE dbms_logmnr.start_logmnr(options =>dbms_logmnr.DICT_FROM_REDO_LOGS);

PL/SQL procedure successfully completed.
  1. 查看分析结果
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参数和重启数据库。

本文固定链接: https://www.dbdream.com.cn/2013/03/logmnr%e4%b8%89dict_from_redo_logs%e6%a8%a1%e5%bc%8f/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2013年03月19日发表在 Oracle, oracle 10g, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: LOGMNR(三)DICT_FROM_REDO_LOGS模式 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , , , ,

LOGMNR(三)DICT_FROM_REDO_LOGS模式:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter