このトピックでは、ApsaraDB RDS for PostgreSQLが提供するwal2json拡張機能を使用して、論理ログレコードをJSON形式のファイルとしてエクスポートする方法について説明します。
前提条件
RDSインスタンスはPostgreSQL 10以降を実行します。
説明PostgreSQL 16または17を実行するRDSインスタンスでは、拡張機能はサポートされていません。
wal_levelパラメーターはlogicalに設定されています。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
背景情報
wal2jsonは論理的なデコード拡張です。 拡張機能を使用して、INSERTおよびUPDATEステートメントを使用して生成されたタプルにアクセスし、先行書き込みログ (WAL) によって生成されたログレコードを解析できます。
wal2json拡張機能は、トランザクションごとにJSONオブジェクトを生成します。 すべての新旧のタプルは、JSONオブジェクトで使用できます。 トランザクションのタイムスタンプ、スキーマ修飾、データ型、トランザクションIDなどのプロパティを含むその他のオプションもJSONオブジェクトで使用できます。 詳細については、「SQL文を実行してJSONオブジェクトを取得する」をご参照ください。
SQL文を実行してJSONオブジェクトを取得する
次のステートメントを実行してテーブルを作成し、wal2json拡張子を初期化します。
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');
次のステートメントを実行してデータを変更します。
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;
次のステートメントを実行して、論理ログレコードをJSON形式のファイルとしてエクスポートします。
SELECT data FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'pretty-print', '1');
説明論理ログレコードのエクスポートを停止してリソースを解放する場合は、次のステートメントを実行します。
SELECT 'stop' FROM pg_drop_replication_slot('test_slot');