先日仕事で、想定外のタイミングでデータベースの commit が走っているっぽい不具合が報告されたので、データベース上でどんな更新SQLが実行されているか調べるために LogMinor を利用しました。
LogMinor とは Oracle DB のREDOログを解析するための機能です。
LogMinor を開始 (SYSDBA ユーザーで実行)
-- サプリメンタル・ロギングを有効にする ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- カレントREDOロググループを確認する select member from v$logfile where group# = (select group# from v$log where STATUS = 'CURRENT'); -- 引数にカレントREDOロググループのパスを指定して実行する EXECUTE SYS.DBMS_LOGMNR.ADD_LOGFILE('/opt/app/oracle/oradata/orcl/redo01.log', SYS.DBMS_LOGMNR.NEW); -- LogMiner開始 EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.PRINT_PRETTY_SQL);
調査を行いたい操作を一通り行い、以下のSQL結果を取得
-- 検証作業後に以下のSQL結果を取得する select SCN, TO_CHAR(TIMESTAMP,'YYYY/MM/DD HH24:MI:SS') AS TIMESTAMP, OPERATION, ROLLBACK, SESSION#, SEQUENCE#, SQL_REDO from V$LOGMNR_CONTENTS where USERNAME = 'XXXX' ORDER BY SCN desc;
LogMinor を停止 (SYSDBA ユーザーで実行)
-- LogMiner終了 EXECUTE SYS.DBMS_LOGMNR.END_LOGMNR(); -- サプリメンタル・ロギングを無効にする ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
SQLの実行順に表示されるので、前後のSQLから問題の箇所の当たりを付けることができました。