【PostgreSQL内核学习(六)—— 工具使用学习】

工具使用学习

声明 :本文的工具学习内容来自于《小宇带你学pg内核分析》

工具的代码仓库链接为:
https://github.com/shenyuflying/pgNodeGraph

此外,我还参考了以下文章:
https://rng-songbaobao.blog.csdn.net/article/details/104023090

在此非常感谢以上博主所提供的资源!!!

工具使用学习

**工具的用途:**通过这个工具我们可以十分方便的把日志文件的输出(文字形式)转化为图片。

使用步骤:

  1. 在代码仓库中拉取代码
  2. 获取日志文件中的抽象语法树

  要让 PostgreSQL 服务器在日志中打印解析和计划节点树,你可以按照以下步骤进行设置:

  • 打开 PostgreSQL 配置文件 postgresql.conf,可以通过以下命令定位到配置文件的位置:`psql -c "SHOW config_file;"
  • 编辑 postgresql.conf 文件,在文件中找到 logging_collector 配置项,并确保其值为 on,表示启用日志收集器。
  • 找到 log_destination 配置项,并确保其值中包含 csvlog ,例如:log_destination = 'stderr,csvlog'
  • 找到 logging_collector 配置项,并确保其值为 on,表示启用日志收集器。
  • 找到 log_statement 配置项,并将其值设置为 all ,表示记录所有类型的 SQL 语句。如果你只想记录解析和计划节点树的信息,可以将其设置为 parse
  • 找到 debug_print_parsedebug_print_rewrittendebug_print_plan 配置项,并将它们的值设置为 on,表示启用打印解析和计划节点树的调试输出。
  • 保存配置文件,并重新启动 PostgreSQL 服务器,使配置生效。

  完成上述步骤后,PostgreSQL 服务器将在日志中打印解析和计划节点树的详细信息。你可以通过查看日志文件来获取相应的输出信息。

  1. 进行gdb调试
  • 首先在exec_simple_query 函数中打上断点:b exec_simple_query
  • 单步调试进入函数pg_analyze_and_rewrite
  • 单步调试进入函数parse_analyze
  • 单步调试进入函数transformTopLevelStmt
  • 单步调试进入函数transformOptionalSelectInto
  • 使用 bt 查看当前调用堆栈的回溯信息,即显示当前正在执行的函数以及它们的调用关系,如下所示:
  • 得到分析树 parseTree
  • 随后在GDB 调试中执行如下操作:call elog_node_display(15,"name",要显示的结果的地址,1);
      这句代码是 PostgreSQL 中的调试输出语句,用于将查询树(parseTree )以更美观的格式打印出来,并输出到日志。该函数是由宏 elog_node_display 来实现的。具体参数的意思如下:
    (1)**15:**这是日志的日志级别,表示 LOG 级别,即输出为信息性消息。
    (2)"name":这是打印出来的查询树的标题,相当于给打印的内容起一个名称,可以用来区分不同的输出。
    (3)parseTree:这是要打印的查询树,通常是 Query 结构体类型的指针。
    (4)**1:**这是打印的详细程度级别,为 1 表示最详细的打印方式。
  1. 在日志文件中查找最新的记录(日志文件路径:postgresql/data/log
  2. 将生成的文件在工具文件包的 "node" 文件夹下拷贝一份,文件后缀名为 .node
  3. 运行命令:./pgNodeGraph
  4. 最后在 pic 文件中可以查看生成的图片文件。

安装中出现的问题

  在执行命令./pgNodeGraph时出现报错如下:

原因 :似乎是内存问题,通过查找资料了解到是说内存超过2G会出现问题。需要添加编译选项:-mcmodel。
解决办法 :修改 pgNodeGraph 中的 gcc 命令如下:gcc -mcmodel=medium -g node2dot.c -o node2dot

相关推荐
深盾科技_Virbox42 分钟前
软件授权工具静默安装实践
java·运维·数据库·安全·软件需求
延凡科技1 小时前
延凡科技综合监控预警处置平台—— 一体化视频AI安防闭环系统设计与功能实现[特殊字符]️
数据库·人工智能·科技·安全·能源
老马聊技术1 小时前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
醇氧1 小时前
主流 Agent 开发框架全解析(2026 最新)
大数据·数据库·人工智能·开源
吴声子夜歌2 小时前
Redis 6.x——整合SpringBoot
数据库·spring boot·redis
ATA88882 小时前
AI辅助生成SQL实战从连接配置到执行计划优化的完整技术流程
数据库·人工智能·智能问数
咏方舟【长江支流】2 小时前
【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器
数据库·开源·ai编程·orm·咏方舟-长江支流·用宝框架·用宝框架orm
JZC_xiaozhong2 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成
渣渣灰飞2 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范
数据库·学习·mysql
IvorySQL2 小时前
PG 日报|新增 VFD 缓存监控视图,精细化数据库调优
大数据·数据库·人工智能·缓存·postgresql·区块链