背景
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];