暂无图片
暂无图片
12
暂无图片
暂无图片
暂无图片

知兼容性之变,升数据库也稳

原创 多米爸比 2023-12-19
1392

PostgreSQL里许多功能都在各个版本不断进行完善,例如json数据类型早已被支持,而12的SQL/JSON函数表达式就更易用;13对分区表与逻辑复制的超融合也是如此;14对大量连接及逻辑复制大事务场景的性能做了极大的优化;15对内存统计信息及并行压缩备份提供的崭新方案;16对I/O、vacuum及应用开发方面也做了大量改良。已经发布的17 beta1亮点特性包括:拆分与合并分区、增量文件备份、逻辑复制槽的故障转移等。

总而言之,PG每个大版本发布非常吸引我们进行更新升级,但升级也可能会对业务造成一些不兼容的隐患。

本文将对主流版本12~17总结一些已知兼容性变化,为我们平滑稳定升级PG数据库提供一些参考。

PostgreSQL 12

1.去掉recovery.conf文件,合并恢复参数至postgresql.conf文件

在12以前,recovery.conf文件包含了用于配置恢复的参数,例如:

primary_conninfo restore_command

为了对参数进行统一管理,从12开始recovery.conf里的参数合并到postgresql.conf文件中。

2.oid对象标识符开关

在12之前允许建表时使用with(oids)为数据行生成oid值,例如业务表没有主键时,可以通过该特性进行唯一标识,从12开始关闭了这个特性,建表时不再支持使用with(oids)属性。

3.pg_verify_checksums校验和工具更名为pg_checksums

在12里校验和工具除了重命名为pg_checksums,还支持–enable/–disable进行校验和开关项控制。

PostgreSQL 13

1.wal_keep_segments参数更名为wal_keep_size

流复制场景下为了预防主库清理wal导致长期失联的备库需要重建,可通过该参数进行缓解,重命名后的wal_keep_size计量单位更加明确。

2.UUID内置函数

在13之前使用UUID数据类型需要加载uuid_ossp,从13开始可以直接使用gen_random_uuid系统函数,如果从13回切12时需要注意这一点。

PostgreSQL 14

1.用户口令默认加密方式由md5改为scram-sha-256

有的客户应用程序经常会升级PG数据库版本,但升级14后突然发现程序提示连接失败。因为从14开始用户口令默认加密方式采用scram-sha-256,同时客户端程序的数据库驱动也需要更新至支持scram-sha-256的版本。

2.新形式的SQL函数

从14开始创建自定义函数时有另外一种新形式的begin atomic语法,使用新形式的SQL函数可以跟踪函数体里对象的依赖关系,但也需要注意客户应用程序获取函数元数据的差异。

PostgreSQL 15

1.public模式安全性提升

public模式的权限在15有如下修改:

  • public模式对public角色的create权限被回收
  • public模式owner变为pg_database_owner

如果要保持低版本的兼容性,可定制修改template1,还原对public角色的默认权限。

2.backup相关

  • 删除了pg_start_backup函数的exclusive参数(排他性备份模式可能会存在启动失败问题)
  • pg_start_backup重命名为pg_backup_start
  • pg_stop_backup重命名为pg_backup_stop
  • pg_backup_start_time函数被移除
  • pg_is_in_backup函数被移除

3.免密文件.pgpass

后台脚本如使用pg_dump进行备份时为了避免交互式输入数据库用户密码,可以使用.pgpass文件进行免密配置。

从15开始.pgpass文件加载顺序如下:

  • PGPASSFILE
  • $HOME/.pgpass (从15开始)
  • ~/.pgpass

如果root用户下HOME变量设置为/,可能会造成脚本不能正常工作,因为多数操作系统root用户的HOME变量是/root

PostgreSQL 16

1.备库提升为主库删除promote_trigger_file参数文件触发方式

从12开始,PG推荐使用pg_promote()函数或者使用pg_ctl promote命令来提升备库为主库。

原有的promote_trigger_file参数文件触发方式已被废弃使用。

2.vacuum_defer_cleanup_age参数被删除

该参数是预防流复制冲突的手段之一,但多数人都很难合理设置其大小,并且社区也有用户案例因设置值过大而引起数据损坏,从16开始PG删除了该参数。

3.lc_collate和lc_ctype参数被删除

数据库初始化时设置的lc_collate和lc_ctype参数后期是不能被修改,而且从16开始允许db级设置本地化参数,因此从16开始删除了这两个只读参数。

4.force_parallel_mode重命名为debug_parallel_query

一些用户会认为16之前的force_parallel_mode参数是开启并行查询的开关。但这并不准确,该参数只是提示优化器考虑使用并行,最终还会受成本评估的影响。为消除误解,16更名为debug_parallel_query。

5.归档参数archive_library与archive_command不能同时使用

从15开始,WAL归档引入了一种新的配置方式,可使用archive_library参数,并且archive_library与archive_command参数允许同时设置,archive_library参数会优先生效。

从16开始,不能同时配置archive_library与archive_command参数,否则数据库日志会出现提示信息。

PostgreSQL 17

1.在一些维护操作的场景下,函数使用安全的search_path设置

通常只有表的owner可以执行一些维护操作,包括ANALYZE, CLUSTER, REFRESH MATERIALIZED VIEW,REINDEX, and VACUUM。17增加了pg_maintain角色,对于非超级用户已经也可执行一些维护操作,但存在search_path注入风险,17执行这些维护操作时,search_path做了如下安全性设置

search_path to "pg_catalog, pg_temp"

参考First draft of PG 17 release notes

https://www.postgresql.org/message-id/flat/ZjxLJpnH4VMkOMmi%40momjian.us

2.interval间隔类型解析时仅允许尾部出现一次ago

下面的interval值在17不合法:

SELECT INTERVAL '10 seconds ago ago'; SELECT INTERVAL '2 minutes ago 5 days';

3.删除old_snapshot_threshold参数

事务快照太旧功能关闭:old_snapshot_threshold参数引起较多bug,社区表示对这个功能
准备工作做的不够充分,将来再重新提供"snapshot too old" 的功能。

4.删除db_user_namespace参数

关闭db级的用户功能,实际很少有使用。

5.删除trace_recovery_messages参数

以前很古老的版本调试备机和流复制功能的参数,现在很少使用。

6.服务端内部变量重命名

session_auth_is_superuser改名为current_role_is_superuser

7.SET SESSION AUTHORIZATION命令行为改变

新版本每次发起命令时都检测初始session用户的superuser状态,以前只再建立连接时检测。

8.windows系统wal_sync_method参数值变化

由于fsync_writethrough值与fsync值作用一样,去掉了fsync_writethrough值

9.计算WAL文件名相关的两个函数有变化

pg_walfile_name()和pg_walfile_name_offset()函数计算LSN段号有变化

10.information_schema模式系统表字段变化

系统表element_types表去掉domain_default字段,源码注释该字段有bug。

11.pg_stat_bgwriter统计视图分裂

pg_stat_bgwriter统计视图分裂,新增pg_stat_checkpointer视图,同时删除两个字段

  • buffers_backend
  • buffers_backend_fsync

这两个字段与pg_stat_io视图的字段有冗余。

12.vacuum进度报告两个字段改为按字节统计

系统视图pg_stat_progress_vacuum如下两个字段发生变化

  • max_dead_tuples改为max_dead_tuple_bytes
  • num_dead_tuples改为dead_tuple_bytes

由原来的统计元组数量改为统计字节量。

13.下面两个系统表的字段允许为空

  • pg_attribute.attstattarget
  • pg_statistic_ext.stxstattarget

14.行锁插件pgrowlocks变化

pgrowlocks插件如下查询语句显示的modes字段值有变化:

SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');

modes字段标签值与锁模式保持一致

  • Share改为For Share
  • Key Share改为For Key Share

15.pg_stat_statements插件变化

pg_stat_statements插件统计I/O读写时间的两个字段重命名

  • blk_read_time改为shared_blk_read_time
  • blk_write_time改为shared_blk_write_time

16.删除adminpack插件

adminpack插件通常是提供给pgadmin3使用,现在主流客户端工具是pgadmin4。

17.不再支持IBM的AIX操作系统

市场上使用AIX系统已经非常少

18.微软的VS构建只能使用Meson工具

Meson更加简单高效,从性能、可维护性、跨平台以及扩展方面更具优势。

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

文章被以下合辑收录

评论