PostgreSQL里许多功能都在各个版本不断进行完善,例如json数据类型早已被支持,而12的SQL/JSON函数表达式就更易用;13对分区表与逻辑复制的超融合也是如此;14对大量连接及逻辑复制大事务场景的性能做了极大的优化;15对内存统计信息及并行压缩备份提供的崭新方案;16对I/O、vacuum及应用开发方面也做了大量改良。
总而言之,PG每个版本的新功能是非常吸引我们进行更新升级,但升级也可能会对业务造成一些不兼容的隐患。
本文将对当前主流版本12~16总结一些已知兼容性变化,为我们平滑稳定升级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参数,否则数据库日志会出现提示信息。
保持联系
本人组建了一个技术交流群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加本人微信skypkmoon并备注PG乐知乐享。