目錄
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 負載,建議根據業務壓力逐步調整。