Oracle オンラインREDOログとアーカイブログの解析ツール
前回記述したブログを元に解析ツールを作成した。
Oracle-ArchiveLog-Analyzer
MySQLのmysqlbinlogのような感じでLogMinerを使用してトランザクションごとにコミット順にテキストフォーマットで表示する。
インストール
perlスクリプトなのでDBD::Oracleをいれる cpanm DBD::Oracle git clone https://github.com/kenken0807/Oracle-ArchiveLog-Analyzer.git
使用方法
- オプション情報
$ perl Oracle-ArchiveLog-Analyzer.pl Usage: perl Oracle-ArchiveLog-Analyzer.pl [options] log-files Options: --start-position [SCN] Start reading REDO log at SCN. (START_SCN >= #) --stop-position [SCN] Stop reading REDO log at SCN. (COMMIT_SCN <= #) --start-datetime ['YYYY/MM/DD HH24:MI:SS'] Start reading REDO log at first event having a datetime equal. (START_TIMESTAMP >= 'YYYY/MM/DD HH24:MI:SS') --stop-datetime ['YYYY/MM/DD HH24:MI:SS'] Stop reading REDO log at first event having a datetime equal. (COMMIT_TIMESTAMP <= 'YYYY/MM/DD HH24:MI:SS') --select Show EXPLAIN SELECT STATEMENTS --table [TABLENAME] To extract transactions the table has been used (ex."'USER_MASTER','CODE_MASTER'") Connect Options: --host hostname [default localhost] --port port [default 1521] --sid sid [default orcl] --user user must be 'system' [default system] --pass password --checkuser FORMAT is "'username','username'...." (ex. --checkuser "'ORCLUSER','ORA'") Detail: Set log-files(archivelog or online redolog) at Current Dir or Fullpath
--start-position・・トランザクションが開始したSCNを起点
--stop-position・・トランザクションがコミットしたSCNを終点
--start-datetime・・トランザクションが開始した時間を起点
--stop-datetime・・トランザクションがコミットした時間を終点
--checkuser・・表示させたいトランザクションを実行したユーザ名を指定する
--table・・指定するとそのテーブルに対して実行された更新のみ取得
--user・・接続するユーザ名を選択(デフォルトsystem)
別ユーザで実行する場合は以下権限を付与すれば可能
GRANT SELECT ANY TRANSACTION to orauser; GRANT EXECUTE_CATALOG_ROLE to orauser; GRANT SELECT ON _v$LOGMNR_CONTENTS to orauser;
- 実行する
- 2016/02/18 14:41:27~2016/02/18 15:05:00間でORAUSERスキーマが実行した更新処理を表示する
$ perl Oracle-ArchiveLog-Analyzer.pl --sid orcl --pass xxxx \
--checkuser "'ORAUSER'" \
--start-datetime '2016/02/18 14:41:27' \
--stop-datetime '2016/02/18 15:05:00' \
/opt/app/oracle/online-redo/redo02.log
-- START_TIME: 2016/02/18 14:41:27 COMMIT_TIME: 2016/02/18 14:41:42
-- START_SCN: 47902287496 COMMIT_SCN: 47902287503
-- TRANSACTION ID: 09000700172A0600
set transaction read write;
update "ORAUSER"."TT" set "ID2" = '999' where "ID2" = '666';
commit;
-- START_TIME: 2016/02/18 15:04:43 COMMIT_TIME: 2016/02/18 15:04:43
-- START_SCN: 47902288848 COMMIT_SCN: 47902288878
-- TRANSACTION ID: 0A00120003D60B00
create table TEST (id int primary key);
-- START_TIME: 2016/02/18 15:04:53 COMMIT_TIME: 2016/02/18 15:04:53
-- START_SCN: 47902288882 COMMIT_SCN: 47902288883
-- TRANSACTION ID: 0A0006000FD70B00
set transaction read write;
insert into "ORAUSER"."TEST"("ID") values ('999');
commit;
-- START_TIME: 2016/02/18 15:05:00 COMMIT_TIME: 2016/02/18 15:05:00
-- START_SCN: 47902288895 COMMIT_SCN: 47902288924
-- TRANSACTION ID: 0700070050CD0700
truncate table TEST;
- --select をつけると実行されたDML文をSELECT文に書き換えて表示
$ perl Oracle-ArchiveLog-Analyzer.pl --sid orcl --pass xxxx \
--checkuser "'ORAUSER'" \
--start-datetime '2016/02/18 14:41:27' \
--stop-datetime '2016/02/18 15:04:53' \
--select /opt/app/oracle/online-redo/redo02.log
-- START_TIME: 2016/02/18 14:41:27 COMMIT_TIME: 2016/02/18 14:41:42
-- START_SCN: 47902287496 COMMIT_SCN: 47902287503
-- TRANSACTION ID: 09000700172A0600
set transaction read write;
update "ORAUSER"."TT" set "ID2" = '999' where "ID2" = '666';
commit;
-- EXPLAIN SELECT:
-- select count(*) from "ORAUSER"."TT" where "ID2" = '666';
-- START_TIME: 2016/02/18 15:04:43 COMMIT_TIME: 2016/02/18 15:04:43
-- START_SCN: 47902288848 COMMIT_SCN: 47902288878
-- TRANSACTION ID: 0A00120003D60B00
create table TEST (id int primary key);
-- START_TIME: 2016/02/18 15:04:53 COMMIT_TIME: 2016/02/18 15:04:53
-- START_SCN: 47902288882 COMMIT_SCN: 47902288883
-- TRANSACTION ID: 0A0006000FD70B00
set transaction read write;
insert into "ORAUSER"."TEST"("ID") values ('999');
commit;
-- EXPLAIN SELECT:
-- select count(*) from "ORAUSER"."TEST" where "ID" = '999' ;
SQL>delete from tt; 10行が削除されました。 SQL>commit;
・ 表示されるもの
-- START_TIME: 2016/02/23 17:25:57 COMMIT_TIME: 2016/02/23 17:25:57 -- START_SCN: 47902717945 COMMIT_SCN: 47902717954 -- TRANSACTION ID: 0A001E002FDC0B00 set transaction read write; delete from "ORAUSER"."TT" where "ID" = '1' and "ID2" = '1'; delete from "ORAUSER"."TT" where "ID" = '2' and "ID2" = '2'; delete from "ORAUSER"."TT" where "ID" = '3' and "ID2" = '3'; delete from "ORAUSER"."TT" where "ID" = '4' and "ID2" = '4'; delete from "ORAUSER"."TT" where "ID" = '5' and "ID2" = '5'; delete from "ORAUSER"."TT" where "ID" = '6' and "ID2" = '6'; delete from "ORAUSER"."TT" where "ID" = '7' and "ID2" = '7'; delete from "ORAUSER"."TT" where "ID" = '8' and "ID2" = '8'; delete from "ORAUSER"."TT" where "ID" = '9' and "ID2" = '9'; delete from "ORAUSER"."TT" where "ID" = '10' and "ID2" = '10'; commit;
これで調査するのには捗りそう。
これで独自のレプリケーション機能でも作ろうかな。と思ったけどOracleにはMviewやらいろんな機能が多くてそこは加味してないので。。