web-dev-qa-db-ja.com

データベースから削除されたデータを追跡する方法

Oracle 11gデータベースをアーカイブログモードで使用していますが、監査が有効になっていません。 2日前に、私のデータベースの子テーブルから数行が削除されました。スキーマパスワードが共有されていたため、どのように発生したかを追跡できません。トレースファイルとクエリされたテーブルv $ log_history、V $ SQL、DBA_HIST_SQLTEXTをチェックして履歴を取得しましたが、関連情報を見つけることができませんでした。また、同じ日にバックアップを復元してデータを確認しました。ただし、このデータは同じ日に作成および削除されたため、バックアップからでもこのデータを追跡することはできません。私は初心者なので、この問題への対処方法がわかりません。データベースで削除操作が実行されたかどうかを確認できる他のメソッド/クエリはありますか?

3
akr

最小限のサプリメンタルロギングがオンになっている場合before調査したいインシデントが発生しました(デフォルトでオフになっています。オン)経由で確認できます:select supplemental_log_data_min from v$database;、Logminerはこのためのツールです。

ログマイナーを開始します。

execute dbms_logmnr_d.build(options=> dbms_logmnr_d.store_in_redo_logs);

表示するアーカイブログをLogminerにロードします。

begin
   dbms_logmnr.start_logmnr(
     starttime => TO_TIMESTAMP('2017-03-02 07:00:00', 'YYYY-MM-DD HH24:MI:SS'), 
     endtime => TO_TIMESTAMP('2017-03-02 15:00:00', 'YYYY-MM-DD HH24:MI:SS'), 
     options => dbms_logmnr.dict_from_online_catalog + dbms_logmnr.continuous_mine);
end;

上記では、ArchiveLogsがまだディスク上にあると想定しています。それらをバックアップした場合は、それらをバックアップから解凍し、最初にデータベースに登録する必要があります。

やり直しをクエリする

select timestamp, operation, username, session#, scn, sql_redo
   from v$logmnr_contents where sql_redo like '<SOME SEARCH CRITERIA>';

ログマイナーセッションを終了する

exec dbms_logmnr.end_logmnr;

docs からLogminerについて読むことができます。

サプリメンタルロギングがオフになっている場合でも、フラッシュバッククエリを使用してインシデントがいつ発生したかを特定し、インシデントの正確な時間を絞り込むことで、必要な情報を取得できる場合があります(十分な大きさの取り消しと保持ポリシーが適切である場合)。 :

select * from <SOMETABLE> 
  AS OF TIMESTAMP TO_TIMESTAMP('2017-03-02 09:30:00', 'YYYY-MM-DD HH:MI:SS')

次に、監査証跡をクエリして、共有スキーマユーザーが上記の時間枠の周りにいつログオンしたかを確認します。

select * from dba_audit_trail where username = '<SOME USER>' order by timestamp;

上記では、監査情報をDB(show parameter audit_trail;)。 docs から監査について読むことができます。

2
Kris Johnston