2016-03-29 30 views
2

標準の照会選択を使用してトランザクションを照会できるかどうかは疑問です。例えばpostgresqlのトランザクション・ログを照会

:そこtransaction_logsというような表がありませんが、これに似た何かが存在しないため

SELECT * FROM information_schema.transaction_logs 
WHERE table_name = 'product' AND time_stamp > '2016-01-01'; 

は、結果がクエリは動作しません

===> table_name | operation | old_val_json | new_val_json... 
     product | update | {....desc:...} | {...desc...}| 

のようなものでしょうか?

+1

いいえ、そのようなものは内蔵されていません。おそらく監査トリガーを探しているでしょう:http://okbob.blogspot.de/2015/01/most-simply-implementation-of-history.htmlまたはhttp://8kb.co.uk/blog/2015/01/19/copy-pavel-stehules-simple-history-table-but-the-jsonb-type/ –

+0

これは私が望んでいたものではありませんが、実装するのには簡単です。ありがとう! –

答えて

4

論理レプリケーションスロットを介して先読みログストリームを照会できます。

まず、あなたはパラメータのカップルを変更し、変更が行われるようにするために、サーバーを再起動する必要があります。

postgres=# alter system set wal_level = logical; 
postgres=# alter system set max_replication_slots = 1; 

そして、(再起動後)あなたがスロットを作成する必要があります。

postgres=# SELECT * FROM pg_create_logical_replication_slot('slot', 'test_decoding'); 
slot_name | xlog_position 
-----------+--------------- 
slot  | 2E/839F3300 
(1 row) 

ここで、test_decodingはログレコード(バイナリ)を何らかのテキスト表現に変換するための出力プラグイン名です。

残念ながら
postgres=# SELECT * FROM pg_logical_slot_get_changes('slot', NULL, NULL); 
    location | xid |  data  
-------------+-------+-------------- 
2E/83A0BA48 | 80243 | BEGIN 80243 
2E/83A1D2B8 | 80243 | COMMIT 80243 
(2 rows) 

、今あなたはDDLをデコードすることはできませんので、あなただけのBEGINとENDます:

その後

postgres=# create table product(id serial, val json); 
CREATE TABLE 

今、あなたはWALストリームを照会することができます...のは、テーブルを作成してみましょう。 Xidフィールドはトランザクション番号を表します。

しかしさんが何かを挿入してみましょう...

postgres=# insert into product(val) values ('{"desc":"aaa"}'); 
INSERT 0 1 

今再びストリームを照会:

ここ
postgres=# SELECT * FROM pg_logical_slot_get_changes('slot', NULL, NULL); 
    location | xid |         data         
-------------+-------+------------------------------------------------------------------------ 
2E/83A1D3C0 | 80244 | BEGIN 80244 
2E/83A1D3C0 | 80244 | table public.product: INSERT: id[integer]:1 val[json]:'{"desc":"aaa"}' 
2E/83A1D440 | 80244 | COMMIT 80244 
(3 rows) 

を使用すると、テーブル名や挿入された値を見ることができます。

更新文で同じ

:あなたは pg_logical_slot_get_changes関数を使用してストリームからいくつかの変更を「消費」した後、再度同じ変更を照会することはできませんことを

postgres=# update product set val = '{"desc":"bbb"}'; 
UPDATE 1 
postgres=# SELECT * FROM pg_logical_slot_get_changes('slot', NULL, NULL); 
    location | xid |         data         
-------------+-------+------------------------------------------------------------------------ 
2E/83A1D560 | 80245 | BEGIN 80245 
2E/83A1D560 | 80245 | table public.product: UPDATE: id[integer]:1 val[json]:'{"desc":"bbb"}' 
2E/83A1D5E8 | 80245 | COMMIT 80245 
(3 rows) 

注意。

ドロップスロットあなたはもうそれを必要とする場合:

postgres=# SELECT pg_drop_replication_slot('slot'); 
pg_drop_replication_slot 
-------------------------- 

(1 row) 

あなたは理論的なデコードin the documentationについての詳細を読むことはできません。