ITPub博客

首页 > 数据库 > 数据库开发技术 > 数据库微观案例第46期

数据库微观案例第46期

原创 数据库开发技术 作者:象楚之行 时间:2024-07-26 08:24:00 0 删除 编辑

本期内容如下:

  • 基础备份与复制槽

  • 语法兼容性差异

  • 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

由于主库并未提前创建相应的复制槽,但基础备份还是会继续执行拉取数据的流程,数据拉完后再提示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

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

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

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

推荐阅读

与我联系

  • 微信公众号:象楚之行

  • 墨天轮:https://www.modb.pro/u/15675

  • 微信:skypkmoon

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

原文作者:象楚之行;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-06-12

  • 博文量
    102
  • 访问量
    50364