背景
OceanBaseデータベースはV4.3.0からフルダイレクトロードをサポートしていますが、この方法ではインポート効率が最適ではありません。そのため、OceanBaseデータベースはV4.3.1で増分ダイレクトロード機能を導入しました。簡単に言えば、増分ダイレクトロードとは、主キーの競合をチェックせず、重複する主キーを含む行を直接置き換えるというReplaceのセマンティクスです。詳細については、ダイレクトロードの概要を参照してください。obcdcは増分ダイレクトロードのセマンティクスに適応し、インポートされたデータを下流に出力する必要があります。
注意
obcdcは現在、フルダイレクトロードで同期されたデータを同期することはサポートしておらず、増分ダイレクトロードで同期されたデータのみをサポートしています。
制限事項
obcdcは現在、行外ストレージのLOBデータを同期することはサポートしていません。
前提条件
V4.3.1以降のバージョンのobcdcがデプロイ済みであること。
OceanBaseデータベースがデプロイ済みであり、かつOceanBaseデータベースがV4.3.1以降のバージョンであること。
操作手順
OceanBaseクラスタにテーブル A とテーブル B の2つのテーブルが存在すると仮定します。そのうち、テーブル A のデータは以下のとおりで、col1 列が主キーです:
+------+------+
| col1 | col2 |
+------+------+
| 1 | 11 |
| 2 | 22 |
+------+------+
テーブル B のデータは以下のとおりで、col1 列が主キーです:
+------+------+
| col1 | col2 |
+------+------+
| 1 | 21 |
| 3 | 33 |
+------+------+
ここでは、テーブル B のデータをテーブル A に増分ダイレクトロードする例を挙げて、obcdc側の操作を説明します。
設定ファイルを修正する
設定ファイルで
enable_direct_load_incを1に設定すると、同期増分ダイレクトロードが有効になります。設定ファイルの構成パラメータの詳細については、obcdc構成パラメータの説明を参照してください。enable_direct_load_inc=1設定を有効にする
enable_direct_load_incは再起動後に有効になる構成パラメータであり、obcdcの使用方法によって、有効化する方法は以下の2種類あります。obcdcを自分のデータ消費チェーンに組み込んで使用する場合、書き換えたコードを再コンパイルして実行します。関連する操作については、obcdc開発の説明を参照してください。
obcdc_tailfを使用してobcdc機能を利用する場合、obcdc_tailfコマンドを再度実行します。例:
[admin@test oceanbase]$ ./bin/obcdc_tailf -f libobcdc.conf -D output.txtここでは、設定ファイルの相対パスを
libobcdc.conf、出力データをoutput.txtファイルに保存する例を挙げています。実際の状況に応じて、設定ファイルと出力データファイルを置き換える必要があります。obcdc_tailfコマンドの詳細については、obcdc_tailfを参照してください。
OceanBaseデータベースにログインし、増分ダイレクトロードを実行する
obclient [test]> insert /*+ enable_parallel_dml parallel(2) direct(true, 0, 'inc_replace') */ into A select * from B;コマンドの詳細については、INSERT INTO SELECTステートメントを使用したデータのダイレクトロードを参照してください。
実行結果を確認する
obclient [test]> SELECT * FROM A;出力は以下のとおりで、テーブル
BのデータがテーブルAにインポートされました。+------+------+ | col1 | col2 | +------+------+ | 1 | 21 | | 2 | 22 | | 3 | 33 | +------+------+obcdcの出力を確認する
OceanBaseデータベースで増分ダイレクトロードを実行した後、obcdcは対応する情報を下流に出力します。簡単な例は以下のとおりです:
[EBGIN]; [EPUT] column_name:col1, old_value:1, new_value:1, column_name: col2, new_value: 21; [EPUT] column_name:col1, old_value:3, new_value:3, column_name: col2, new_value: 33; [ECOMMIT];