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更加简单高效,从性能、可维护性、跨平台以及扩展方面更具优势。