背景
OceanBase データベースは V4.3.0 でフルダイレクトロードをサポートしましたが、この方法ではインポート効率が最適ではありませんでした。そのため、OceanBase データベースは V4.3.1 で増分ダイレクトロード機能を導入しました。簡単に言えば、増分ダイレクトロードは「置き換え」のセマンティクスを持ち、主キーの競合をチェックせず、重複する主キーを含む行を直接置き換えます。詳細については、ダイレクトロードの概要を参照してください。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];