我希望只阅读已提交的事务中的所有SQL查询。我使用的是Postgres 9.5,或者可以升级到PG 11。我需要以SQL格式获取事务日志。
我希望只阅读已提交的事务中的所有SQL查询。我使用的是Postgres 9.5,或者可以升级到PG 11。我需要以SQL格式获取事务日志。
事务日志(WAL)中不包含运行的SQL语句,而是包含对数据文件的二进制更改:例如“在文件76183的块42中,将24个字节更改为其他内容”。
从PostgreSQL 9.6开始,引入了逻辑解码(logical decoding),它使得逻辑解码插件能够解析这些WAL信息并从二进制WAL信息和数据库元数据中“反向工程”逻辑信息(如SQL语句)。
这就是你需要采取的方向。查看test_decoding和wal2json,或许你会找到你要找的内容。
在PostgreSQL 9.5中没有这种功能。
我不理解你的问题,但我知道如何记录所有PostgreSQL查询,包括事务查询,例如BEGIN
和COMMIT
(使用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;
然后,所有查询(包括事务查询,如BEGIN
和COMMIT
)都会被记录,如下所示。*我的回答详细解释了在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