PostgreSQL打印实时查询语句的三种方法
作者: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;
注意事项
- 日志性能开销:
log_statement = 'all'
会记录所有 SQL,可能影响性能,建议仅用于调试。 - 日志轮转:通过
log_rotation_age
和log_rotation_size
控制日志文件大小。 - 权限问题:确保挂载的日志目录(如
./logs
)有写入权限。 - 生产环境:建议仅记录慢查询(
log_min_duration_statement
)而非所有语句。
总结
- 实时打印每条查询:使用 方法 1(日志记录)。
- 实时监控活跃查询:使用 方法 2(
pg_stat_activity
)。 - 分析历史查询性能:使用 方法 3(
pg_stat_statements
)。
到此这篇关于PostgreSQL打印实时查询语句的三种方法的文章就介绍到这了,更多相关PostgreSQL打印查询语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!