gpt4 book ai didi

postgresql - 在postgresql中查询事务日志

转载 作者:行者123 更新时间:2023-11-29 11:53:11 25 4
gpt4 key购买 nike

我想知道是否可以使用标准查询选择来查询交易。

例如:

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...}|

查询不成功,因为没有 transaction_logs 这样的表,但是是否存在类似的东西?

最佳答案

您可以通过逻辑复制槽查询预写日志流。

首先,您需要更改几个参数,然后重新启动服务器以使更改生效:

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=# create table product(id serial, val json);
CREATE TABLE

现在可以查询WAL流了:

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。 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)

在这里您可以看到表名和插入的值。

更新语句也是如此:

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)

请注意,在您使用 pg_logical_slot_get_changes 函数“消费”流中的某些更改后,您无法再次查询相同的更改。

如果您不再需要插槽,请删除插槽:

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

(1 row)

您可以阅读有关逻辑解码的更多信息 in the documentation .

关于postgresql - 在postgresql中查询事务日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36291676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com