2016-03-29 12 views
2

Ich frage mich, ob es möglich ist, Transaktionen Abfrage mit Standard-Abfrage auswählen.Abfrage Transaktionslog in Postgresql

Zum Beispiel:

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

das Ergebnis etwas wie

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

Die Abfrage funktioniert nicht, weil es keine solche Tabelle als transaction_logs ist, sondern tut etwas ähnlich wie diese existieren?

+1

Nein, so etwas ist nicht eingebaut. Sie suchen wahrscheinlich nach einem Audit-Trigger: http://okbob.blogspot.de/2015/01/most-simply-implementation-of-history.html oder http://8kb.co.uk/blog/2015/01/19/Kopieren-Pavel-Stehules-Simple-History-Tabelle-aber-mit-der-JSONB-Typ/ –

+0

Dies ist nicht das, was ich wollte, aber es ist einfach genug zu implementieren. Vielen Dank! –

Antwort

4

Sie können den Write-Ahead-Protokolldatenstrom über einen logischen Replikationssteckplatz abfragen.

Zuerst müssen Sie ein paar Parameter ändern und dann den Server neu starten, damit die Änderungen wirksam werden:

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

dann (nach dem Neustart) benötigen Sie einen Slot zu erstellen:

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

Hier ist test_decoding ein Ausgabe-Plugin-Name, der Protokolldatensätze (die binär sind) in eine Textdarstellung konvertieren soll.

Dann lassen Sie uns eine Tabelle erstellen ...

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

Jetzt können Sie WAL-Stream abfragen:

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) 

Leider, jetzt können Sie DDL nicht dekodieren, so dass Sie nur BEGIN und END erhalten . Xid Feld steht für Transaktionsnummer.

Aber lassen Sie uns etwas einfügen ...

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

nun den Strom Abfrage wieder:

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) 

Hier können Sie den Tabellennamen und eingefügten Werte sehen.

Das gleiche gilt für eine Update-Anweisung:

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) 

Beachten Sie, dass, nachdem Sie einige Änderungen aus dem Strom „verbrauchen“ von pg_logical_slot_get_changes Funktion verwenden, können Sie nicht wieder die gleichen Änderungen abfragen.

den Schlitz fallen, wenn Sie es nicht mehr benötigen:

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

(1 row) 

Sie können in the documentation mehr über logische Decodierung lesen.