tech_memo / ORACLE / Oracle_Streams


tech_memo/ORACLE

サブコンポーネントの状態

エラーキュー

https://docs.oracle.com/cd/E16338_01/server.112/b61351/strms_apply.htm

トラブルシュート

ORA-01281、ORA-01347で、Captureプロセスが停止する。

  • Oracle Streamsを利用するため、テーブルレベルのサプリメンタルロギングを有効にしているが、同時にDBレベルの最小ロギングも有効化されていた。
    select supplemental_log_data_min from v$database;
    -- 上記結果がYES
  • 試しに以下で、上記設定を外してみた
    ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
  • すると、Captureプロセスが異常終了し、再起動しても、以下のいずれかのエラーでABORTするようになった
    ORA-01281: SCN range specified is invalid
    ORA-01347: Supplemental log data no longer found.
  • DBレベルの最小ロギングを再有効化しても直らない。。。
    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
  • 色々やってみた結果、CaptureプロセスはLogMiner?を使用しているようで、起動時のREDO読み込みで正しいデータが取得できていない模様。
  • 上記オペレーション(DBレベルの最小ロギングOFF)のせいで、サプリメンタルロギングが有効・無効のレコードがREDOに交じってしまったのが原因と思われる。
  • 以下の手順でCaptureプロセスを復帰できた。
    1. REDOログスイッチ。カレントREDOがアーカイブ化される(このアーカイブログが不正データ)
      alter system switch logfile;
    2. アーカイブログファイルを直接削除
      rm -f <アーカイブログ>
    3. Captureプロセス起動
  • プロセスは正常に上がるようになったが、今度はCaptureプロセスが、REDOからLCRを取得してエンキューする処理が行われない。
  • 以下の管理テーブルのレコードを削除して、もう一度再起動したところ、エンキュー処理が行われるようになった。(下記テーブルの詳細はあまりわかっていない)
    truncate table LOGMNR_RESTART_CKPT$;

仕組み

Captureプロセス

  1. REDOからメッセージを取得 → LCR
  2. LCRを含んだメッセージを作成 → 取得LCR
  3. 取得LCRをエンキュー → バッファキュー
    • メモリキュー。Streams_poolを利用。溢れるとキュー表(ディスク)に書かれる

Synchronous Captureプロセス

  • 永続キューにエンキュー

監視・確認

Captureプロセス

Captureプロセスが最後にLCRを作成した時間など

  • 以下の情報を取得
    • 取得プロセスの名前。
    • 取得プロセスの現在の状態
    • 取得プロセスの状態が最後に変更された日時。
    • 取得プロセスで最後にLCRが作成された日時。
      COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15
      COLUMN STATE HEADING 'State' FORMAT A27
      COLUMN STATE_CHANGED HEADING 'State|Change Time'
      COLUMN CREATE_MESSAGE HEADING 'Last Message|Create Time'
      
      SELECT CAPTURE_NAME,
            STATE,
            TO_CHAR(STATE_CHANGED_TIME, 'HH24:MI:SS MM/DD/YY') STATE_CHANGED,
            TO_CHAR(CAPTURE_MESSAGE_CREATE_TIME, 'HH24:MI:SS MM/DD/YY') CREATE_MESSAGE
       FROM V$STREAMS_CAPTURE;

Captureプロセス処理時間

  • 以下の情報を取得
    • 取得プロセスの名前。
    • 取得の経過時間。取得プロセスが最後に起動されてから、REDOログ内の変更のスキャンにかかった時間(秒)を示します。
    • ルール評価の経過時間。取得プロセスが最後に起動されてから、ルール評価にかかった時間(秒)を示します。
    • エンキューの経過時間。取得プロセスが最後に起動されてから、メッセージのエンキューにかかった時間(秒)を示します。
    • LCR作成の経過時間。取得プロセスが最後に起動されてから、論理変更レコード(LCR)の作成にかかった時間(秒)を示します。
    • 停止の経過時間。取得プロセスが最後に起動されてから、フロー制御のために停止した時間(秒)を示します。
      • 注意:
        この問合せに関するすべての時間は秒単位で表示されます。デフォルトでは、V$STREAMS_CAPTUREビューには経過時間がセンチセカンドで表示されます。
        センチセカンドは、 100分の1秒です。この項で説明する問合せを実行すると、各経過時間が100で割られ、秒単位で表示されます。
        データベースの各取得プロセスに関する前述の情報を表示するには、次の問合せを実行します。
  • SQL
    COLUMN CAPTURE_NAME HEADING 'Capture|Name' FORMAT A15
    COLUMN ELAPSED_CAPTURE_TIME HEADING 'Elapsed|Capture|Time' FORMAT 99999999.99
    COLUMN ELAPSED_RULE_TIME HEADING 'Elapsed|Rule|Evaluation|Time' FORMAT 99999999.99
    COLUMN ELAPSED_ENQUEUE_TIME HEADING 'Elapsed|Enqueue|Time' FORMAT 99999999.99
    COLUMN ELAPSED_LCR_TIME HEADING 'Elapsed|LCR|Creation|Time' FORMAT 99999999.99
    COLUMN ELAPSED_PAUSE_TIME HEADING 'Elapsed|Pause|Time' FORMAT 99999999.99
    
    SELECT CAPTURE_NAME,
          (ELAPSED_CAPTURE_TIME/100) ELAPSED_CAPTURE_TIME,
          (ELAPSED_RULE_TIME/100) ELAPSED_RULE_TIME,
          (ELAPSED_ENQUEUE_TIME/100) ELAPSED_ENQUEUE_TIME,
          (ELAPSED_LCR_TIME/100) ELAPSED_LCR_TIME,
          (ELAPSED_PAUSE_TIME/100) ELAPSED_PAUSE_TIME
     FROM V$STREAMS_CAPTURE;

Applyプロセス


Applyプロセスのパラメータ確認

select * from dba_apply_parameters order by 1, 2;

サブコンポーネントの確認

  • リーダーサーバの情報取得
    • クエリ
      select apply_name, state, (dequeue_time - dequeued_message_create_time) * 86400 as latency, to_char(dequeued_message_create_time, 'HH24:MI:SS') as create_time, to_char(dequeue_time, 'HH24:MI:SS') as last_dequeue_time, dequeued_message_number from v$streams_apply_reader;
      • APPLYプロセス名
      • ステータス
      • メッセージが作成されてからデキューされるまでの時間
      • 最後にデキューしたメッセージの作成時刻
      • 最後にデキューしたメッセージのデキュー時刻
      • 最後にデキューしたメッセージのメッセージ番号
    • ビュー定義情報

有効なapplyプロセスの数を確認

  • 下記結果で、TOTAL_MESSEAGES_APPLIEDの値が1以上のものが有効なプロセス
    COLUMN SERVER_ID HEADING 'Apply Server ID' FORMAT 99
    COLUMN TOTAL_MESSAGES_APPLIED HEADING 'Total Messages Applied' FORMAT 999999
    
    SELECT SERVER_ID, TOTAL_MESSAGES_APPLIED 
     FROM V$STREAMS_APPLY_SERVER
     WHERE APPLY_NAME = 'APPLY'
     ORDER BY SERVER_ID;

エラー情報

  • select apply_name, queue_name, queue_owner, source_commit_scn, message_number, error_message, error_creation_time from dba_apply_error;

ルールの確認

select * from dba_streams_rules order by 3, 2, 1;

QUEUE表の情報

  • DBA_QUEUE_TABLES ビュー
  • ALL_QUEUE_TABLES ビュー (ユーザがアクセス可能なQUEUEテーブル)
  • USER_QUEUE_TABLES

QUEUE表の削除

Queue

QUEUEの情報

  • DBA_QUEUES (QUEUE表名もわかる)
  • ALL_QUEUES (上記の中から、ユーザがなんらかの権限をもっているもの)
  • USER_QUEUES

AQ$<QUEUE表名>[_X]

#テーブル名意味
1AQ$<QUEUE表名>キュー表内のメッセージ
2AQ$<QUEUE表名>_Sキューのサブスクライバ
3AQ$<QUEUE表名>_Rキューのサブスクライバおよびそのルール

永続キュー内のメッセージの内容の表示

  • ANYDATAキュー内で、ANYDATAペイロード内にカプセル化されているペイロードの内容を表示するには、ANYDATA型のAccessdata_type統計ファンクションを使用してキュー表を問い合せます。
  • この場合、data_typeは表示するペイロードの型です。
  • たとえば、キュー表oe_q_table_any を持つキューにあるNUMBER型のペイロードの内容を表示するには、キュー所有者として次の問合せを実行します。
    SELECT qt.user_data.AccessNumber() "Numbers in Queue" 
     FROM strmadmin.oe_q_table_any qt;
    • 出力は次のようになります。
      Numbers in Queue
      ----------------
                     16
  • 同様に、キュー表oe_q_table_anyを持つキューにあるVARCHAR2型のペイロードの内容を表示するには、次の問合せを実行します。
    SELECT qt.user_data.AccessVarchar2() "Varchar2s in Queue"
      FROM strmadmin.oe_q_table_any qt;
    • 出力は次のようになります。
      Varchar2s in Queue
      --------------------------------------------------------------------------------
      Chemicals - SW

QUEUEの削除

サブスクライバ

Oracle Streams概要および監視

Best Practice


設定手順 (Step by Step)

Streamsプールの見積もり

Link