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.
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/ –
Dies ist nicht das, was ich wollte, aber es ist einfach genug zu implementieren. Vielen Dank! –