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 FREEZEALTER TABLE .. ADD COLUMN 进行了多项修复,包括一个可能的索引损坏案例SELECT 的多个 SET 子句的 UPDATE 中可能发生的崩溃json[b]_populate_recordset() 或 json[b]_to_recordset() 提供零行时的崩溃CALL 语句参数中排序敏感表达式的解析TRUNCATE 进行了多项修复ALTER TABLE ONLY ADD COLUMN IF NOT EXISTS 被正确处理UNLISTENpg_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 日停止接收修复。请参阅我们的 版本策略 以获取更多信息。