PostgreSQL 開啟慢SQL捕獲在排查問題時是個很有效的手段。根據慢SQL讓我在工作中真正解決了實際問題,很有幫助。
PostgreSQL 日志支持的輸出格式有 stderr(默認)、csvlog 、syslog
一般的錯誤跟蹤,只需在配置文件 【postgresql.conf】簡單設置幾個參數,當然還有錯誤級別等要設置。
logging_collector = on log_destination = 'stderr' log_directory = 'log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
SELECT
name,
setting,
vartype,
boot_val,
reset_val
FROM pg_settings where name in('logging_collector','log_destination','log_directory','log_filename');
默認的跟蹤日志記錄在 pgdate/log 中,如 /usr/local/pgsql/data/log 。
其他幾個重要參數說明:
log_rotation_age = 1440 #minute,多長時間創建新的文件記錄日志。0 表示禁擴展。 log_rotation_size = 10240 #kb,文件多大后創建新的文件記錄日志。0 表示禁擴展。 log_truncate_on_rotation = on #可重用同名日志文件
當需要跟蹤SQL語句或者慢語句,得需要設置以下參數:
log_statement = all #需設置跟蹤所有語句,否則只能跟蹤出錯信息 log_min_duration_statement = 5000 #milliseconds,記錄執行5秒及以上的語句
log_statement:
設置跟蹤的語句類型,有4種類型:none(默認), ddl, mod, all。跟蹤所有語句時可設置為 "all"。
log_min_duration_statement:
跟蹤慢查詢語句,單位為毫秒。如設置 5000,表示日志將記錄執行5秒以上的SQL語句。
當 log_statement=all 和 log_min_duration_statement 同時設置時,將跟蹤所有語句,忽略log_min_duration_statement 設置。所以需按情況設置其中一個或兩個值。
加載配置
select pg_reload_conf(); show log_min_duration_statement;
針對某個用戶或者某數據庫進行設置
alter database test set log_min_duration_statement=5000;
捕獲正在查詢的慢SQL
select * from pg_stat_activity where state<>'idle' and now()-query_start > interval '5 s' order by query_start ;