请不要固步自封,升级到 PostgreSQL 16 的 7 大理由!

使用最新版本的PostgreSQL 16,将可以获得更好的功能、更可靠和更高的性能,并增加更多的安全性。

以下是在选择升级时考虑的7大理由:

1. 生命周期

PostgreSQL 11 的小版本支持将于 2023 年 11 月 9日结束。该日期之后将不再有任何安全修复。如果存在任何重大安全漏洞,就会面临很高的风险,并且会暴露数据风险。

PostgreSQL 的版本历程如下图:

image.png

参考链接:https://en.wikipedia.org/wiki/PostgreSQL

从图中可以看出,PostgreSQL 16 是第三十个发行版本,您可以找到它的发布说明。

https://www.postgresql.org/about/news/postgresql-16-released-2715/

2. 安全性

PostgreSQL 16的安全性是进行升级的重要原因之一。

在PostgreSQL 16里,使用initdb工具初始化时生成的初始用户不允许移除超级用户权限,初始用户即便没有超级用户权限也可以通过修改pg_catalog模式下的系统表来获得超级用户权限,PostgreSQL 16之前的版本允许移除超级用户并不符合安全预期。

PostgreSQL 16对grant命令的语法进行了扩展,新增了with inherit和with set选项。当我们对新建用户赋权系统预置角色时,可以使用with inherit true选项赋予成员角色,之后不需要显式切换到成员角色即可进行相关的操作。当我们自定义的角色需要设置成员角色时,为了安全起见需要显式切换角色,此时可以设置with set true选项。

PostgreSQL 16对createrole角色属性的权限也提升了安全性,在PostgreSQL 16里使用带createrole属性创建新用户时,有如下变化:

  • 自动成为新建用户的成员
  • 拥有新建用户的管理权限
  • 没有新建用户的继承权限
  • 没有新建用户的角色切换权限

3. 并行能力

PostgreSQL 16并行查询能力有如下方面的提升:

  • 引入并行Hash Full Join和Hash Right Join
  • string_agg和array_agg函数支持并行聚合
  • 并发COPY操作性能提升三倍以上

PostgreSQL 16还有其他一些性能方面的提升,包括:

  • 新增了enable_presorted_aggregate参数,允许优化器对聚合操作带order by或distinct子句时使用预排序来减少显排的代价消耗。
  • 数据文件扩展操作优化, 并发写入性能提升

4. 易于管理和配置,可用性提升

PostgreSQL 16提供了方便的配置和管理新功能,进而提升可用性。

首先,pg_hba.conf文件配置更高效,在PostgreSQL 16里可以使用正则表达式更加简洁的配置database项和user项:

local  "/^mydb[0-9]+$,/"  all  trust
host all "/_readonly$"  all scram-sha-256

第一行正则表达式匹配以mydb为前缀并带数字的database,第二行正则表达式匹配以_readonly结尾的user。

PostgreSQL 16还支持pg_hba.conf文件里使用include关键字,使用以下三种方式来包含文件或目录:

  • include pg_hba_extra.conf
  • include_if_exists pg_hba_extra.conf
  • include_dir hba_conf

前两种方式允许包含文件,第三种方式允许使用目录。

其次,PostgreSQL 16对psql工具做了如下的提升:

  • 新增元命令\bind,支持扩展查询协议
  • 新增元命令\drg,可查看成员角色grant信息
  • 元命令\watch新增参数控制重复执行次数
    PostgreSQL 16之前\watch只能使用interval选项控制命令间隔执行的秒数,语法如下:
\watch interval=3

PostgreSQL 16新增count选项可以控制命令重复执行的次数,语法如下:

\watch interval=3 count=2

选项interval和count也可以简写为i,c:

\watch i=3 c=2
  • 新增变量显示操作系统命令执行情况
    新增SHELL_ERROR以及SHELL_EXIT_CODE变量。

此外,PostgreSQL 16对vacuum命令及vacuumdb工具做了如下的增强:

  • vacuum命令(包括analyze命令)新增buffer_usage_limit选项控制buffer cache的使用
    参考语法如下:
vacuum(analyze, buffer_usage_limit 0) tab;
  • vacuum命令可单独刷新数据库统计信息
    PostgreSQL 16里可以使用skip_database_stats选项先不刷新数据库维度的frozenxid,然后使用only_database_stats选项只做一次刷新操作。
  • vacuum命令及vacuumdb工具可快捷清理TOAST表
    vacuum命令可以使用process-main选项只处理主表数据或跳过主表数据,或者使用process-toast选项只处理附属的TOAST表数据或跳过TOAST表数据。vacuumdb工具也提供了类似功能。
  • vacuumdb工具可指定模式或排除模式
    vacuumdb工具可以使用–schema选项只处理某些模式下的对象,或者使用–exclude-schema选项跳过处理某些模式下的对象,方便以模式为多租户场景下的清理工作。

5. 详细的I/O诊断信息,方便DBA甩锅

PostgreSQL 16引入了一个非常重要的 I/O 统计视图pg_stat_io,pg_stat_io视图对I/O的统计粒度比较细,分为三个大的标签维度:进程类型(backend_type字段)、关系类型(object字段)、操作上下文类型(context字段) ,以及如下八个指标维度:

  • reads/read_time:读操作及花费的时间
  • writes/write_time:写操作及花费的时间
  • writebacks/writeback_time:请求操作系统内核持久化回写存储的次数及时间开销
  • extends/extend_time:表数据文件空间不够而扩块的次数及花费的时间
  • hits:命中shared buffers数据块的次数
  • evictions:从shared buffers或local buffer未找到可保留的数据块而必须淘汰置换一个数据块的次数
  • reuses:在bulkread、bulkwrite、vacuum操作类型上重用环形缓冲区的次数
  • fsyncs/fsync_time:fsync系统调用的次数及花费的时间(只统计normal context)

从上面三个大的维度以及八个细粒度的指标,可以从数据库侧清晰地看到I/O详情。例如观测到I/O写压力是由数据大量写入而对表数据文件扩块引起,这是正常行为。如果是由刷盘写入引起,则可以进行参数调优。

6. 逻辑复制不受主备切换影响,可安心的发布订阅数据表

PostgreSQL 16支持standby节点逻辑解码,通过新的pg_log_standby_snapshot()函数捕获正在进行中事务的快照并将其存储在WAL文件中,从而避免对检查点的依赖。

PostgreSQL 16还可以区分数据变化是由用户的SQL语句或replication复制引起,在创建订阅时可设置发布端不发布replication复制源,从而避免陷入复制循环。

PostgreSQL 16对逻辑复制还有一些其他方便的改进,包括:并行应用大事务、初始数据同步支持二进制格式、订阅端允许以表owner执行、实时逻辑解码。

7. SQL:2023新标准,PostgreSQL比商业数据库支持更全面

PostgreSQL 16对最新的SQL标准2023新增了如下支持:

  • Non-decimal integer literals
    PostgreSQL 16实现了十六进制、八进制、二进制形式的整型常量,非十进制的表示形式可以更容易阅读和识记。
  • Underscores in numeric literals
    PostgreSQL 16可以使用下划线对整型和数字常量进行虚拟分组。
  • ANY_VALUE
    PostgreSQL 16实现的any_value函数可以在select列表包含非聚合列而不会影响group by的正常行为,否则会出现如下错误提示。
ERROR: column "XXX" must appear in the GROUP BY clause or be used in an aggregate function

any_value函数不仅提供了查询的便利性,而且只从每个分组获取一个值,降低了计算成本,也提升了性能。

最后

选择升级的原因有很多:有些人可能会优先考虑可靠性,有些人可能会考虑安全性,有些人可能是出于兼容性原因。

总而言之,升级到最新版本可以从今晚(9月14号)开始。

同时也欢迎大家关注本人即将出版的新书:<<快速掌握PostgreSQL版本新特性>>,书稿简介可以参考我写的这篇文章:PostgreSQL版本新特性顺利完稿

对本书感兴趣的朋友或者需要进群请加本人微信skypkmoon并备注PG乐知乐享。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一个非常流行的开源关系型数据库,如果你想升级到10版本以上,可以按照以下步骤进行: 1. 备份数据 在进行任何升级操作之前,务必先备份数据库数据。你可以使用pg_dump工具来备份数据,例如: ``` pg_dump mydatabase > mydatabase_backup.sql ``` 这会将mydatabase数据库备份到mydatabase_backup.sql文件中。确保备份文件妥善保存。 2. 安装新版本 在升级之前,你需要先安装新版本的PostgreSQL数据库。你可以从官方网站下载最新版本的PostgreSQL。 在安装过程中,你需要选择升级已有的PostgreSQL数据库。如果你的系统中已经安装了旧版本的PostgreSQL,安装程序将会自动检测到它,并提供升级选项。 3. 升级数据库 安装完成后,你需要使用pg_upgrade工具来升级数据库。此工具会将旧版本的数据库升级到新版本。 具体升级步骤如下: - 停止PostgreSQL服务器 在升级之前,你需要停止PostgreSQL服务器。你可以使用以下命令停止服务器: ``` sudo systemctl stop postgresql ``` - 执行pg_upgrade 执行以下命令来运行pg_upgrade: ``` sudo pg_upgrade -b /usr/lib/postgresql/9.6/bin/ -B /usr/lib/postgresql/10/bin/ -d /var/lib/postgresql/9.6/main/ -D /var/lib/postgresql/10/main/ -o '-c config_file=/etc/postgresql/9.6/main/postgresql.conf' -O '-c config_file=/etc/postgresql/10/main/postgresql.conf' ``` 这个命令中包含了许多选项,其中: -b:指定旧版本的PostgreSQL二进制文件路径 -B:指定新版本的PostgreSQL二进制文件路径 -d:指定旧版本的数据目录路径 -D:指定新版本的数据目录路径 -o:用于指定旧版本的postgresql.conf配置文件路径 -O:用于指定新版本的postgresql.conf配置文件路径 - 重启PostgreSQL服务器 升级完成后,你需要启动新版本的PostgreSQL服务器。你可以使用以下命令启动服务器: ``` sudo systemctl start postgresql ``` 4. 检查升级结果 升级完成后,你需要检查数据库是否正常运行。你可以使用以下命令来连接到数据库: ``` psql mydatabase ``` 然后输入数据库密码即可。如果一切正常,你应该能够看到连接成功的提示信息。 在连接到数据库后,你可以执行一些SQL语句来检查数据库是否正常。例如: ``` SELECT version(); ``` 这个命令应该返回新版本的PostgreSQL数据库信息。如果一切正常,恭喜你已成功将PostgreSQL数据库升级到10版本以上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值