2019-02-14,PostgreSQL全球开发小组发布了所有支持的数据库系统的版本更新,包括11.2、10.7、9.6.12、9.5.16 和 9.4.21版本。此次版本改变了PostgreSQL与系统函数fsync()的交互处理方式,修正了分区表的功能,以及用户近三个月所上报的超过70个Bug。
建议用户在下次的规划停机时,对系统进行升级。
缺省配置下,如果操作系统有fsync()函数并且配置为可以使用的情况下,PostgreSQL会使用此函数来帮助确保数据写入磁盘。在一些提供fsync()函数的操作系统中,当系统在不能写入数据时,它会返回失败标志并且从它的数据缓冲区中清除应写入磁盘的数据。
在这种情况下,这个清除的操作对PostgreSQL有一个不好的副作用:如果PostgreSQL通过再次调用fsync()函数,试着再次写入数据,此时fsync()会报告写入成功,但PostgreSQL认为应存入磁盘的数据实际上并未写入磁盘。这样就会造成数据损坏的结果。
本次更新修改了PostgreSQL处理fsync()返回失败标识的方式:PostgreSQL将不再调用fsync()函数,而是发出PANIC级的报警。在这种情况下,PostgreSQL也可以从WAL日志中重新加载数据来帮助确保数据写入磁盘。 这种处理方式看起来不是最佳的解决方案,不过根据反馈报告,这个问题的发生也是极其少见的。
现在系统中增加一个新的服务器参数data_sync_retry来配置新的处理方式。如果用户确认操作系统在此种场景下不会清理脏数据,用户可以设置data_sync_retry为on来保持以前的处理方式。
本次更新也引入了有关发布声明如何组织的变更。对本次更新,所有仍在支持的版本将仅含有当前大版本有关的发布内容。比如PostgreSQL 11的发布声明将仅包含11.2,11.1和11.0有关的内容。对不再支持的版本(如PostgreSQL 9.3及更早的版本)的发布声明,也会在即将上线的PostgreSQL网站归档文件中可以找到。
本次更新修正了近几个月所上报的Bug。部分Bug仅影响11版本,但大部分都对目前在支持的版本有影响。
这些修正包括:
本次更新也包含2018i版本的时区数据,包括哈萨克斯坦、梅特拉卡特拉、圣多美和普林西比时区的更新。哈萨克斯坦的克孜勒奥尔达区现分为两部分,因此系统中也增加了一个新区Asia/Qostanay,加上对中国香港和一些太平洋岛屿历史数据的更新。
所有PostgreSQL的更新版本是累进方式的。对一般小版本的更新,并不需要用户对数据进行导出和导入或是使用pg_upgrade进行更新,只需要停止PostgreSQL服务,更新一下服务器的二进制文件即可。
用户跳过了一个或是多个补丁版本可能也需要额外的后续操作,请浏览详细的发布说明来检查更早版本升级的细节。
PostgreSQL 9.4版本将会在2020年2月13号以后不再进行更新,请浏览以下的版本策略了解更多信息。