【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

相关推荐
m0_613856294 小时前
mysql如何利用事务隔离级别解决特定业务冲突_mysql隔离方案选型
jvm·数据库·python
Adios7944 小时前
VPR:Pitts50K和Norland数据集下载
数据库
东风破1374 小时前
DM用户权限、表、约束等对象的基本操作,SQL日志的开启介绍
数据库·sql·dm达梦数据库
收获不止数据库4 小时前
达梦9发布会归来:AI 时代,我们需要一款什么样的数据库?
数据库·人工智能·ai·语言模型·数据分析
小宇的天下4 小时前
Virtuoso GUI 界面中的关键模块定义
数据库
bqq198610264 小时前
MySQL 5.7 与 MySQL 8.0 的主要区别
数据库·mysql
Elastic 中国社区官方博客5 小时前
Elastic-caveman : 在不损失 Elastic 最佳效果的情况下,将 AI 响应 tokens 减少64%
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·全文检索
互联网推荐官5 小时前
上海软件定制开发全流程拆解:需求分析、技术选型与交付管理的工程实践
大数据·数据库·需求分析
专注API从业者6 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
大迪deblog6 小时前
系统架构师-数据库-数据库设计
数据库·oracle·系统架构