PostgreSQL 全球开发组发布了我们数据库系统所有受支持版本的更新,包括 11.2、10.7、9.6.12、9.5.16 和 9.4.21。此版本更改了 PostgreSQL 与 fsync()
接口的方式,并修复了分区问题以及过去三个月报告的 70 多个其他错误。
用户应计划在下次计划停机时应用此更新。
fsync()
行为的更改当操作系统中可用并在配置文件中启用(默认启用)时,PostgreSQL 使用内核函数 fsync()
来帮助确保数据写入磁盘。在某些提供 fsync()
的操作系统中,当内核无法写出数据时,它会返回失败并清除其数据缓冲区中本应写入的数据。
此清除操作对 PostgreSQL 产生了一个不幸的副作用:如果 PostgreSQL 再次尝试通过再次调用 fsync()
将数据写入磁盘,fsync()
将报告成功,但 PostgreSQL 认为已保存到磁盘的数据实际上不会被写入。这会造成可能的数据损坏情况。
此更新修改了 PostgreSQL 处理 fsync()
失败的方式:PostgreSQL 将不再重试调用 fsync()
,而是会 panic。在这种情况下,PostgreSQL 可以从预写日志 (WAL) 中重放数据,以帮助确保数据被写入。虽然这可能看起来不是最佳解决方案,但目前几乎没有其他替代方案,并且根据报告,问题情况发生的概率极低。
已添加新的服务器参数 data_sync_retry
来管理此行为。如果您确定您的内核不会在这种情况下丢弃脏数据缓冲区,则可以将 data_sync_retry
设置为 on
以恢复旧的行为。
此更新引入了发布说明的打包方式的更改。从本次更新开始,所有当前受支持的 PostgreSQL 版本将仅包含其主要版本特定的发布说明。例如,PostgreSQL 11 仅打包版本 11.2、11.1 和 11.0 的发布说明。不受支持的版本(PostgreSQL 9.3 及更早版本)的发布说明将在旧版本中以及 PostgreSQL 网站上即将发布的存档中提供。
此更新还修复了过去几个月报告的 70 多个错误。其中一些问题仅影响版本 11,但许多问题影响所有受支持的版本。
其中一些修复包括
INCLUDE
列的唯一索引的处理NOT NULL
约束在其分区内得到遵守ON COMMIT DROP
和 ON COMMIT DELETE ROWS
应用于分区表和具有继承子表的表的问题COPY FREEZE
ALTER TABLE .. ADD COLUMN
与非空默认值功能的多个问题,包括可能的索引损坏情况SELECT
的多个 SET
子句的 UPDATE
中可能发生的崩溃json[b]_populate_recordset()
或 json[b]_to_recordset()
提供零行时发生的崩溃CALL
语句参数中对排序规则敏感的表达式TRUNCATE
的多项修复ALTER TABLE ONLY ADD COLUMN IF NOT EXISTS
被正确处理UNLISTEN
pg_hba.conf
中 LDAP 身份验证条目的 ldapserver 参数中解析空格分隔的主机名列表的问题\g target
可以与 COPY TO STDOUT
一起使用--random-seed=N
时,pgbench
的随机数生成现在是完全确定性的且与平台无关的pg_basebackup
和 pg_verify_checksums
以正确忽略临时文件pg_dump
的多项修复,包括使 ALTER INDEX SET STATISTICS
命令存在此更新还包含 tzdata 版本 2018i,用于哈萨克斯坦、梅特拉卡特拉和圣多美和普林西比的 DST 法律变更。哈萨克斯坦的克孜勒奥尔达地区被分为两个,创建了一个新的时区 Asia/Qostanay,因为某些地区没有更改 UTC 偏移量。对香港和许多太平洋岛屿的历史修正。
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户不需要转储和重新加载数据库或使用 pg_upgrade
来应用此更新版本;您可以简单地关闭 PostgreSQL 并更新其二进制文件。
跳过一个或多个更新版本的用户可能需要运行额外的更新后步骤;请参阅早期版本的发布说明了解详细信息。
PostgreSQL 9.4 将于 2020 年 2 月 13 日停止接收修复。请参阅我们的版本控制策略了解更多信息。