暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据库微观案例第46期

原创 彭冲 2024-07-25
384

本期内容如下:

  • 基础备份与复制槽
  • 语法兼容性差异
  • psql默认权限展示问题
  • standby支持逻辑复制的遗留问题
  • 普通用户的最大连接数设置
  • application_name带中文显示问题

一、基础备份与复制槽的问题

使用pg_basebackup备份时指定了"–slot",具体命令如下:

$ pg_basebackup -D /opt/postgres/data -U postgres -p 5432 -h x.x.x.x -Fp -Xs -R -P -v -c fast --slot=slot148
复制

image.png

由于主库并未提前创建相应的复制槽,但基础备份还是会继续执行拉取数据的流程,数据拉完后再提示slot的错误,为什么不先检测slot,如果不存在就直接报错退出,而需要浪费时间拉完数据再删除呢?

个人觉得这是一个可以优化的点,当前的流程是先拉取数据,拉取数据的过程中同时去接收WAL(stream模式),同时使用复制槽来预防备份过程中数据变化太快,可能导致WAL被回收。

不过pg_basebackup工具在stream模式其实缺省就使用了临时复制槽,我们可以打开log_replication_commands设置,对日志文件进行观察。

如果使用自定义的slot,需要我们提前创建,并且还需要注意及时删除,所以缺省的临时复制槽对我们更合适。

二、语法兼容性差异

版本14到15新发现一个语法兼容性差异问题,示例如下:

CREATE TABLE t(id int); SELECT * FROM t WHERE(id =1010R id=102);
复制

上面的查询语句OR前面缺失空格,在15之前可以正常执行,从15版本开始会报错:

ERROR: trailing junk after numeric literal at or near "1010R" LINE 1: SELECT * FROM t WHERE(id =1010R id=102); ^
复制

三、psql默认权限展示问题

17版本之前psql无法区分数据库对象owner有默认全部权限或权限被回收这两种场景,即将发布的17将解决这个显示问题,通过\pset命令对NULL定制化输出,可以更友好的展示

\pset null '(NULL)'
复制

对象的默认权限展示如下:

postgres=# \dn+ s1 List of schemas Name | Owner | Access privileges | Description ------+----------+-------------------+------------- s1 | postgres | (NULL) | (NULL) (1 row)
复制

对象无权限时展示如下:

postgres=# \dn+ s1 List of schemas Name | Owner | Access privileges | Description ------+----------+-------------------+------------- s1 | postgres | (none) | (NULL) (1 row)
复制

详细测试可以参考文章:<<默认权限"无法选中"?>>

四、standby支持逻辑复制的遗留问题

大表哥在这篇文章:Flink CDC 关于PG 16 standby logical decoding 的支持问题里介绍了Flink CDC 3.1.0通过升级Debezium组件的版本到1.9.8来支持从PG 16的standby节点捕获增量数据。

同时也发现了一个issue:16虽然支持从standby节点做逻辑复制,但还不支持使用pg_replication_origin_advance函数来快进跳过LSN,目前17也并未处理这个问题,使用standby进行解码需要注意这个限制。

五、普通用户的最大连接数如何设置

如果要设置普通用户连接数为100,那max_connections该设置成多少呢?

以当前最新稳定版本16为例,需要扣除以下两类连接数:

  • 超级用户预留的连接数
    superuser_reserved_connections = 3
  • 普通用户带pg_use_reserved_connections角色的连接数
    reserved_connections = 2

最终计算max_connections应该设置为105

六、客户端application_name配置带中文显示为问号

从pg_stat_activity视图查询application_name字段,配置的中文显示为问号(?),能正常显示为中文吗?

答案是否定的,application_name和cluster_name参数值只能配置为ASCII字符,官方文档里有明确说明:

https://www.postgresql.org/docs/15/runtime-config-logging.html

image.png

16版本有一点小的优化,非ASCII字符会显示为带转义符的hex格式

https://www.postgresql.org/docs/16/runtime-config-logging.html

image.png

下面是分别在15和16的对比测试

image.png

推荐阅读

与我联系

  • 微信公众号:象楚之行
  • 墨天轮:https://www.modb.pro/u/15675
  • 微信:skypkmoon

勤耕细作,用心积微;静待花开,量变质成。

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

文章被以下合辑收录

评论

彭冲
暂无图片
关注
暂无图片
获得了821次点赞
暂无图片
内容获得194次评论
暂无图片
获得了844次收藏
TA的专栏
MogDB技术分享
收录164篇内容
PostgreSQL乐知乐享
收录177篇内容
目录
  • 一、基础备份与复制槽的问题
  • 二、语法兼容性差异
  • 三、psql默认权限展示问题
  • 四、standby支持逻辑复制的遗留问题
  • 五、普通用户的最大连接数如何设置
  • 六、客户端application_name配置带中文显示为问号
  • 推荐阅读
  • 与我联系