レプリケーションスロット機能の枠組みを使って、もう一つ別の機能が追加されています。各テーブルへの更新内容をSQLレベルの更新情報として出力するというものです。ロジカルデコーディングと呼ばれます。
ロジカルデコーディングを使うにはpostgresql.confの中のwal_levelの項目をlogicalに設定します。wal_level = logicalはhot_standbyレベルも包含する、もっとも出力情報が多いレベルです。
wal_level = logical
上記の設定を行った上で、以下の関数を使ってロジカルレプリケーションスロットを作成します。2番目の引数には出力を行うプラグインモジュール名を指定します。test_decodingはPostgreSQL 9.4に追加モジュールとして同梱されているシンプルな出力プラグインです。
db1=# SELECT * FROM pg_create_logical_replication_slot('a_logical_slot', 'test_decoding');
slot_name | xlog_position
----------------+---------------
a_logical_slot | 0/A27BB50
(1 row)
スロットのある状態で、データ変更をするSQL(この例では1行目のDELETE命令)を実行して、その後で3行目の関数を実行し、変更内容を取得することができます。
db1=# DELETE FROM t1;
DELETE 5
db1=# SELECT * FROM pg_logical_slot_get_changes('a_logical_slot', NULL, NULL);
location | xid | data
-----------+------+------------------------------------------
0/A27E0E0 | 1899 | BEGIN 1899
0/A27E0E0 | 1899 | table public.t1: DELETE: id[integer]:101
0/A27E210 | 1899 | table public.t1: DELETE: id[integer]:102
0/A27E258 | 1899 | table public.t1: DELETE: id[integer]:103
0/A27E2A0 | 1899 | table public.t1: DELETE: id[integer]:104
0/A27E2E8 | 1899 | table public.t1: DELETE: id[integer]:105
0/A27E370 | 1899 | COMMIT 1899
(7 rows)
元のDELETE命令は一つだけですが、記録としては各行ごとに主キーとDELETE処理が行われていることが分かります。
この他、SQLではなく外部から接続して変更履歴をテキストデータとして取り出すクライアントツールpg_recvlogicalも付属しています。
PostgreSQL 9.4でロジカルデコーディング機能に対して用意されたtest_decoding プラグイン(前述)や各種関数、ツールは、どちらかというとサンプル実装という位置付けであり、直接ユーザーに利益をもたらす機能ではありません。PostgreSQL 9.4で実装されたロジカルデコーディングの枠組みを利用して、今後、新たなレプリケーションツールなどが作られていくことが期待されます。
PostgreSQL 9.4では、他にも将来に向けた基盤機能が追加されています。
例えば、SQL処理の中でバックグラウンドプロセスを動的に作れるようになり、また、共有メモリを動的に確保できるようになりました。これらは、ユーザーが直接使える機能ではありませんが、一つのSQL命令を複数のCPUコアを使って並列に実行するパラレルクエリ機能を将来実装する際の基盤とななる実装です。
今回までの3回の連載で、主なPostgreSQL 9.4の新機能を見てきました。今回のPostgreSQL新バージョンの特徴をあらためてまとめると、以下の3点に集約できます。
(1)は、第1回で紹介したバイナリJSON型や、バイナリJSON型に適用できるGINインデックスの性能改善です。NoSQL製品を使おうか悩んでいるユーザーにPostgreSQLを強力に後押しする機能といえます。
(2)は、マテリアライズドビューのリフレッシュやALTER命令におけるロック競合軽減、SQLによる設定変更機能や、レプリケーション機能の改善が該当します。
そして、ユーザーから見れば直接的な機能追加ではありませんが、(3)でロジカルデコーディングなどの将来に向けた基盤機能が追加されています。
前回の記事で言及したとおり、リリースタイミングが若干遅れておりますが、現時点でもベータ版は入手可能です。ベータ版についても簡単にインストール可能な、Windows環境向けのバイナリセットやインストーラー、各種Linux環境向けのyumリポジトリが用意されています。ぜひ、お手元で試してみてください。
Copyright © ITmedia, Inc. All Rights Reserved.