pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
发布日期:. 2017-08-10
此版本包含自 9.6.3 以来的多种修复。 有关 9.6 大版本中新特性的信息,参见 第 E.25 节。
对于运行 9.6.X 的用户,不需要转储/恢复。
不过,如果你使用通过用户密码认证的外部数据服务器,请参见下面第一条 变更日志条目。
另外,如果你是从 9.6.3 之前的版本升级,参见 第 E.22 节。
进一步限制 pg_user_mappings.umoptions 的可见性,以保护存储为用户映射选项的密码(Noah Misch)
CVE-2017-7486 的修复不正确:它允许用户看到她自己用户映射中的选项,即使 她对相关外部服务器没有 USAGE 权限。这种选项可能 包含由服务器所有者而非用户自己提供的密码。由于 information_schema.user_mapping_options 在这种情况下不显示选项,pg_user_mappings 也不应该。(CVE-2017-7547)
此补丁本身只会修复新 initdb 的数据库中的行为。如果希望在现有数据库中 应用此更改,需要执行以下操作:
在 postgresql.conf 中添加 allow_system_table_mods = true 后重启 postmaster。 (在支持 ALTER SYSTEM 的版本中,可以用它进行 配置更改,但仍需重启。)
在集簇的每个数据库中,以超级用户身份运行以下 命令:
SET search_path = pg_catalog;
CREATE OR REPLACE VIEW pg_user_mappings AS
SELECT U.oid AS umid, S.oid AS srvid, S.srvname AS srvname,
U.umuser AS umuser,
CASE WHEN U.umuser = 0 THEN 'public' ELSE A.rolname END AS usename,
CASE WHEN (U.umuser <> 0 AND A.rolname = current_user
AND (pg_has_role(S.srvowner, 'USAGE')
OR has_server_privilege(S.oid, 'USAGE')))
OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
THEN U.umoptions ELSE NULL END AS umoptions
FROM pg_user_mapping U
LEFT JOIN pg_authid A ON (A.oid = U.umuser)
JOIN pg_foreign_server S ON (U.umserver = S.oid);
不要忘记包括 template0 和 template1 数据库,否则漏洞仍会存在于之后创建的 数据库中。要修复 template0,需要暂时让它接受 连接。在 PostgreSQL 9.5 及之后,可以 使用
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
修复 template0 之后再撤销:
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
在更早的版本中,改用:
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0'; UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
最后,移除 allow_system_table_mods 配置设置,并再次 重启 postmaster。
禁止在所有基于密码的认证方法中使用空密码(Heikki Linnakangas)
libpq 忽略空的密码说明,不把它们传输给服务 器。因此,如果用户的密码被设为空字符串,就无法通过 psql 或其他基于 libpq 的客户端用该密码登录。管理员可能 因此认为把密码设为空等同于禁用密码登录。然而,使用修改过的或非 libpq 的客户端,登录可能是可能的,这取 决于配置的认证方法。特别是最常见的方法 md5 接受 空密码。更改服务器在所有情况下拒绝空密码。(CVE-2017-7546)
让 lo_put() 检查对目标大对象的 UPDATE 权限(Tom Lane、Michael Paquier)
lo_put() 理所当然应要求与 lowrite() 相同的权限,但检查缺失,允许任何 用户更改大对象中的数据。(CVE-2017-7548)
更正关于用 pg_upgrade 升级备库服务器过程 的文档(Bruce Momjian)
原来的文档指示用户在运行 pg_upgrade 之后、 同步备库之前启动/停止主服务器。这个顺序是不安全的。
修复元组更新链的并发锁定(Álvaro Herrera)
如果多个会话用非冲突锁模式并使用旧快照并发锁定一条元组更新链,且都 成功,由于竞态条件其中一些仍可能失败(并得出没有存活元组版本的 结论)。这会导致诸如外键检查看不到一个确实存在但正被并发更新的 元组之类的后果。
修复冻结 XMAX 是恰好只有一个仍感兴趣成员的多事务的元组时可能的数据 损坏(Teodor Sigaev)
避免在内存中排序超过十亿元组时的整数溢出和随之而来的崩溃 (Sergey Koposov)
在 Windows 上,如果在新进程中为共享内存保留地址范围失败,则重试进程 创建(Tom Lane、Amit Kapila)
这有望修复可能由杀毒产品干扰导致的偶发子进程启动失败。
修复 Windows 构建中共享谓词锁哈希表的低概率损坏 (Thomas Munro、Tom Lane)
避免把 SSL 连接的干净关闭当作连接重置来记录(Michael Paquier)
防止向客户端发送 SSL 会话票据(Tom Lane)
此修复防止使用票据感知的客户端 SSL 代码时的重连失败。
修复 Solaris 上设置 tcp_keepalives_idle 的代码(Tom Lane)
修复统计收集器处理 postmaster 关闭并立即重启之后发出的查询消息 (Tom Lane)
在上一个 postmaster 关闭之后半秒内发出的统计查询实际上被忽略。
确保统计收集器的接收缓冲区大小至少为 100KB(Tom Lane)
这降低了默认接收缓冲区大小小于该值的老平台上统计数据丢失的风险。
修复备库刚处理完 XLOG_SWITCH WAL 记录后被提升时 可能创建无效 WAL 段的问题(Andres Freund)
修复 walsender 在客户端请求关闭时及时退出 (Tom Lane)
修复 walsender 进程中的 SIGHUP 和 SIGUSR1 处理(Petr Jelinek、 Andres Freund)
防止关闭检查点期间 walsender 引发的 panic (Andres Freund、Michael Paquier)
修复 postmaster 中竞态条件导致的 walreceiver 进程不必要的缓慢重启 (Tom Lane)
修复逻辑解码期间溢出到磁盘的小子事务的泄漏(Andres Freund)
这导致临时文件消耗过多的磁盘空间。
减少创建逻辑解码槽期间构建快照所需的工作(Andres Freund、 Petr Jelinek)
原来的算法在有大量打开事务的服务器上昂贵得不可行。
修复可能无限延迟逻辑解码槽创建的竞态条件 (Andres Freund、Petr Jelinek)
减少处理系统缓存失效事件的开销(Tom Lane)
这对逻辑解码特别有帮助,它触发频繁的缓存失效。
移除某些情况下基于外键约束存在估计连接选择率时使用的不正确启发式 (David Rowley)
在存在多列外键约束但不完全匹配查询连接结构的某些情况下,规划器使用 了一种结果完全不好的估计启发式。把这种情况恢复到 9.6 之前的估计 方式。
修复 INSERT 或 UPDATE 对 数组之上域类型的列的多个元素赋值的情况(Tom Lane)
允许在聚合函数参数内的子 SELECT 中使用窗口函数 (Tom Lane)
确保底层表是外部表时正确执行视图的 CHECK OPTIONS 子句(Etsuro Fujita)
此前更新可能被完全下推到外部服务器,但这样做的验证视图条件的需要被 遗漏了。
在 ALTER ... RENAME 期间把自动生成的数组类型移开 (Vik Fearing)
此前我们在 CREATE 期间会把冲突的自动生成数组类型 重命名移开;此修复把该行为扩展到重命名操作。
修复表中约束带有注释时 ALTER TABLE 中的悬空指针 (David Rowley)
把注释重新应用于重建后的约束时可能因奇怪的错误消息失败,甚至崩溃。
确保 ALTER USER ... SET 接受 ALTER ROLE ... SET 接受的所有语法变体 (Peter Eisentraut)
允许外部表的 CHECK 约束初始为 NOT VALID(Amit Langote)
CREATE TABLE 静默丢弃 CHECK 约束的 NOT VALID 说明符,理由是表必须是空的, 所以约束可以立即验证。但这对于 CREATE FOREIGN TABLE 是错误的,没有理由假定底层 表是空的,而且即使是,决定约束今后可以被视为有效也不是我们的事。 对外部表跳过这一“优化”。
把数据类型 I/O 函数的参数或返回类型从 opaque 更改为正确 类型时正确更新依赖信息(Heikki Linnakangas)
CREATE TYPE 会更新以这种早已过时风格声明的 I/O 函数,但忘记记录对类型的依赖,允许随后的 DROP TYPE 留下损坏的函数定义。
允许 COPY 从查询结果复制时在查询计划中使用并行 (Andres Freund)
减少 ANALYZE 处理 tsvector 列时的 内存使用(Heikki Linnakangas)
修复 money 值乘以或除以整数或浮点数时不必要的精度丢失 和草率舍入(Tom Lane)
收紧对解析标识符的函数(如 regprocedurein())中空白的检查(Tom Lane)
根据当前区域,这些函数可能把多字节字符的片段误解释为空白。
编译 PL/Perl 时使用来自 Perl 的相关 #define 符号(Ashutosh Sharma、Tom Lane)
这避免了可移植性问题(通常表现为库加载期间的 “握手”不 匹配),在使用最近 Perl 版本时。
在 libpq 中,连接尝试失败后正确重置 GSS/SASL 和 SSPI 认证状态(Michael Paquier)
不这样做意味着当从 SSL 回退到非 SSL 连接时,SSL 尝试中的 GSS/SASL 失败总是导致非 SSL 尝试失败。SSPI 不会失败,但泄漏内存。
在 psql 中,修复 COPY FROM STDIN 以键盘 EOF 信号结束后再尝试另 一个 COPY FROM STDIN 时失败的问题 (Thomas Munro)
这种错误行为在 BSD 衍生平台(包括 macOS)上观察到,但在大多数其他 平台上没有。
修复 pg_dump 和 pg_restore 把 REFRESH MATERIALIZED VIEW 命令放在最后发出 (Tom Lane)
这防止了物化视图引用其他用户拥有的表时转储/恢复期间的错误。
改进 pg_dump/pg_restore 对源自 zlib 的错误情况的报告 (Vladimir Kunschikov、Álvaro Herrera)
修复 pg_dump 使用 --clean 选项按预期删除事件触发器(Tom Lane)
它现在还正确分配事件触发器的所有权;此前它们被恢复为归运行恢复脚本 的超级用户所有。
修复 pg_dump 使用 --clean 选项在 public 模式不存在时不失败 (Stephen Frost)
修复 pg_dump 不再为空操作符类发出无效 SQL (Daniel Gustafsson)
修复 pg_dump 在 Windows 上输出到 stdout (Kuntal Ghosh)
由于未把文件描述符置为二进制模式,写到 stdout 的压缩纯文本转储会 包含损坏的数据。
修复 pg_get_ruledef() 为列被重命名的视图的 ON SELECT 规则打印正确输出(Tom Lane)
某些边界情况下 pg_dump 依靠 pg_get_ruledef() 转储视图,因此这个错误可能 导致转储/恢复失败。
修复带空约束外连接(如没有公共列的 NATURAL LEFT JOIN 的结果)的转储(Tom Lane)
修复 FROM 子句中函数表达式不能反解析为看起来像 函数调用的东西时的转储(Tom Lane)
修复 pg_basebackup 在 Windows 上输出到 stdout(Haribabu Kommi)
由于未把文件描述符置为二进制模式,写到 stdout 的备份会包含损坏的 数据。
修复 pg_rewind 正确处理超过 2GB 的文件 (Kuntal Ghosh、Michael Paquier)
通常这种文件不会出现在 PostgreSQL 数据目录 中,但在某些情况下可能存在。
修复 pg_upgrade 确保结束 WAL 记录不具有 wal_level = minimum (Bruce Momjian)
这一条件可能阻止升级后的备库服务器重新连接。
修复 pg_xlogdump 对 WAL 记录长度的计算 (Andres Freund)
在 postgres_fdw 中, ALTER SERVER 或 ALTER USER MAPPING 命令之后重建到远程服务器的连接(Kyotaro Horiguchi)
这确保影响连接参数的选项更改被及时应用。
在 postgres_fdw 中,允许取消远程事务控制命令 (Robert Haas、Rafia Sabih)
这一更改使我们能在比以前多得多的情况下快速摆脱对无响应远程服务器的 等待。
增大 MAX_SYSCACHE_CALLBACKS,为扩展提供更多空间 (Tom Lane)
用 gcc 构建共享库时始终使用 -fPIC 而不是 -fpic(Tom Lane)
这在有差别的平台上支持更大的扩展库。
在 MSVC 构建中,处理 openssl 库不在 VC 子目录内的情况(Andrew Dunstan)
在 MSVC 构建中,为 libxml2 头文件添加正确 的包含路径(Andrew Dunstan)
这修复了以前需要移动标准 Windows 安装的 libxml2 中某些东西的需要。
在 MSVC 构建中,识别名为 tcl86.lib 的 Tcl 库 (Noah Misch)
在 MSVC 构建中,尊重 vcregress.pl 命令行上的 PROVE_FLAGS 设置(Andrew Dunstan)
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。