すべてのプロダクト
Search
ドキュメントセンター

PolarDB:decoder_raw

最終更新日:Nov 11, 2024

decoder_rawは、テーブルに加えられた変更を生のSQL文に変換できる論理レプリケーション出力プラグインです。 ステートメントをリモートデータベースに適用して、変更をレプリケートできます。 UPDATEおよびDELETEステートメントの場合、プラグインはテーブルのREPLICA IDENTITY設定を使用して、対応するタプル (行) が正確に識別されるようにします。 プラグインは、関連するWAL (write-ahead logging) レコードをデコードすることによってINSERT文を生成します。

前提条件

この拡張機能は、次のエンジンを実行するPolarDB for PostgreSQL (Compatible with Oracle) クラスターでサポートされています。

  • PolarDB for PostgreSQL (Oracle互換) 2.0 (バージョン2.0.14.16.0以降)

説明

次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのリビジョンバージョンを表示できます。

SHOW polar_version;

使用上の注意

デフォルトでは、 PolarDB for PostgreSQL (Compatible with Oracle) クラスターで、Grand Unified Configuration (GUC) パラメーターpolar_create_table_with_full_replica_identityがONに設定されています。 このパラメーターは、テーブルの [FULL] [REPLICA IDENTITY] を指定します。 ALTER TABLE文を使用して、テーブルのREPLICA IDENTITY設定を変更できます。 詳細については、「README」をご参照ください。

使用法

論理レプリケーションスロットの作成

decoder_raw出力プラグインを使用してレプリケーションスロットを作成します。

SELECT pg_create_logical_replication_slot('custom_slot', 'decoder_raw');

テーブルを作成し、テーブルに対して挿入、更新、および削除操作を実行します

CREATE TABLE aa (a INT PRIMARY KEY, b TEXT NOT NULL);
INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');

-- Update a non-selective column
UPDATE aa SET b = 'cc' WHERE a = 1;

-- Update a specific column
UPDATE aa SET a = 3 WHERE a = 1;

-- Update two columns of a specific table
UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;

-- Delete a column
DELETE FROM aa WHERE a = 4;

テーブルの変更の表示

include_transactionパラメーターを設定して、出力にトランザクション情報を含めるかどうかを指定します。

SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
                       data
---------------------------------------------------
 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1;
 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1;
 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2;
 DELETE FROM public.aa WHERE a = 4;
(6 rows)

SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
                              data
----------------------------------------------------------------
 BEGIN;
 COMMIT;
 BEGIN;
 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
 COMMIT;
 BEGIN;
 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1 AND b = 'aa';
 COMMIT;
 BEGIN;
 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1 AND b = 'cc';
 COMMIT;
 BEGIN;
 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2 AND b = 'bb';
 COMMIT;
 BEGIN;
 DELETE FROM public.aa WHERE a = 4 AND b = 'dd';
 COMMIT;
(18 rows)

テーブルへの変更の取得

SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL);
                              data
----------------------------------------------------------------
 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1 AND b = 'aa';
 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1 AND b = 'cc';
 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2 AND b = 'bb';
 DELETE FROM public.aa WHERE a = 4 AND b = 'dd';
(6 rows)

関連ドキュメント

論理レプリケーション出力プラグインの詳細については、「論理デコードプラグイン」をご参照ください。