1、进行初始化设置:开启附加日志,设置LogMiner的表空间,设置UTL_FILE_DIR参数的值;
SQL> CREATE DIRECTORY utlfile AS 'D:\oracle\oradata\practice\LOGMNR';
SQL> alter system set utl_file_dir='D:\oracle\oradata\LOGMNR' scope=spfile;
2、提取一个字典:将字典文件提取为Flat File或Redo日志。(或者直接使用Online Catalog);
CMD>CONNECT / AS SYSDBA
SQL> EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'D:\oracle\oradata\LOGMNR');
SQL> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:mi:ss';
Session altered.
查询日志组:
SQL> select member from v$logfile;
3、指定需要分析的Redo日志文件,利用DBMS_LOGMNR.ADD_LOGFILE来添加日志;
SQL> execute dbms_logmnr.add_logfile('E:\APP\ADMINISTRATOR\ORADATA\TEST\REDO01.LOG',dbms_logmnr.new);
PL/SQL procedure successfully completed.
4、开始LogMiner:exec DBMS_LOGMNR.START_LOGMNR来启动LogMiner;:
SQL> exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
5、查询视图进行结果分析:
SQL> select sql_redo,sql_undo from v$logmnr_contents where OPERATION='INSERT';
6、结束LogMiner:通过执行EXECUTE DBMS_LOGMNR.END_LOGMNR来结束分析。
SQL>execute dbms_logmnr.end_logmnr;
注意:Oracle的LogMiner分析时分为无限制条件和限制条件两种。要想精确如按照SCN,按照时间点查询,需要启用带限制条件的方式。
例如:
我们仅仅分析2019年6月1日的日志,:
EXECUTE dbms_logmnr.start_logmnr(
DictFileName => dictfilename=>‘D:…\practice\LOGMNR\dictionary.ora’,
StartTime =>to_date(‘2019-6-1 00:00:00’,‘YYYY-MM-DD HH24:MI:SS’)
EndTime =>to_date(’‘2019-6-1 23:59:59’,'YYYY-MM-DD HH24:MI:SS '));
同样结果查询也可按用户,按表查询结果:
SELECT sql_redo FROM v$logmnr_contents WHERE username=‘SCOTT’ AND tablename=‘EMP’;
但我查询的时候发现ogmnr_contents下记录到的这两个字段没提取到结果,猜想是不是需要补充日志supplemental log;
如大家有兴趣,可以尝试使用使用Online Catalog(联机日志)的方式再做一次实验一下。
适用于源库与目标库不同这样的方式
EXECUTE DBMS_LOGMNR_D.BUILD( -
OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
看字典存放到了哪个归档日志:
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
或者使用在线字典
这种方式是Oracle推荐的,适用于在源库做LogMiner,也是最易用的一种方式。
EXECUTE DBMS_LOGMNR.START_LOGMNR(-
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);