如何读取Postgres事务日志

9

我希望只阅读已提交的事务中的所有SQL查询。我使用的是Postgres 9.5,或者可以升级到PG 11。我需要以SQL格式获取事务日志。


你说的“SQL格式事务日志”是什么意思?你试图解决的实际问题是什么? - user330315
2个回答

9

事务日志(WAL)中不包含运行的SQL语句,而是包含对数据文件的二进制更改:例如“在文件76183的块42中,将24个字节更改为其他内容”。

从PostgreSQL 9.6开始,引入了逻辑解码(logical decoding),它使得逻辑解码插件能够解析这些WAL信息并从二进制WAL信息和数据库元数据中“反向工程”逻辑信息(如SQL语句)。

这就是你需要采取的方向。查看test_decodingwal2json,或许你会找到你要找的内容。

在PostgreSQL 9.5中没有这种功能。


5

我不理解你的问题,但我知道如何记录所有PostgreSQL查询,包括事务查询,例如BEGINCOMMIT(使用PostgreSQL 14版本)。

为此,您需要运行以下任一查询,然后重新启动PostgreSQL以启用持久日志记录。*使用ALTER SYSTEM SET参数设置为postgresql.auto.conf而不是postgresql.conf

ALTER SYSTEM SET log_statement = 'all';

或者:

ALTER SYSTEM SET log_min_duration_statement = 0;

然后,所有查询(包括事务查询,如BEGINCOMMIT)都会被记录,如下所示。*我的回答详细解释了在PostgreSQL中的日志记录:

2022-08-20 22:09:12.549 JST [26756] LOG:  duration: 0.025 ms  statement: BEGIN
2022-08-20 22:09:12.550 JST [26756] LOG:  duration: 1.156 ms  statement: SELECT "store_person"."id", "store_person"."first_name", "store_person"."last_name" FROM "store_person" WHERE "store_person"."id" = 33 LIMIT 21
2022-08-20 22:09:12.552 JST [26756] LOG:  duration: 0.178 ms  statement: UPDATE "store_person" SET "first_name" = 'Bill', "last_name" = 'Gates' WHERE "store_person"."id" = 33
2022-08-20 22:09:12.554 JST [26756] LOG:  duration: 0.784 ms  statement: INSERT INTO "django_admin_log" ("action_time", "user_id", "content_type_id", "object_id", "object_repr", "action_flag", "change_message") VALUES ('2022-08-20T13:09:12.553273+00:00'::timestamptz, 1, 20, '33', 'Bill Gates', 2, '[]') RETURNING "django_admin_log"."id"
2022-08-20 22:09:12.557 JST [26756] LOG:  duration: 1.799 ms  statement: COMMIT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接