首页 > 解决方案 > 使用临时文件时,PostgreSQL 查询将数百万次写入日志文件

问题描述

当查询创建临时文件时,它会在日志文件中为每个条目写入两个条目。第一个包含临时文件本身的信息,第二个包含完整的 SQL 查询。像这样的东西:

2020-05-08 11:02:32 EDT 2020-05-08 10:17:04 EDT 19297 60/837 0 LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp19297.3079949", size 297
2020-05-08 11:02:32 EDT 2020-05-08 10:17:04 EDT 19297 60/837 0 STATEMENT:      SELECT ...

有时,一个查询会写入数百万个小临时文件(无论出于何种原因,它都不会创建一个大文件)。但是随后 SQL 查询将在我的 postgresql-10-main.log 文件中记录数百万次并填充日志文件系统。

有没有办法告诉 Postgres 仅在创建第一个临时文件时记录语句?我不想完全禁用此日志记录,因为它对于识别和解决使用过多临时空间的查询非常有帮助。

我目前的日志配置如下:

log_timezone = 'localtime'
log_statement = 'none'
log_duration = off
log_min_duration_statement = 5000
log_line_prefix = '%t %s %p %v %x '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
track_functions = all
log_temp_files = 0
log_autovacuum_min_duration = 0 

谢谢!

标签: postgresqllogging

解决方案


您不能将 PostgreSQL 配置为仅记录第一个临时文件的创建,但您可以设置临时文件大小参数(请注意,日志条目是在删除文件时创建的,而不是在创建时创建的)。

https://www.postgresql.org/docs/9.5/runtime-config-logging.html

log_temp_files(整数)

控制临时文件名和大小的记录。可以为排序、散列和临时查询结果创建临时文件。如果通过此设置启用,则在删除每个临时文件时都会发出一个日志条目。零值记录所有临时文件信息,而正值仅记录大小大于或等于指定数据量的文件。如果此值指定为不带单位,则以千字节为单位。默认设置为 -1,即禁用此类日志记录。只有超级用户可以更改此设置。


推荐阅读