选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.3
历史版本PostgreSQL 9.3 已于 2018 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

E.8. 版本 9.3.18 #

发行日期:. 2017-08-10

本次发布包含对 9.3.17 的多方面修复。 有关 9.3 大版本中新特性的信息,请参见 第 E.26 节。.

E.8.1. 迁移到版本 9.3.18

对于运行 9.3.X 的用户,不需要进行转储/恢复。

但是,如果你使用的外部数据服务器依赖用户密码进行认证,请参见下面的第一条变更日志条目。

不过,如果你是从早于 9.3.16 的版本升级, 请参见 第 E.10 节

E.8.2. 变更

  • 进一步限制 pg_user_mappings.umoptions 的可见性,以保护存储为用户映射选项的密码(Noah Misch)

    CVE-2017-7486 的修复不正确:它允许用户看到她自己用户映射中的选项,即使 她对相关外部服务器没有 USAGE 权限。这种选项可能 包含由服务器所有者而非用户自己提供的密码。由于 information_schema.user_mapping_options 在这种情况下不显示选项,pg_user_mappings 也不应该。(CVE-2017-7547)

    此补丁本身只会修复新 initdb 的数据库中的行为。如果希望在现有数据库中 应用此更改,需要执行以下操作:

    1. postgresql.conf 中添加 allow_system_table_mods = true 后重启 postmaster。 (在支持 ALTER SYSTEM 的版本中,可以用它进行 配置更改,但仍需重启。)

    2. 在集簇的每个数据库中,以超级用户身份运行以下 命令:

      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);
      
    3. 不要忘记包括 template0template1 数据库,否则漏洞仍会存在于之后创建的 数据库中。要修复 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';
      
    4. 最后,移除 allow_system_table_mods 配置设置,并再次 重启 postmaster。

  • 禁止在所有基于密码的认证方法中使用空密码(Heikki Linnakangas)

    libpq 忽略空的密码说明,不把它们传输给服务 器。因此,如果用户的密码被设为空字符串,就无法通过 psql 或其他基于 libpq 的客户端用该密码登录。管理员可能 因此认为把密码设为空等同于禁用密码登录。然而,使用修改过的或非 libpq 的客户端,登录可能是可能的,这取 决于配置的认证方法。特别是最常见的方法 md5 接受 空密码。更改服务器在所有情况下拒绝空密码。(CVE-2017-7546)

  • 修复元组更新链的并发锁定([Aacute]lvaro Herrera)

    如果多个会话用非冲突锁模式并使用旧快照并发锁定一条元组更新链,且都 成功,由于竞态条件其中一些仍可能失败(并得出没有存活元组版本的 结论)。这会导致诸如外键检查看不到一个确实存在但正被并发更新的 元组之类的后果。

  • 修复冻结 XMAX 是恰好只有一个仍感兴趣成员的多事务的元组时可能的数据 损坏(Teodor Sigaev)

  • 在 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 进程中的 SIGHUPSIGUSR1 处理(Petr Jelinek、 Andres Freund)

  • 修复 postmaster 中竞态条件导致的 walreceiver 进程不必要的缓慢重启 (Tom Lane)

  • 修复 INSERTUPDATE 对 数组之上域类型的列的多个元素赋值的情况(Tom Lane)

  • 允许在聚合函数参数内的子 SELECT 中使用窗口函数 (Tom Lane)

  • ALTER ... RENAME 期间把自动生成的数组类型移开 (Vik Fearing)

    此前我们在 CREATE 期间会把冲突的自动生成数组类型 重命名移开;此修复把该行为扩展到重命名操作。

  • 确保 ALTER USER ... SET 接受 ALTER ROLE ... SET 接受的所有语法变体 (Peter Eisentraut)

  • 把数据类型 I/O 函数的参数或返回类型从 opaque 更改为正确 类型时正确更新依赖信息(Heikki Linnakangas)

    CREATE TYPE 会更新以这种早已过时风格声明的 I/O 函数,但忘记记录对类型的依赖,允许随后的 DROP TYPE 留下损坏的函数定义。

  • 减少 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_dumppg_restoreREFRESH MATERIALIZED VIEW 命令放在最后发出 (Tom Lane)

    这防止了物化视图引用其他用户拥有的表时转储/恢复期间的错误。

  • 修复 pg_dump 使用 --clean 选项按预期删除事件触发器(Tom Lane)

    它现在还正确分配事件触发器的所有权;此前它们被恢复为归运行恢复脚本 的超级用户所有。

  • 修复 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_upgrade 确保结束 WAL 记录不具有 wal_level = minimum (Bruce Momjian)

    这一条件可能阻止升级后的备库服务器重新连接。

  • postgres_fdw 中, ALTER SERVERALTER USER MAPPING 命令之后重建到远程服务器的连接(Kyotaro Horiguchi)

    这确保影响连接参数的选项更改被及时应用。

  • postgres_fdw 中,允许取消远程事务控制命令 (Robert Haas、Rafia Sabih)

    这一更改使我们能在比以前多得多的情况下快速摆脱对无响应远程服务器的 等待。

  • 用 gcc 构建共享库时始终使用 -fPIC 而不是 -fpic(Tom Lane)

    这在有差别的平台上支持更大的扩展库。

  • 修复我们的 Microsoft MSVC 构建脚本中花括号未转义的问题,以避免较新 的 Perl 版本发出警告或报错(Andrew Dunstan)

  • 在 MSVC 构建中,处理 openssl 库不在 VC 子目录内的情况(Andrew Dunstan)

  • 在 MSVC 构建中,为 libxml2 头文件添加正确 的包含路径(Andrew Dunstan)

    这修复了以前需要移动标准 Windows 安装的 libxml2 中某些东西的需要。

  • 在 MSVC 构建中,识别名为 tcl86.lib 的 Tcl 库 (Noah Misch)

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。