暂无图片
暂无图片
2
暂无图片
暂无图片
4
暂无图片

postgresql 15源码浅析(2)—— psql新功能\dconfig

原创 夏克 2022-05-24
1888

摘要

翻了一下PostgreSQL 15的release文档,发现psql也有了10余项的升级,一起来撸一下其中一项新的功能的代码——\dconfig.

image.png

环境及代码

环境

我这里使用的是本机win11 的WSL ubuntu。

image.png

代码

代码用的是最新的master分支,应该和15beta差不多吧。

image.png

image.png

psql代码结构

psql的代码结构很简单,基本就是启动之后在MainLoop函数中等待接收处理命令行的字符输入(细节以后可以慢慢撸,今天主要看看\dconfig这个命令是如何处理),接收到命令后做简单的处理,如果是’\'反斜杠的命令,则进入HandleSlashCmds函数进行处理,后续交由execcommand来执行具体的命令,\dconfig属于\d的子命令,因此被分配到exec_command_d 函数中,最终交由describeConfigurationParameters函数通过libpq驱动执行相应的sql。

image.png

以上是调用栈,比较简单清晰,不详细介绍了。

\dconfig命令

改命令是由describeConfigurationParameters函数进行处理的,这些命令处理函数基本上都长成一个样子,即有3个参数。
image.png

  • pattern:子命令或命令参数,比如只想看其中一个参数,可以在\dconfig 后面加参数名。\dconfig shared_memory_size
postgres@LAPTOP-4OF1323N:~$ psql psql (15beta1) Type "help" for help. postgres=# \dconfig shared_memory_size List of configuration parameters Parameter | Value --------------------+------- shared_memory_size | 143MB (1 row)
复制
  • verbose:是否显示详细信息,即+号
postgres=# \dconfig+ shared_memory_size List of configuration parameters Parameter | Value | Type | Context | Access privileges --------------------+-------+---------+----------+------------------- shared_memory_size | 143MB | integer | internal | (1 row) postgres=#
复制
  • showSystem:显示系统(级别)信息,即S

这个命令没有S的信息,函数里面没有showSystem的处理

不带参数执行

printfPQExpBuffer(&buf, "SELECT s.name AS \"%s\", " "pg_catalog.current_setting(s.name) AS \"%s\"", gettext_noop("Parameter"), gettext_noop("Value"));
复制

在qsql开启-E选型执行

image.png

可以看到实际上数据是从pg_catalog.pg_settings里面取到的。

带参数执行

if (pattern) processSQLNamePattern(pset.db, &buf, pattern, false, false, NULL, "pg_catalog.lower(s.name)", NULL, NULL, NULL, NULL);
复制

image.png

可以看到多了查询条件。

详细信息

if (verbose) { appendPQExpBuffer(&buf,", s.vartype AS \"%s\", s.context AS \"%s\", ", gettext_noop("Type"), gettext_noop("Context")); if (pset.sversion >= 150000) printACLColumn(&buf, "p.paracl"); else appendPQExpBuffer(&buf, "NULL AS \"%s\"", gettext_noop("Access privileges")); }
复制

image.png

结束

这部分的代码比较简单,但是新增\dconfig命令的目的属实有点看不懂了,感觉有点鸡肋了,因为在psql里面有show命令,在外面有pg_config命令,都有类似\dconfig的功能。

不过,撸了一遍psql的代码之后,感觉解析命令代码的地方可以做一些改动,变成可以读取配置将常用的sql写入配置文件,这样用户可以编辑配置文件自定常用命令。比如DBA们往往都总结了一些日常巡检的sql或者自己排查问题的sql。那么把他们写入一个key/value的配置文件中用psql来驱动调用这些SQL。每一个长命令对应一个别名(key),例如:

  • 配置:
Key Value
link select state,count(1) from pg_stat_activity group by 1;

在psql里面 输入命令\xlink,则显示:“连接状态,是否有长事务,活跃连接数占比”;

当然也可以用一个命令查看慢sql,\xslow等等……,命令名称可自己定义。

这个先留个坑,应该比较好实现,但因为我不了解DBA的习惯,不知道DBA们是不是觉得这个功能实用——“自定义命令”的psql。如果觉得有用欢迎大家留言,我好有动力去实现这个功能。

备注

往期挖的坑,后续填上。

待填的坑 挖坑时间
理解bki 2022-05-22
实现自定义命令的psql 2022-05-24
最后修改时间:2022-05-28 20:12:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

彭冲
暂无图片
2年前
评论
暂无图片 0
我觉得并不是鸡肋,至少有两个功能比较实用: 第一个是可以直接查看修改了哪些非默认参数 第二个可以查看某一类参数,比如auovacum*
2年前
暂无图片 点赞
1
夏克
暂无图片
2年前
回复
暂无图片 0
彭冲老师说的有道理,估计pg社区也应该有充分的理由把这个功能纳入新版本。可能我不是dba,有些理解还是有些狭隘的。但从普通用户的角度,感觉一些常用sql是可以根据个人习惯去配置的。
2年前
暂无图片 点赞
回复
墨天轮福利君
暂无图片
2年前
评论
暂无图片 0
👏恭喜您获得:“PostgreSQL 15 新版本尝鲜”原创文章合格奖,100墨值已发送。 👉活动地址:https://www.modb.pro/db/405732
2年前
暂无图片 点赞
评论
墨天轮福利君
暂无图片
2年前
评论
暂无图片 0
您好,您的文章已入选墨力原创作者计划合格奖,10墨值奖励已经到账请查收! ❤️我们还会实时派发您的流量收益。
2年前
暂无图片 点赞
评论