sql >> データベース >  >> RDS >> Oracle

LogMinerを使用して現在の変更を見つける

    データベースへの最近の変更を調査し、何が、いつ、誰によって変更されたかを報告する必要がある場合があります。何年もの間、OracleのDBMS_LOGMNRパッケージはそのようなタスクに利用できましたが、その呼び出しは完全にはカバーされていません。従来の方法では、ADD_LOGFILE()プロシージャを使用して、START_LOGMNRプロシージャの基本的な呼び出しで使用するLogMinerを準備します。これにより、現在のSCNを開始点としてユーティリティが開始されます。有効な開始SCNを選択し、それをSTART_LOGMNR()呼び出しに提供することにより、LogMinerを開始する別の方法があります。この記事では、これをどのように行うことができるかを確認し、その過程で、PGAの割り当てに関して考えられる懸念事項を明らかにします。

    Log Minerを起動するための「プレーンバニラ」スクリプトを見ると、現在のSCNでLogMinerを起動する通常のプロシージャ呼び出しが行われます。

     ---- run_logmnr.sql ----ログファイルを追加し、DBMS_LOGMNRを次のように設定します--アーカイブログを継続的にマイニングします--ページサイズ0にラインサイズ200トリムスプールを設定します----既存のログファイルを追加します----スタンバイログファイルを省略します- -select'exec dbms_logmnr.add_logfile(''' || member ||''')' from v $ logfilewhere type <>'STANDBY' and member in(select min(member)from v $ logfile group by group#)spool /tmp/add_logfiles.sql/spool off @ / tmp / add_logfiles----連続マインモードでlogmnrを開始--execdbms_logmnr.start_logmnr(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.CONTINUOUS_MINE + DBMS_LOGMNR.COMMITTED 

    Log Minerを開始する前に、使用可能なすべてのREDOログが追加されることに注意してください。データベースがARCHIVELOGモードで実行されている限り、start_logmnr呼び出しに開始SCNを提供する別のメソッドが存在します。

     BEGIN DBMS_LOGMNR.START_LOGMNR(startScn => 、endScn => 、OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY + DBMS_LOGMNR.CONTINUOUS_MINE); END; / 

    興味深いことに、LogMinerセッションを開始するために終了SCNは必要ありません。 Log Minerは実行時に利用可能なすべてのアーカイブログファイルを自動的に追加するため、CONTINUOUS_MINEオプションを指定できるように、データベースはARCHIVELOGモードである必要があります。この方法を使用すると、特定のSCNを使用して検索を開始できます。データの限られたサブセットのみがV$LOGMNR_CONTENTSビューに返され、検索の停止点を提供してビューのクエリを終了できるように、終了SCNブラケット検索を指定します。

    「LOGMINER」とマークされたエントリが登録されているときにデータベースアラートログをチェックすることで、LogMinerの進行状況を監視するのは簡単なタスクです。以下に示すように、完全なエントリにはBEGIN行とEND行が含まれます。

     Mon Oct 07 12:48:22 2019LOGMINER:セッション-2147482111スレッド1シーケンス9776のマイニングログファイルを終了します。/oracle/archive/awcis/awcis_0000009776_0001_1008544071.arcMonOct 07 12:48:22 2019LOGMINER:セッションのログファイルのマイニングを開始します- 2147482111スレッド1シーケンス9777、/ oracle / archive / awcis / awcis_0000009777_0001_1008544071.arcMon Oct 07 12:48:36 2019LOGMINER:セッション-2147482111スレッド1シーケンス9777、/ oracle / archive / awcis / awcis_0000009777_0001_1008544071.arcMon Oct0712のマイニングログファイルを終了します:48:36 2019LOGMINER:セッション-2147482111スレッド1シーケンス9778のマイニングログファイルの開始、/ oracle / archive / awcis / awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:セッション-2147482111スレッド1シーケンス9778のマイニングログファイルの終了oracle / archive / awcis / awcis_0000009778_0001_1008544071.arcMon Oct 07 12:48:49 2019LOGMINER:セッション-2147482111スレッド1シーケンス9779、/ oracle / archive / awcis / awcis_0000009779_0001_1008544071.arc
    のログファイルのマイニングを開始します

    ローカルOracleセッションの場合、数値は正の整数です。 Perl、Python、C / C ++または他の言語などのユーティリティによって開始されたリモートセッションの場合、負の整数が表示されます(上記のエントリはPythonスクリプトによって開始されました)。ログファイル名は、オンラインREDOログと利用可能なアーカイブコピーの両方を循環します。

    この方法でLogMinerを開始すると、選択した開始SCNまたはSCN範囲がREDOストリームで使用できなくなったときに、「ログファイルがありません」などのエラーがスローされる可能性もあります。実行時間の長いクエリでは、このようなエラーが発生する可能性があります。さらに、SCNが使用可能なログファイルに関して範囲外の場合、Log Minerは起動せず、次のようにスローされます。

     1行目のエラー:ORA-01292:現在のLogMinerセッションにログファイルが指定されていませんORA-06512:「SYS.DBMS_LOGMNR」の58行目ORA-06512:2行目

    このようなエラーを排除するために、V $ LOGビューからFIRST_CHANGE#を選択すると、LogMinerセッションの有効な開始点が提供されます。 V $ ARCHIVED_LOGに対して同様のクエリを使用すると、アーカイブされたREDOコピーで使用可能なすべての開始SCNが返されます。

    LogMinerをこのように使用する場合の問題はこれだけではありません。返される情報の量に応じて、Logmminerプロセスは大量のPGAメモリを割り当てることができ、pga_aggregate_limitが小さい場合、次のエラーをスローする可能性があります。

     ORA-04036:インスタンスが使用するPGAメモリがPGA_AGGREGATE_LIMITを超えています

    幸い、これは致命的なエラーではありません。 PGAリソースは不要になったため、他の場所で使用するためにメモリをデータベースに解放して戻すことができます。ただし、そのメモリが解放されてメモリプールに戻されるまでには、必要以上に時間がかかる場合があります。オプションは、pga_aggregate_limitをLog Minerセッションの合計よりも高く設定することです。これにより、エラーの発生を防ぐことができます。それらのセッションにどのメモリが割り当てられているかをどうやって知るのですか?ビューV$PROCESS_MEMORY_DETAILがデータベースで使用可能です。ただし、準備をせずにこのビューをクエリしようとすると、次のようになります。

    行が選択されていません。

    これは比較的小さな問題ですが、oradebugユーティリティを使用する必要があります。次の手順で、データをV$PROCESS_MEMORY_DETAILにロードします。

    ----現在のセッション識別子を設定します--oradebugsetmypid----目的のプロセスのPIDを使用します-メモリデータをダンプします----これによりV$PROCESS_MEMORY_DETAILにデータが入力されます--oradebugpga_detail_get- ---ビューをクエリして目的のデータを取得します--select*From v $ process_memory_detail;----ビューに新しいデータを再入力するには--oradebugpga_detail_get--ステートメントを実行します--oradebugpga_detail_get   

    これらのアクションを実行するためのスクリプトを以下に示します。

    ----oradebug呼び出し用の環境をセットアップします--oradebugsetmypidsetecho off trimspool onset verify offundefine p_1undefine p_2undefine s1undefine s2variable p1 numbervariable p2 numbercolumn sys_date new_value sysdt noprintselect to_char(sysdate、'RRRRMMDDHH24MISS')sys_date from dual; --セッションのプロセスIDを取得します--columnpidnew_value p_1select pid from v $ process where addr in(select paddr from v $ session where username ='' and sid =(select max(sid)From v $ session where username ='')); begin:p1:=&p_1; end;/----プロセスの詳細をv$process_memory_detailにダンプします--oradebugdumppga_detail_get&p_1spool&p_1._pga_stats_&sysdt..log --- -のセッション情報を取得します--COLUMNalmeHEADING "Allocated MB" FORMAT 99999D9COLUMN usme HEADING "Used MB" FORMAT 99999D9COLUMN frme HEADING "Freeable MB" FORMAT 99999D9COLUMN mame HEADING "Max MB" FORMAT 99999D9COLUMN usernameFORMATa25COLUMNプログラムFORMAT a22COLUMN sid FORMAT a5COLUMN spid FORMAT a8column pid_remote format a12SET LINESIZE 300SELECT s.username、SUBSTR(s.sid、1,5)sid、p.spid、logon_time、SUBSTR(s.program、1,22)program、s.process pid_remote、s.status、ROUND(pga_used_mem / 1024/1024)usme、ROUND(pga_alloc_mem / 1024/1024)alme、ROUND(pga_freeable_mem / 1024/1024)frme、ROUND(pga_max_mem / 1024/1024)mameFROM v $ session s、 v $ process pWHERE p.addr =s.paddrAND s.username ='' ORDER BY pga_max_mem、logon_time; ----30秒スリープ----セッション情報を再度取得--execdbms_lock.sleep(30) column sid new_value s1 noprintSELECT s.username、SUBSTR(s.sid、1,5)sid、p.spid、logon_time、SUBSTR(s.program、1,22)program、s.process pid_remote、s.status、ROUND( pga_used_mem / 1024/1024)usme、ROUND(pga_alloc_mem / 1024/1024)alme、ROUND(pga_freeable_mem / 1024/1024)frme、ROUND(pga_max_mem / 1024/1024)mameFROM v $ session s、v $ process pWHERE p.addr =s.paddrAND s.username ='' ORDER BY pga_max_mem、logon_time; exec dbms_lock.sleep(10)select max(sid)sid from v $ session where username ='';----プロセスメモリ情報を取得--COLUMNカテゴリHEADING"Category"COLUMN割り当て済みHEADING"割り当て済みバイト"COLUMN使用済みHEADING"使用済みバイト"COLUMNmax_allocatedHEADING"最大割り当て済みバイト数"SELECTpid、category、割り当て済み、使用済み、max_allocatedFROM v $ process_memoryWHERE pid in(SELECT pid FROM v $ process WHERE addr in(select paddr FROM v $ session WHERE sid =&&s1)); exec dbms_lock.sleep(10)SELECT pid、category、allocated、used、 max_allocatedFROM v $ process_memoryWHERE pid in(SELECT pid FROM v $ process WHERE addr in(select paddr FROM v $ session WHERE sid =&&s1)); exec dbms_lock.sleep(10)select pid from v $ process whe re addr in(select paddr from v $ session where username ='' and sid =(select max(sid)from v $ session where username =''));----の最初のパスを保存pga stats--CREATE TABLE tab1 ASSELECT pid、category、name、heap_name、bytes、allocation_count、heap_descriptor、parent_heap_descriptorFROM v $ process_memory_detailWHERE pid =&p_1AND category ='Other'; ----pgastatsの2番目のパスを取得--oradebugdumppga_detail_get &p_1exec dbms_lock.sleep(120)----pgastatsの2番目のパスを保存--CREATETABLEtab2 ASSELECT pid、category、name、heap_name、bytes、allocation_count、heap_descriptor、parent_heap_descriptorFROM v $ process_memory_detailWHERE pid =&p_1AND category ='Other'; ----最終レポートの開始----PGAヒープ情報--COLUMNカテゴリHEADING"Category"COLUMN name HEADING "Name" COLUMN heap_name HEADING "Heap name" COLUMN q1 HEADING "Memory 1st" Format 999,999,999,999COLUMN q2 HEADING "Memory 2nd "フォーマット999,999,999,9 99COLUMN diff HEADING "Difference" Format S999,999,999,999SET LINES 150SELECT tab2.pid、tab2.category、tab2.name、tab2.heap_name、tab1.bytes q1、tab2.bytes q2、tab2.bytes-tab1.bytes diffFROM tab1、tab2WHERE tab1.category =tab2.categoryAND tab1.name =tab2.nameAND tab1.heap_name =tab2.heap_nameand tab1.pid =tab2.pidAND tab1.bytes <> tab2.bytesORDER BY 1、7 DESC; ---- Logminer PGA info- -COLUMN heap_name HEADING "heap name" COLUMN name HEADING "Type" COLUMN distribution_count HEADING "Count" COLUMN bytes HEADING "Sum" COLUMN avg HEADING "Average" FORMAT 99999D99SELECT pid、heap_name、name、allocation_count、bytes、bytes / distribution_count avgFROM tab2WHER 'Logminer%'のように;スプールオフドロップテーブルtab1パージ;ドロップテーブルtab2パージ; 

    このコードをスクリプトとして保存し、テキストを編集して、文字列をLogMinerを実行しているユーザーアカウントに置き換えます。スクリプトは特にLogminerメモリを対象としているため、増加を監視できます。また、他の問題のあるメモリ領域を探すように変更することもできます。他のメモリ領域が重要になる可能性があるため、必要に応じて、「ドロップテーブル」コマンドにコメントを付けて、tab1とtab2を保存してさらに調査します。また、既知のPGA関連の問題についてOracleサポートを確認してください。このようなレポートには、V$PROCESS_MEMORY_DETAILを使用して特定の問題領域を調査するために使用するクエリが含まれている可能性があります。便宜上、これらの追加のクエリを上記のコードに追加して、プロセスメモリの疑わしいすべての領域についてレポートすることができます。このデータは、特定の1回限りのパッチをデータベースに適用する必要性を証明するのに役立ちます。

    Log Minerは、データベースに対する現在および比較的最近の過去のアクションを調査するのに非常に便利なツールです。 Log Minerセッションがアクティブな間は、pga_aggregate_limitを増やすなどの予防措置を実行でき、セッションが突然終了しないように、PGA割り当てを監視する必要がある場合があります。ことわざにあるように、「事前に警告されている」と言われています。DBAには4つの腕がありませんが、何が先にあるかを知ることは、常に持つ価値のある知識です。

    DavidFitzjarrellによるすべての記事を見る


    1. HibernateでOracleDateを使用する場合の日付/時刻のJavaタイプ

    2. SQLでテーブルの最後のレコードを選択するにはどうすればよいですか?

    3. PostgreSQL11を使用したデータのシャーディング

    4. エラー:表xxxの表スペースが存在します。インポートする前にテーブルスペースを破棄してください