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);