如何读取 Postgres 事务日志



我想只读取所有SQL查询提交的事务。我有 Postgres 9.5 或者可以在 PG 11 上更新。我需要获取SQL格式的事务日志

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

从PostgreSQL 9.6开始,有逻辑解码,它使逻辑解码插件能够解析此WAL信息,并从二进制WAL信息和数据库元数据中"逆向工程">逻辑信息(如SQL语句(。

这是你必须采取的方向。看看test_decoding和wal2json,也许你会找到你想要的东西。

PostgreSQL 9.5在这方面没有运气。

我不明白你的问题,但我知道如何记录所有PostgreSQL查询,包括事务查询,如PostgreSQL(版本14(的BEGINCOMMIT

为此,您需要运行以下任一查询,然后重新启动 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

最新更新