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

ApsaraDB RDS:論理デコーディング (wal2json)

最終更新日:Jun 21, 2026

RDS for PostgreSQL は、論理ログファイルを JSON 形式で出力するための wal2json プラグインを提供します。

前提条件

  • インスタンスは、RDS for PostgreSQL 10 以降である必要があります。

    RDS for PostgreSQL 16 の場合、マイナーバージョンは 20240830 以降である必要があります。

    説明

    現在、RDS for PostgreSQL 17 はこのプラグインをサポートしていません。

  • インスタンスパラメータ wal_levellogical に設定する必要があります。詳細については、「インスタンスパラメータの設定」をご参照ください。

背景情報

wal2json は、WAL を解析し、INSERT 操作および UPDATE 操作で生成されたタプルにアクセスするための論理デコーディングプラグインです。

wal2json プラグインは、トランザクションごとに JSON オブジェクトを生成します。このオブジェクトには、すべての新しいタプルと古いタプルが含まれます。また、トランザクションのタイムスタンプ、スキーマ、データ型、トランザクション ID などの追加プロパティを含めることもできます。詳細については、「SQL を使用した JSON オブジェクトの取得」をご参照ください。

SQL を使用した JSON オブジェクトの取得

  1. DMS を使用して RDS for PostgreSQL データベースにログインします。

  2. 次のコマンドを実行して、テーブルを作成し、プラグインを初期化します。

    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);
    SELECT 'init' FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
    説明

    wal2json プラグインは CREATE EXTENSION を使用して作成する必要はありません。代わりに、論理レプリケーションスロットを介してプラグインをロードし、使用します。

  3. 次のコマンドを実行して、データを変更します。

    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;
  4. 次のコマンドを実行して、ログデータを JSON 形式で出力します。

    SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');

    このコマンドは、WAL ログデータを JSON 形式で返します。このデータには、"kind": "insert""schema": "public""table": "table2_with_pk""columnnames": ["a", "b", "c"]"columntypes": ["integer", "character varying(30)", "timestamp without time zone"] などのフィールドが含まれており、ターゲットテーブルに対する挿入操作の詳細が示されます。

    説明

    出力を停止してリソースを解放するには、次のコマンドを実行します。

    SELECT 'stop' FROM pg_drop_replication_slot('test_slot');