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)
関連ドキュメント
論理レプリケーション出力プラグインの詳細については、「論理デコードプラグイン」をご参照ください。