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 法律变更。哈萨克斯坦的 Qyzylorda 时区被分成两个,创建了一个新的时区 Asia/Qostanay,因为有些地区没有改变 UTC 偏移。香港和众多太平洋岛屿的历史数据修正。
所有 PostgreSQL 更新版本都是累积的。与其他次要版本一样,用户不需要转储和重新加载数据库或使用 pg_upgrade
来应用此更新版本;您可以直接关闭 PostgreSQL 并更新其二进制文件。
跳过了一个或多个更新版本的用户可能需要执行额外的、更新后的步骤;有关详细信息,请参阅早期版本的发布说明。
PostgreSQL 9.4 将于 2020 年 2 月 13 日停止接收修复。请参阅我们的 版本策略 以获取更多信息。