web-dev-qa-db-ja.com

CDCベースのレプリケーションが高負荷を引き起こしているときに確認するパラメータとメトリックはどれですか?

TungstenReplicatorエクストラクタがOracle11gデータベースに大きな負荷をかけている理由を調査しています。レプリケーションは同期CDCを使用するように設定されており、エクストラクタがnot実行されている間は異常な負荷は発生しません。これにより、によって登録されたトリガーがCDCパッケージは、大きな負荷をかけることなく、問題なく動作しています。

エクストラクタが実行されている場合、データベースサーバーの平均負荷は60に達する可能性がありますが、常にそれほど高くはありません。ほとんどの場合、差異は書き込みの数に依存します。

この負荷の原因を特定するには、データベースのどの構成パラメーターやメトリックを調べる必要がありますか?タングステンは、以下に概説するように、単に標準のCDC手順を実行しているようです。

エクストラクタの最初の準備手順:

  1. セットアップスクリプトによって準備されたテーブルから抽出するテーブルのリストを取得します。

    SELECT * FROM TUNGSTEN_SOURCE_TABLES
    
  2. ソーステーブルごとに、抽出する列のリストを取得します。

    SELECT
      UNIQUE CHANGE_SET_NAME,
      PUB.COLUMN_NAME,
      PUB_ID,
      COL.COLUMN_ID
    FROM TUNGSTEN_PUBLISHED_COLUMNS PUB, ALL_TAB_COLUMNS COL
    WHERE
      SOURCE_SCHEMA_NAME = '{SERVICE_NAME}' AND
      SOURCE_TABLE_NAME = '{TABLE_NAME}' AND
      SOURCE_SCHEMA_NAME = COL.OWNER AND
      SOURCE_TABLE_NAME = COL.TABLE_NAME AND
      PUB.COLUMN_NAME = COL.COLUMN_NAME AND
      CHANGE_SET_NAME = 'TUNGSTEN_CS_{SERVICE_NAME}'
    ORDER BY COL.COLUMN_ID
    
  3. DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTIONでサブスクリプションを作成します
  4. DBMS_CDC_SUBSCRIBE.SUBSCRIBEを使用して各ソーステーブルのサブスクライバービューを作成します
  5. DBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTIONでサブスクリプションをアクティブ化します

実行中のエクストラクタの内部ループ:

  1. サブスクリプションウィンドウをDBMS_CDC_SUBSCRIBE.EXTEND_WINDOWで拡張します
  2. 各サブスクリプションビューを選択して、変更をフェッチします

    -- Receiving changes for the first time
    SELECT
      COLUMN1, COLUMN2, ...,
      CSCN$,
      COMMIT_TIMESTAMP$,
      OPERATION$
    FROM VW_TUNGSTEN_{SERVICE_NAME}{INDEX}
    ORDER BY CSCN$, RSID$
    
    -- Receiving changes after the first window
    SELECT
      COLUMN1, COLUMN2, ...,
      CSCN$,
      COMMIT_TIMESTAMP$,
      OPERATION$
    FROM VW_TUNGSTEN_{SERVICE_NAME}{INDEX}
    WHERE CSCN$ > :lastSCN
    ORDER BY CSCN$, RSID$
    
  3. DBMS_CDC_SUBSCRIBE.PURGE_WINDOWでサブスクリプションウィンドウを削除します

環境:

  • Oracle Database11gリリース11.1.0.6.0-本番
    • 私のクライアントによると、この箱は5年前のものです
    • open_mode:読み取り/書き込み
    • log_mode:archivelog
    • platform_id:10
    • platform_name:Linux IA(32ビット)
  • タングステンレプリケーター3.0.0
1
ento

データベースインスタンスへのアクセスが制限されているため、パラメータのOracle側を調整できませんでしたが、複製されているテーブルと列を削除した後、データベースの負荷が改善されました。

1.どのテーブルが最も更新されているかを判別します。

エクストラクターを数時間実行して、THLを成長させてみてください。次に、次のようなコマンドを使用して、テーブルごとにログに記録された変更の数をカウントできます。

./bin/thl list | gawk -f thl_summary.awk | sort -n -r

thl_summary.awkは次のとおりです。

#!/bin/gawk
# Sum up rows from a `bin/thl list` output
BEGIN {
    OFS="\t"
}
match($0, /- TABLE = (.*)/, a) {
    table=a[1]
}
match($0, /- ROW# = (.*)/, a) {
    rows[table]++
}
END {
    for (k in rows) {
        print rows[k], k
    }
}

2.必要なテーブルと列のみを複製します。

テーブルのリストを見て、それらのいずれかを除外できるかどうかを自問してください。

  • CLOB列を除外します。
    • それらは同期CDCによって実際にはサポートされていません。
    • DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLEで列のサブセットを指定した場合でも、すべての変更は変更テーブルに記録されます1。ただし、CLOB列を除外することで、コストのかかる書き込みと読み取りの負荷を軽減できます。
  • ダウンストリームデータベースで実際には必要ないすべてのテーブルを除外します。
    • 必要に応じて、ビットの非正規化を意味する場合でも、本当に必要な列のサブセットを含むフォールバックテーブルを追加します。
    • TungstenがCDCを構成する方法では、ソース行を1回更新すると、対応する変更テーブルに2つの行が生成されます。2。頻繁に更新されるテーブルがある場合、これらの追加の更新が追加される可能性があります。

複製するテーブルと列を決定したら、tungsten.tablesという名前のファイルでそれらを指定できます。

aSubsetOfTheTable<TAB>column1,...,columnN
wholeTable

次に、setupCDC.shスクリプトをsetupCDC.confで再実行する必要があります。

specific_tables=1

1https://community.Oracle.com/thread/2288254

2更新された行は、operation $ = 'UU' ...とすべての古い値を持つレコードと、operation $ = 'UN'または 'UL'と新しい値を持つ別のレコードを生成します。ソース

1
ento