PostgreSQL打印实时查询语句的三种方法

 更新时间:2025年09月09日 09:13:21   作者:Dontla  
这篇文章主要介绍了三种PostgreSQL实时打印查询的方法:1.通过日志配置记录所有SQL;2.利用pg_stat_activity监控活跃查询;3.使用pg_stat_statements分析历史性能,并提醒生产环境应避免全量记录以减少性能损耗,需要的朋友可以参考下

最后通过后端flask sqlalchemy开启SQLALCHEMY_ECHO每次数据库访问打印实现了:

方法 1:通过 PostgreSQL 日志实时查看

1. 修改 PostgreSQL 配置文件

docker-compose.yml 中挂载的 postgresql.conf 文件中,添加以下日志配置:

# 开启日志记录所有 SQL 语句
log_statement = 'all'

# 设置日志输出格式(推荐包含时间、进程 ID 等)
log_line_prefix = '%t [%p]: [user=%u,db=%d] '

# 开启日志收集器
logging_collector = on
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

2. 重启 PostgreSQL 容器

docker compose down
docker compose up -d

3. 实时查看日志

通过 docker logs 或直接访问挂载的日志目录实时查看:

# 方法 1:通过 docker logs 实时查看
docker compose logs -f postgres

# 方法 2:直接访问宿主机日志目录(假设日志挂载到 ./logs)
tail -f ./logs/postgresql-*.log

日志示例

2025-09-07 16:24:38.123 UTC [1234]: [user=postgres,db=postgres] LOG:  statement: SELECT * FROM my_table;

方法 2:通过 pg_stat_activity 实时监控

1. 查询实时执行的 SQL

定期执行以下 SQL 语句(可通过脚本或 watch 命令):

SELECT 
    pid, 
    usename, 
    query, 
    query_start, 
    now() - query_start AS duration
FROM 
    pg_stat_activity
WHERE 
    state = 'active' 
    AND query != '<IDLE>'
ORDER BY 
    query_start DESC;

2. 使用 watch 实时刷新

watch -n 1 "psql -U postgres -d postgres -c 'SELECT * FROM pg_stat_activity;'"

方法 3:使用 pg_stat_statements 扩展

1. 启用 pg_stat_statements

postgresql.conf 中添加:

shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all

重启容器后执行:

CREATE EXTENSION pg_stat_statements;

2. 查询实时 SQL 统计

SELECT 
    query, 
    calls, 
    total_exec_time, 
    mean_exec_time
FROM 
    pg_stat_statements
ORDER BY 
    total_exec_time DESC
LIMIT 10;

注意事项

  1. 日志性能开销log_statement = 'all' 会记录所有 SQL,可能影响性能,建议仅用于调试。
  2. 日志轮转:通过 log_rotation_agelog_rotation_size 控制日志文件大小。
  3. 权限问题:确保挂载的日志目录(如 ./logs)有写入权限。
  4. 生产环境:建议仅记录慢查询(log_min_duration_statement)而非所有语句。

总结

  • 实时打印每条查询:使用 方法 1(日志记录)
  • 实时监控活跃查询:使用 方法 2(pg_stat_activity
  • 分析历史查询性能:使用 方法 3(pg_stat_statements

到此这篇关于PostgreSQL打印实时查询语句的三种方法的文章就介绍到这了,更多相关PostgreSQL打印查询语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • postgresql中的ltree类型使用方法

    postgresql中的ltree类型使用方法

    这篇文章主要给大家介绍了关于postgresql中ltree类型使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用postgresql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • PostgreSQL15.x安装的详细教程

    PostgreSQL15.x安装的详细教程

    PostgreSQL 是一个功能强大的开源关系型数据库系统,基于 C 语言实现,采用 PostgreSQL 许可证,这是一种自由软件许可证,允许用户自由使用、修改和分发源代码,所以本文将给大家介绍PostgreSQL15.x安装的详细教程,需要的朋友可以参考下
    2024-09-09
  • PostgreSQL教程(五):函数和操作符详解(1)

    PostgreSQL教程(五):函数和操作符详解(1)

    这篇文章主要介绍了PostgreSQL教程(五):函数和操作符详解(1),本文讲解了逻辑操作符、比较操作符、数学函数和操作符、三角函数列表、字符串函数和操作符等内容,需要的朋友可以参考下
    2015-05-05
  • PostgreSQL 用户名大小写规则小结

    PostgreSQL 用户名大小写规则小结

    PostgreSQL默认不区分用户名大小写,创建和连接时自动转为小写,使用双引号可强制区分,下面就来介绍一下PostgreSQL 用户名大小写规则,感兴趣的可以了解一下
    2025-06-06
  • postgreSQL查询结果添加一个额外的自增序列操作

    postgreSQL查询结果添加一个额外的自增序列操作

    这篇文章主要介绍了postgreSQL查询结果添加一个额外的自增序列操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL数据库如何定期清理归档(pg_wal)日志

    PostgreSQL数据库如何定期清理归档(pg_wal)日志

    在⼀般的⽣产环境中,数据库都需要开启归档模式,下面这篇文章主要给大家介绍了关于PostgreSQL数据库如何定期清理归档(pg_wal)日志的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Postgresql的select优化操作(快了200倍)

    Postgresql的select优化操作(快了200倍)

    这篇文章主要介绍了Postgresql的select优化操作(快了200倍),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgres 连接数查看与设置操作

    postgres 连接数查看与设置操作

    这篇文章主要介绍了postgres 连接数查看与设置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL对比Mysql分析

    PostgreSQL对比Mysql分析

    PostgreSQL功能完备、标准严格,适配复杂场景与数据分析,MySQL简单高效、高并发优势明显,适合读密集型应用,选择应基于业务需求与团队技术栈,无绝对优劣,对PostgreSQL对比Mysql分析相关知识,感兴趣的朋友一起看看吧
    2025-07-07
  • postgreSQL中的row_number() 与distinct用法说明

    postgreSQL中的row_number() 与distinct用法说明

    这篇文章主要介绍了postgreSQL中的row_number() 与distinct用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论