|
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) |
