TungstenReplicatorエクストラクタがOracle11gデータベースに大きな負荷をかけている理由を調査しています。レプリケーションは同期CDCを使用するように設定されており、エクストラクタがnot実行されている間は異常な負荷は発生しません。これにより、によって登録されたトリガーがCDCパッケージは、大きな負荷をかけることなく、問題なく動作しています。
エクストラクタが実行されている場合、データベースサーバーの平均負荷は60に達する可能性がありますが、常にそれほど高くはありません。ほとんどの場合、差異は書き込みの数に依存します。
この負荷の原因を特定するには、データベースのどの構成パラメーターやメトリックを調べる必要がありますか?タングステンは、以下に概説するように、単に標準のCDC手順を実行しているようです。
エクストラクタの最初の準備手順:
セットアップスクリプトによって準備されたテーブルから抽出するテーブルのリストを取得します。
SELECT * FROM TUNGSTEN_SOURCE_TABLES
ソーステーブルごとに、抽出する列のリストを取得します。
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
DBMS_CDC_SUBSCRIBE.CREATE_SUBSCRIPTION
でサブスクリプションを作成しますDBMS_CDC_SUBSCRIBE.SUBSCRIBE
を使用して各ソーステーブルのサブスクライバービューを作成しますDBMS_CDC_SUBSCRIBE.ACTIVATE_SUBSCRIPTION
でサブスクリプションをアクティブ化します実行中のエクストラクタの内部ループ:
DBMS_CDC_SUBSCRIBE.EXTEND_WINDOW
で拡張します各サブスクリプションビューを選択して、変更をフェッチします
-- 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$
DBMS_CDC_SUBSCRIBE.PURGE_WINDOW
でサブスクリプションウィンドウを削除します環境:
データベースインスタンスへのアクセスが制限されているため、パラメータのOracle側を調整できませんでしたが、複製されているテーブルと列を削除した後、データベースの負荷が改善されました。
エクストラクターを数時間実行して、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
}
}
テーブルのリストを見て、それらのいずれかを除外できるかどうかを自問してください。
CLOB
列を除外します。DBMS_CDC_PUBLISH.CREATE_CHANGE_TABLE
で列のサブセットを指定した場合でも、すべての変更は変更テーブルに記録されます1。ただし、CLOB
列を除外することで、コストのかかる書き込みと読み取りの負荷を軽減できます。複製するテーブルと列を決定したら、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'と新しい値を持つ別のレコードを生成します。( ソース )