Docker部署的PostgreSQL慢查询日志配置指南
目录
1. 核心步骤
1.1 修改配置文件
1.2 动态加载配置(无需重启容器)
1.3 验证配置生效
1.3.1 查看参数
1.3.2 执行测试慢查询
2. 高级用法
2.1 使用分析工具
2.2 启用扩展
3. 注意事项
3.1 日志目录权限
3.2 性能影响
配置Docker部署的PostgreSQL记录慢查询日志,需通过修改配置文件核心参数实现。以下是完整步骤及注意事项,适用于PostgreSQL 10+版本:
1. 核心步骤
1.1 修改配置文件
- 进入容器
docker exec -it <容器名或ID> bash
- 编辑配置文件(通常位于 /var/lib/postgresql/data/postgresql.conf):
vim /var/lib/postgresql/data/postgresql.conf
- 添加或修改以下参数:
#慢查询阈值(单位:毫秒);记录超过10000ms(10秒)的查询
log_min_duration_statement = 10000 #日志记录格式(增强可读性);时间戳、进程ID、用户、数据库名
log_line_prefix = '%m [%p] %u@%d ' #确保日志输出到标准输出
log_destination = 'stderr' #启动日志收集功能,将日志写入文件
logging_collector = on #【可选】自定义日志目录
log_directory = '/var/log/postgresql' #【可选】自定义日志文件[可选]
log_filename = 'postgresql-%a.log' #【可选】记录连接/断开事件(辅助定位慢查询上下文)
log_connections = on
log_disconnections = on#【可选】记录锁等待(辅助分析锁竞争)
log_lock_waits = on#【可选】日志文件命名格式(按日期时间切割)
log_filename = 'postgresql-%Y%m%d_%H%M%S.log'#【高级用法】日志自动切割策略(每天切割一次,或 1GB 切割)
log_rotation_age = '1d'
log_rotation_size = '1GB'#【高级用法】仅对特定数据库/用户启用慢日志
# 对数据库 'lmzf_db' 设置5000ms阈值
ALTER DATABASE lmzf_db SET log_min_duration_statement = 5000;
1.2 动态加载配置(无需重启容器)
# 在容器内执行
su - postgres
pg_ctl reload -D /var/lib/postgresql/data
或在宿主机执行:
docker exec <容器名> su - postgres -c 'pg_ctl reload'
1.3 验证配置生效
1.3.1 查看参数
SHOW log_min_duration_statement;
docker exec <容器名> psql -U postgres -c "SHOW log_min_duration_statement;"
1.3.2 执行测试慢查询
SELECT pg_sleep(12);
docker exec <容器名> psql -U postgres -c "SELECT pg_sleep(12);"
观察日志文件是否生成记录。
2. 高级用法
2.1 使用分析工具
可以使用第三方工具如 pgBadger 对慢查询日志进行分析,生成详细的性能报告,帮助识别性能瓶颈。安装 pgBadger 后,运行以下命令生成报告:
pgbadger /path/to/postgresql.log
2.2 启用扩展
pg_stat_statements
是 PostgreSQL 内置的统计扩展,可记录 SQL 的执行次数、总耗时等详细信息(比日志更轻量)。启用步骤:
-- 1. 在 postgresql.conf 中启用扩展
shared_preload_libraries = 'pg_stat_statements' # 添加到该行-- 2. 重启 PostgreSQL 服务
pg_ctl restart -D /path/to/postgresql/data-- 3. 创建扩展
CREATE EXTENSION pg_stat_statements;-- 4. 查询慢 SQL 统计(按总耗时排序)
SELECT query, total_time, calls, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
3. 注意事项
3.1 日志目录权限
若自定义路径,需提前在 Docker 挂载卷中创建目录并赋予 postgres 用户写权限。
3.2 性能影响
过低的阈值(如 100ms 以下)可能增大 I/O 负载,建议根据业务压力逐步调整。