postgresql 可以通过配置参数来记录执行时间超过指定阈值的查询,即慢查询日志。以下是开启慢查询日志的步骤:

1. 修改 postgresql.conf 配置文件
找到 postgresql 的配置文件(通常位于数据目录中,如 /var/lib/postgresql/data/postgresql.conf 或 /etc/postgresql/[版本]/main/postgresql.conf),修改以下参数:
# 开启日志记录 logging_collector = on # 设置日志输出目录(可选) log_directory = 'pg_log' # 设置日志文件名模式(可选) log_filename = 'postgresql-%y-%m-%d_%h%m%s.log' # 记录慢查询(单位:毫秒) log_min_duration_statement = 1000 # 记录执行超过1秒的查询 # 可选:记录所有语句(包括慢查询) #log_statement = 'all' # 可选值为 none, ddl, mod, all # 可选:记录执行计划 #auto_explain.log_min_duration = 1000 #auto_explain.log_analyze = on #auto_explain.log_buffers = on #auto_explain.log_timing = on #auto_explain.log_triggers = on #auto_explain.log_verbose = on #auto_explain.log_nested_statements = on
2. 重新加载配置
不需要重启 postgresql 服务,只需执行以下命令重新加载配置:
# 方法1:使用 psql psql -u postgres -c "select pg_reload_conf();" # 方法2:使用系统命令 sudo systemctl reload postgresql # 根据您的系统和服务管理工具可能不同
3. 验证配置
-- 检查当前配置
select name, setting, unit from pg_settings
where name in ('logging_collector', 'log_min_duration_statement');
4. 查看慢查询日志
日志文件默认会生成在配置的 log_directory 目录中,文件名遵循 log_filename 模式。
5.高级选项
记录执行计划:启用 auto_explain 模块可以记录查询的执行计划
shared_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '1s' auto_explain.log_analyze = on
按用户或数据库记录:
# 只记录特定数据库的慢查询 log_min_duration_statement = 1000 log_connections = on log_disconnections = on log_line_prefix = '%m [%p] %q%u@%d '
日志轮转:
log_rotation_age = 1d # 每天轮转 log_rotation_size = 10mb # 或按大小轮转
6.知识扩展
postgresql 慢查询获取方法整理
1.获取慢查询的方法
- 方法一 :开启慢查询日志
- 方法二 :使用pg_stat_statementes扩展(推荐)
- 方法三 : 捕获当前连接中的查询
2.开启慢查询日志
postgresql.conf
log_destination = 'csvlog' #日志基础设置
logging_collector = on #日志基础设置(重启生效)
log_directory = 'pg_log' #日志基础设置
log_filename = 'postgresql-%y-%m-%d.log' #日志基础设置
log_file_mode = 0600 #日志基础设置
log_truncate_on_rotation = off #日志基础设置
log_rotation_age = 1d #日志基础设置
log_rotation_size = 0 #日志基础设置
log_statement = none #需要记录的语句,默认只记录错误日志。none,ddl,mod,all
log_min_duration_statement = 500 #慢查询最小时长,毫秒。log_statement=all同时设置时失效
shared_preload_libraries = 'auto_explain' #只需要编译,不需要安装扩展
auto_explain.log_min_duration = 1s #超过时长的慢查询,给出执行计划
postgres=# select pg_reload_conf();
针对某个用户或数据说库进行设置
postgres=# alter database db_name set log_min_duration_statement=5000;
postgres=# alter user user_name set log_min_duration_statement=1000;3.pg_stat_statementes扩展(推荐)
pg_stat_statements 模块提供了跟踪服务器执行的所有sql语句的执行统计信息的方法。如果想要开启模块,必须在配置文件中将 pg_stat_statements 添加到 shared_preload_libraries中。因为它需要额外的共享内存,所以必须重启服务添加或删除。当 pg_stat_statements 被加载,会跟踪服务器所有的数据库的统计信息。
为了安全,只有superuser和 pg_read_all_stats role 用户可以访问 sql text 和 queryid。其他用户可以访问 statistics。
根据内部哈希计算具有相同的查询结构,可计划查询(即select,insert,update和delete)就会合并到单个pg_stat_statements条目中。 通常,如果两个查询在语义上等效,则除了查询中出现的文字常量的值之外,它们将被视为相同。 但是,实用命令(即所有其他命令)严格地根据其文本查询字符串进行比较。
安装配置及使用
安装
cd pg_soft/contrib/pg_stat_statements
make && make install
postgres=# create extension pg_stat_statements;重要配置
shared_preload_libraries='auto_explain,pg_stat_statements'
log_min_duration_statement = 100 #慢查询最小时长,毫秒
track_activity_query_size = 10000 #sql文本的最大长度
pg_stat_statements.max = 10000 #跟踪模块中最多保留多少条统计信息,通过lru算法。
pg_stat_statements.track = all #all包括函数内的sql, top不包含函数内的sql), none
pg_stat_statements.track_utility = true #是否跟踪非dml语句 (例如ddl,dcl)
pg_stat_statements.save = true #表示当pg停止时,把信息存入磁盘文件。使用
#重置统计信息 select pg_stat_statements_reset() ; #最慢的top10 select * from pg_stat_statements order by total_time desc limit 10;
4.捕获当前连接中的查询
select * from pg_stat_activity where state<>'idle' and now()-query_start > interval '1 s' order by query_start ;
到此这篇关于postgresql开启慢查询日志的方法详解的文章就介绍到这了,更多相关postgresql慢查询日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论