欢迎阅读!

潇湘夜雨

当前位置: 主页 > 数据库 >

pg数据库在线开启慢sql

时间:2026-03-31 14:35来源:未知 作者:华嵩阳 点击:
1. 查看当前慢sql日志相关设置 以管理员用户登录到数据库节点: postgres=# show log_line_prefix; #日志前缀格式 log_line_prefix ----------------- %m [%p] postgres=# SHOW log_min_duration_statement; #全局慢sql时间
1. 查看当前慢sql日志相关设置
以管理员用户登录到数据库节点:
postgres=# show log_line_prefix; #日志前缀格式
 log_line_prefix
-----------------
 %m [%p]
 
 
postgres=# SHOW log_min_duration_statement; #全局慢sql时间阈值,默认未开启
 log_min_duration_statement
----------------------------
 -1
----------------------------
 
2. 设置数据库慢sql相关参数
ALTER SYSTEM SET log_line_prefix = '%m [%p]: [%l-1] user=%u,db=%d,client=%h '; #日志前缀格式
• 作用:定义每行日志的前缀格式
• 解释:
◦ %m:时间戳(带毫秒)
◦ %p:进程 ID
◦ %u:用户名
◦ %d:数据库名
◦ %a:应用名称(由连接参数指定
 
alter database 数据库名 set log_min_duration_statement=2000; 设置指定库的慢sql阈值

postgres=# \c xxx #检查在指定的db参数是否生效
You are now connected to database "rms" as user "postgres".
xxx=# show log_min_duration_statement;
 log_min_duration_statement
----------------------------
 2s
 
查看未设置的db:
yyy=# SELECT name, setting, unit, source, boot_val, reset_val FROM pg_settings WHERE name = 'log_min_duration_statement';
            name            | setting | unit | source  | boot_val | reset_val
----------------------------+---------+------+---------+----------+-----------
 log_min_duration_statement | -1      | ms   | default | -1       | -1
(1 row)
 
geo=# \c xxx
You are now connected to database "xxx" as user "postgres".
xxx=# SELECT name, setting, unit, source, boot_val, reset_val FROM pg_settings WHERE name = 'log_min_duration_statement';
            name            | setting | unit |  source  | boot_val | reset_val
----------------------------+---------+------+----------+----------+-----------
 log_min_duration_statement | 2000    | ms   | database | -1       | 2000
 
返回结果中的 source 字段最为关键-它的值会告诉你参数是在哪里被最终定义的,例如:
database:表明值是通过 ALTER DATABASE ... SET ... 命令设置的,这正是你之前操作的情况-
default:表示使用系统默认值 (-1)-
configuration file:表示在 postgresql.conf 文件中设置。
session:表示在当前会话中被临时更改。
ALTER SYSTEM SET log_min_duration_statement = 5000; #设置全局慢sql时间阈值(如果只是特定的db开启慢sql,就不设置该参数)。
 
3. 检查 log_line_prefix 格式(确保包含 %t)
postgres=# SHOW log_line_prefix;
             log_line_prefix
------------------------------------------
 %m [%p]: [%l-1] user=%u,db=%d,client=%h
 
4. 立即重载配置(无需重启服务)
SELECT pg_reload_conf();
 
5. 查看日志是否生效
 kubectl logs -f --since=1m postgres-repmgr-1-0 -n pg-ha-geo |grep duration
2026-03-24 05:48:26.306 GMT [355586]: [1-1] user=postgres,db=rms,client=20.244.19.78 LOG:  duration: 2431.156 ms  execute <unnamed>: select  b.*, a.type from tbl_parking_lot a
                left join tbl_task_info b  on  a.map_uuid = b.map_uuid and b.is_parking_lot =1
                where a.publish_status = 0
                and a.is_delete = 0
                and b.is_delete = 0


扩展:

1、持久化配置

    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  该配置会记录相关类型的所有语句,不只是慢sql
        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;

2、主从状态查看

psql -c "SELECT pg_is_in_recovery();"
返回 f → 当前是主库
返回 t → 当前是备库
在主节点上查看同步状态
pg_stat_replication 视图
在主节点上,可以通过查询pg_stat_replication 视图来查看复制的详细状态信息,包括每个从节点的同步进度、滞后情况以及连接状态。
pid: 进程ID。
• usesysid: 使用者系统ID。
• usename: 复制连接的用户名。
• application_name: 复制连接的应用程序名称,通常每个从节点会设置一个唯一的名字。
• client_addr: 从节点的IP地址。
• state: 连接状态,可以是 startup, catchup, streaming 等。
• sent_lsn: 主节点最后发送给从节点的WAL记录的位置。
• write_lsn: 从节点接收到的最远的WAL记录的位置。
• flush_lsn: 从节点写入磁盘的最远的WAL记录的位置。
• replay_lsn: 从节点应用的最远的WAL记录的位置。
• sync_priority: 同步复制节点的优先级。
• sync_state: 同步状态,可以是 async, potential, sync, quorum 等
 
查询 pg_stat_replication 视图来获取关于复制进度的信息。这个视图提供了每个正在复制的 WAL 发送者的状态信息,包括它们发送的位置(WAL位置)
SELECT * FROM pg_stat_replication;
 
 
在从节点上查看同步状态
 
pg_stat_wal_receiver 视图
select * from pg_stat_wal_receiver;

3、promtail收集pg日志时合并sql行

日志合并:
 
scrape_configs:
  - job_name: postgres-logs
    static_configs:
      - targets:
          - localhost
        labels:
          job: postgres
          __path__: /var/log/postgresql/*.log  # 根据你的日志路径调整
    pipeline_stages:
      - multiline:
          firstline: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}.*LOG:.*execute'
          next: '^\s+'
      - regex:
          expression

(责任编辑:liangzh)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------