Postgresql 实时监控慢查询sql语句

发布于:2025-05-29 ⋅ 阅读:(16) ⋅ 点赞:(0)

方法 1:使用 pg_stat_activity 实时查看活动查询
1. 查询当前正在执行的慢查询
sql
SELECT 
  pid,
  now() - query_start AS duration,  -- 查询已运行时间
  query,                            -- 当前执行的 SQL 语句
  state,                            -- 状态(active/idle)
  client_addr,                      -- 客户端 IP
  application_name                  -- 应用名称
FROM pg_stat_activity 
WHERE 
  state = 'active'                  -- 仅查看活动中的查询
  AND now() - query_start > interval '1 second'  -- 自定义慢查询阈值(如1秒)
ORDER BY duration DESC;

方法 2:启用 pg_stat_statements 扩展统计历史慢查询
1. 启用扩展
sql
-- 修改配置文件 postgresql.conf
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all
pg_stat_statements.max = 10000       -- 保留最多 10,000 条 SQL 记录

-- 重启 PostgreSQL
sudo systemctl restart postgresql

-- 在数据库中创建扩展
CREATE EXTENSION pg_stat_statements;
2. 查询历史慢查询统计
sql
SELECT 
  queryid,
  query,                            -- SQL 语句(去重后)
  calls,                            -- 执行次数
  total_exec_time,                  -- 总耗时(毫秒)
  mean_exec_time,                   -- 平均耗时
  rows                              -- 处理的总行数
FROM pg_stat_statements 
ORDER BY total_exec_time DESC 
LIMIT 10;                           -- 显示最耗时的前10条查询

方法 3:结合日志实时监控(自动记录慢查询)
1. 配置慢查询日志
# 修改 postgresql.conf
log_min_duration_statement = 1000    -- 记录执行超过 1 秒的查询
log_checkpoints = on
log_connections = on
log_disconnections = on


2. 使用 tail 实时跟踪日志
tail -f /var/lib/postgresql/数据目录/log/postgresql-*.log | grep "duration:"
3. 日志内容示例
LOG:  duration: 2500.123 ms  statement: SELECT * FROM large_table WHERE column = 'value';