PolarDB for PostgreSQL および は、論理ログファイルを JSON 形式で出力する wal2json プラグインを提供しています。
適用範囲
以下の PolarDB for PostgreSQL のマイナーエンジンバージョンが wal2json をサポートしています。
-
PostgreSQL 18 (マイナーエンジンバージョン 2.0.18.1.1.0 以降)
-
PostgreSQL 17 (マイナーエンジンバージョン 2.0.17.7.5.0 以降)
-
PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.6.2.0 以降)
-
PostgreSQL 15 (マイナーエンジンバージョン 2.0.15.12.4.0 以降)
-
PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.5.1.0 以降)
-
PostgreSQL 11 (マイナーエンジンバージョン 2.0.11.9.29.0 以降)
コンソールで、または SHOW polardb_version; ステートメントを実行してマイナーエンジンバージョンを確認できます。 マイナーエンジンバージョンが要件を満たさない場合は、マイナーエンジンバージョンをアップグレードしてください。
背景情報
wal2json は論理デコーディングの出力プラグインで、以下の機能を提供します。
-
INSERTおよびUPDATEによって生成されたタプルへのアクセス -
設定されたレプリカアイデンティティに基づく、
UPDATEおよびDELETEの古い行バージョンへのアクセス -
ストリーミングプロトコル (論理レプリケーションスロット) または専用の SQL API を使用した変更の取得
wal2json プラグインは、トランザクションごとに JSON オブジェクトを生成します。JSON オブジェクトには、すべての新旧タプルが含まれます。追加オプションにより、トランザクションのタイムスタンプ、スキーマ名、データ型、トランザクション ID などのプロパティを含めることもできます。詳細については、「SQL による JSON オブジェクトの取得」をご参照ください。
使用上の注意
-
PolarDB for PostgreSQL はレプリケーション方式として
REPLICA_IDENTITY_FULLを使用するため、更新および削除の際に、変更された列のみではなく行全体のデータが出力されます。変更された列のみをログに記録するには、polar_create_table_with_full_replica_identityパラメータを無効にします。このパラメータはコンソールで変更できません。サポートが必要な場合は、お問い合わせください。 -
wal2json プラグインは、論理デコーディング機能に依存します。このため、
wal_levelパラメータの値をlogicalに設定する必要があります。説明wal_level パラメータはコンソールで設定できます。詳細については、「クラスターパラメーターの設定」または「」をご参照ください。このパラメータを変更すると、クラスターが再起動します。作業を計画し、注意して実行してください。
SQL による JSON オブジェクトの取得
wal2json プラグインのインストールに CREATE EXTENSION は必要ありません。代わりに、論理レプリケーションスロットを介してロードされます。
-
wal2json プラグインを使用して論理レプリケーションスロットを作成し、以下のコマンドを実行して WAL から JSON オブジェクトを取得します。
-- プライマリキーあり/なしのテーブルを作成 CREATE TABLE table2_with_pk (a SERIAL, b VARCHAR(30), c TIMESTAMP NOT NULL, PRIMARY KEY(a, c)); CREATE TABLE table2_without_pk (a SERIAL, b NUMERIC(5,2), c TEXT); -- wal2json タイプの論理レプリケーションスロットを作成 SELECT 'init' FROM pg_create_logical_replication_slot('test_slot', 'wal2json'); -- トランザクションをコミットして WAL に書き込む BEGIN; INSERT INTO table2_with_pk (b, c) VALUES('Backup and Restore', now()); INSERT INTO table2_with_pk (b, c) VALUES('Tuning', now()); INSERT INTO table2_with_pk (b, c) VALUES('Replication', now()); DELETE FROM table2_with_pk WHERE a < 3; INSERT INTO table2_without_pk (b, c) VALUES(2.34, 'Tapir'); UPDATE table2_without_pk SET c = 'Anta' WHERE c = 'Tapir'; COMMIT; -- WAL から JSON オブジェクトを取得 SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');次の出力が返されます。
{ "change": [ { "kind": "insert", "schema": "public", "table": "table2_with_pk", "columnnames": ["a", "b", "c"], "columntypes": ["integer", "character varying(30)", "timestamp without time zone"], "columnvalues": [1, "Backup and Restore", "2018-03-27 12:05:29.914496"] } ,{ "kind": "insert", "schema": "public", "table": "table2_with_pk", "columnnames": ["a", "b", "c"], "columntypes": ["integer", "character varying(30)", "timestamp without time zone"], "columnvalues": [2, "Tuning", "2018-03-27 12:05:29.914496"] } ,{ "kind": "insert", "schema": "public", "table": "table2_with_pk", "columnnames": ["a", "b", "c"], "columntypes": ["integer", "character varying(30)", "timestamp without time zone"], "columnvalues": [3, "Replication", "2018-03-27 12:05:29.914496"] } ,{ "kind": "delete", "schema": "public", "table": "table2_with_pk", "oldkeys": { "keynames": ["a", "c"], "keytypes": ["integer", "timestamp without time zone"], "keyvalues": [1, "2018-03-27 12:05:29.914496"] } } ,{ "kind": "delete", "schema": "public", "table": "table2_with_pk", "oldkeys": { "keynames": ["a", "c"], "keytypes": ["integer", "timestamp without time zone"], "keyvalues": [2, "2018-03-27 12:05:29.914496"] } } ,{ "kind": "insert", "schema": "public", "table": "table2_without_pk", "columnnames": ["a", "b", "c"], "columntypes": ["integer", "numeric(5,2)", "text"], "columnvalues": [1, 2.34, "Tapir"] } ,{ "kind": "update", "schema": "public", "table": "table2_without_pk", "oldkeys": { "keynames": ["a", "b", "c"], "keytypes": ["integer", "numeric(5,2)", "text"], "keyvalues": [1, 2.34, "Tapir"] }, "columnnames": ["a", "b", "c"], "columntypes": ["integer", "numeric(5,2)", "text"], "columnvalues": [1, 2.34, "Anta"] } ] } -
test_slotという名前のレプリケーションスロットを削除し、文字列'stop'を返します。SELECT 'stop' FROM pg_drop_replication_slot('test_slot');
パラメータ
以下の表に、wal2json のパラメータを示します。
|
パラメータ |
説明 |
|
change |
INSERT、UPDATE、DELETE、TRUNCATE などの単一の DML 操作に対する WAL エントリです。 |
|
changeset |
change エントリのコレクションです。 |
|
include-xids |
各チェンジセットにトランザクション ID (xid) を追加するかどうかを指定します。デフォルト値は false です。有効な値:
|
|
include-timestamp |
各チェンジセットにタイムスタンプを追加するかどうかを指定します。デフォルト値は false です。有効な値:
|
|
include-schemas |
各 change にスキーマ名を追加するかどうかを指定します。デフォルト値は true です。有効な値:
|
|
include-types |
各 change にデータ型を追加するかどうかを指定します。デフォルト値は true です。有効な値:
|
|
include-typmod |
varchar ではなく varchar(20) のように、修飾子を持つ型に対して型修飾子を追加するかどうかを指定します。デフォルト値は true です。有効な値:
|
|
include-type-oids |
型 OID を追加するかどうかを指定します。デフォルト値は false です。有効な値:
|
|
include-not-null |
columnoptionals として
|
|
pretty-print |
JSON 出力を整形するために、空白とインデントを追加するかどうかを指定します。デフォルト値は false です。有効な値:
|
|
write-in-chunks |
各チェンジセットの後ではなく、各 change の後に出力するかどうかを指定します。デフォルト値は false です。有効な値:
|
|
include-lsn |
各チェンジセットに次の LSN (nextlsn) を追加するかどうかを指定します。デフォルト値は false です。有効な値:
|
|
filter-tables |
特定のテーブルを除外します。デフォルト値は空で、テーブルをフィルタリングしないことを意味します。 説明
|
|
add-tables |
デコードするテーブルを指定します。デフォルトでは、すべてのスキーマ内のすべてのテーブルがデコードされます。構文は filter-tables と同じです。 |
|
filter-msg-prefixes |
特定のメッセージプレフィックスを持つ行を除外します。このパラメータは通常、 |
|
add-msg-prefixes |
特定のメッセージプレフィックスを持つ行のみを含めます。このパラメータは通常、 |
|
format-version |
出力形式のバージョンを指定します。デフォルト値は 1 です。有効な値:
|
|
actions |
出力に含める操作を指定します。デフォルト値はすべて (INSERT、UPDATE、DELETE、TRUNCATE) です。 |
例
このセクションでは、include-xids を例に、パラメータの使用方法を説明します。
-
テーブルと論理レプリケーションスロットを作成し、行を 1 件挿入します。
DROP TABLE IF EXISTS tbl; CREATE TABLE tbl (id int); SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'wal2json'); INSERT INTO tbl VALUES (1); -
関数でパラメータ名と値を指定します。
SELECT count(*) = 1, count(distinct ((data::json)->'xid')::text) = 1 FROM pg_logical_slot_get_changes( 'regression_slot', NULL, NULL, 'format-version', '1', 'include-xids', '1');
設計原則
詳細および設計原則については、「公式ドキュメント」をご参照ください。