选择 打开 改范围 完整检索页
不受支持的版本: 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本手册首页的对应页面,或其他在上面列出的活跃大版本。

E.24. 发布版本 10 #

发布日期:. 2017-10-05

E.24.1. 概述

PostgreSQL 10 的主要增强包括:

  • 使用发布/订阅的逻辑复制

  • 声明式表分区

  • 改进查询并行性

  • 显著提升整体性能

  • 基于 SCRAM-SHA-256 的更强密码认证

  • 改进监控和控制

以下各节将更详细地说明上述项目。

E.24.2. 迁移到版本 10

对于希望从任何先前版本迁移数据的用户,需要使用 pg_dumpall 进行导出/恢复,或使用 pg_upgrade 或逻辑复制。 有关迁移到新主版本的一般信息,请参见 Section 18.6

版本 10 包含许多可能影响与先前版本兼容性的变更。 请注意以下不兼容性:

  • 使用 pg_upgrade 从任何先前的 PostgreSQL 大版本升级后,必须重建哈希索引(Mithun Cy,Robert Haas,Amit Kapila)

    哈希索引的重大改进使这一要求成为必要。pg_upgrade 会创建一个脚本来协助完成此操作。

  • 将预写式日志目录 pg_xlog 重命名为 pg_wal,将事务状态目录 pg_clog 重命名为 pg_xact(Michael Paquier)

    用户有时会误以为这些目录只包含无关紧要的日志文件,进而手动删除预写式日志文件或事务状态文件,造成无法恢复的数据丢失。这些名称的修改旨在减少今后发生此类错误。

  • 重命名名称中引用 xlogSQL 函数、工具和选项,改用 wal(Robert Haas)

    例如,pg_switch_xlog() 改为 pg_switch_wal()pg_receivexlog 改为 pg_receivewal--xlogdir 改为 --waldir。这是为了与 pg_xlog 目录名的变更保持一致;总体而言,所有面向用户的位置都不再使用 xlog 这一术语。

  • 重命名与 WAL 相关的函数和视图,使用 lsn 代替 location(David Rowley)

    以前,这两种术语的使用并不一致。

  • 更改查询 SELECT 列表中集合返回函数的实现(Andres Freund)

    现在,集合返回函数会在 SELECT 列表中的标量表达式求值之前求值,效果类似于将它们放在 LATERAL FROM 子句项中。这使存在多个集合返回函数时的语义更合理。如果它们返回的行数不同,会通过补充空值将较短的结果扩展到最长结果的长度。以前,各个结果会循环产生,直到它们同时结束,产生的行数等于各函数周期的最小公倍数。此外,现在禁止在 CASECOALESCE 结构内使用集合返回函数。更多信息参见 Section 37.4.8

  • UPDATE ... SET (column_list) = row_constructor 中使用标准行构造器语法(Tom Lane)

    现在,row_constructor 可以以关键字 ROW 开头;以前必须省略该关键字。如果 column_list 中只有一个列名,则 row_constructor 现在必须使用 ROW 关键字,否则它就不是有效的行构造器,而只是带括号的表达式。此外,row_constructor 内出现的 table_name.* 现在会展开为多列,与 row_constructor 在其他场景中的用法一致。

  • ALTER TABLE ... ADD PRIMARY KEY 将列标记为 NOT NULL 时,此变更现在也会传播到继承子表(Michael Paquier)

  • 防止语句级触发器在每条语句中触发多次(Tom Lane)

    如果可写 CTE 更新的表也被包含它的语句或另一个可写 CTE 更新,BEFORE STATEMENTAFTER STATEMENT 触发器就会触发多次。此外,如果受外键实施动作(如 ON DELETE CASCADE)影响的表上存在语句级触发器,它们可能在每条外层 SQL 语句中触发多次。这违反 SQL 标准,因此予以更改。

  • 将序列的元数据字段移入新的 pg_sequence 系统目录(Peter Eisentraut)

    序列关系现在只存储 nextval() 可以修改的字段,即 last_valuelog_cntis_called。起始值和增量等其他序列属性保存在 pg_sequence 目录的对应行中。ALTER SEQUENCE 的更新现在完全具有事务性,这意味着序列会被锁定到提交为止。nextval()setval() 函数仍然不具有事务性。

    此项修改引入的主要不兼容之处在于,从序列关系中查询时,现在只会返回上述三个字段。要获取序列的其他属性,应用必须查询 pg_sequence。新的系统视图 pg_sequences 也可用于此目的;它提供的列名与现有代码更为兼容。

    此外,为 SERIAL 列创建的序列现在生成 32 位正值,而以前的版本生成 64 位值。如果这些值只存储在列中,则没有可见影响。

    psql\d 命令针对序列的输出也经过了重新设计。

  • 使 pg_basebackup 默认以流方式传输恢复备份所需的 WAL(Magnus Hagander)

    这将 pg_basebackup-X/--wal-method 默认值改为 stream。新增选项值 none,用于复现旧行为。pg_basebackup-x 选项已移除(请改用 -X fetch)。

  • 更改逻辑复制使用 pg_hba.conf 的方式(Peter Eisentraut)

    在以前的版本中,逻辑复制连接要求数据库列使用 replication 关键字。从此版本起,逻辑复制匹配包含数据库名或 all 等关键字的普通条目。物理复制继续使用 replication 关键字。由于内置逻辑复制是此版本的新功能,这项变更只影响第三方逻辑复制插件的用户。

  • 使所有 pg_ctl 动作默认等待完成(Peter Eisentraut)

    以前,某些 pg_ctl 动作不会等待完成,需要使用 -w 才会等待。

  • 将服务器参数 log_directory 的默认值从 pg_log 改为 log(Andreas Karlsson)

  • 增加配置选项 ssl_dh_params_file,用于指定自定义 OpenSSL DH 参数的文件名(Heikki Linnakangas)

    这取代了硬编码且未记录在文档中的文件名 dh1024.pem。注意,默认不再检查 dh1024.pem;如果要使用自定义 DH 参数,必须设置此选项。

  • 将 OpenSSL 临时 DH 密码套件使用的默认 DH 参数长度增加到 2048 位(Heikki Linnakangas)

    编译内置的 DH 参数长度已从 1024 位增加到 2048 位,使 DH 密钥交换更能抵御暴力攻击。但是,某些旧 SSL 实现,尤其是 Java Runtime Environment 6 的某些修订版,不接受超过 1024 位的 DH 参数,因此无法通过 SSL 连接。如果必须支持此类旧客户端,可以使用自定义的 1024 位 DH 参数代替编译内置的默认值。参见 ssl_dh_params_file

  • 移除在服务器上存储未加密密码的能力(Heikki Linnakangas)

    服务器参数 password_encryption 不再支持 offplainCREATE/ALTER USER ... PASSWORD 不再支持 UNENCRYPTED 选项。同样,createuser--unencrypted 选项也已移除。从旧版本迁移来的未加密密码在此版本中会以加密形式存储。password_encryption 的默认设置仍为 md5

  • 增加服务器参数 min_parallel_table_scan_sizemin_parallel_index_scan_size,用于控制并行查询(Amit Kapila,Robert Haas)

    这两个参数取代了被认为过于笼统的 min_parallel_relation_size

  • 不再将 shared_preload_libraries 及相关服务器参数中未加引号的文本转为小写(QL Zhuo)

    这些设置实际上是文件名列表,但以前被当作 SQL 标识符列表处理,而两者的解析规则不同。

  • 移除服务器参数 sql_inheritance(Robert Haas)

    将此设置改为非默认值,会使引用父表的查询不包含子表。但是,SQL 标准要求包含子表,而且这从 PostgreSQL 7.1 起就是默认行为。

  • 允许将多维数组传给 PL/Python 函数,并以嵌套 Python 列表形式返回(Alexey Grishchenko,Dave Cramer,Heikki Linnakangas)

    此功能需要对 PL/Python 中复合类型数组的处理进行一项不向后兼容的更改。以前,可以通过编写如 [[col1, col2], [col1, col2]] 的形式返回复合值数组;但现在这会被解释为二维数组。为消除歧义,数组中的复合类型现在必须写成 Python 元组,不能写成列表;也就是说,应改为 [(col1, col2), (col1, col2)]

  • 移除 PL/Tcl 的模块自动加载功能(Tom Lane)

    此功能已由新的服务器参数 pltcl.start_procpltclu.start_proc 取代,它们更易使用,也更类似于其他 PL 提供的功能。

  • 移除 pg_dump/pg_dumpall 对从 8.0 之前的服务器转储的支持(Tom Lane)

    需要从 8.0 之前的服务器转储的用户,必须使用 PostgreSQL 9.6 或更早版本的转储程序。生成的输出仍应能成功载入较新的服务器。

  • 移除对浮点时间戳和时间间隔的支持(Tom Lane)

    这移除了 configure 的 --disable-integer-datetimes 选项。浮点时间戳的优势很少,而且从 PostgreSQL 8.3 起就不再是默认选择。

  • 移除服务器对客户端/服务器协议 1.0 版的支持(Tom Lane)

    PostgreSQL 6.3 起,客户端就不再支持此协议。

  • 移除 contrib/tsearch2 模块(Robert Haas)

    此模块用于兼容 PostgreSQL 8.3 之前的发行版所附带的全文搜索版本。

  • 移除 createlangdroplang 命令行应用程序(Peter Eisentraut)

    它们从 PostgreSQL 9.1 起就已弃用。请改为直接使用 CREATE EXTENSIONDROP EXTENSION

  • 移除对版本 0 函数调用约定的支持(Andres Freund)

    提供 C 编写函数的扩展现在必须遵循版本 1 调用约定。版本 0 从 2001 年起就已弃用。

E.24.3. 变更

以下是 PostgreSQL 10 与上一个主版本之间变更的详细说明。

E.24.3.1. 服务器

E.24.3.1.1. 并行查询
  • 支持并行 B-树索引扫描(Rahila Syed,Amit Kapila,Robert Haas,Rafia Sabih)

    此变更允许不同的并行工作进程搜索 B-树索引页。

  • 支持并行位图堆扫描(Dilip Kumar)

    这允许单次索引扫描派发并行工作进程来处理堆的不同区域。

  • 允许并行执行归并连接(Dilip Kumar)

  • 允许并行运行非相关子查询(Amit Kapila)

  • 改进并行工作进程返回预排序数据的能力(Rushabh Lathia)

  • 扩大过程语言函数中并行查询的使用范围(Robert Haas,Rafia Sabih)

  • 增加服务器参数 max_parallel_workers,用于限制可用于查询并行处理的工作进程数量(Julien Rouhaud)

    可以将此参数设为低于 max_worker_processes 的值,为并行查询以外的用途预留工作进程。

  • max_parallel_workers_per_gather 的默认设置改为 2,以默认启用并行处理。

E.24.3.1.2. 索引
  • 为哈希索引增加预写式日志支持(Amit Kapila)

    这使哈希索引能够安全应对崩溃并支持复制。以前关于其使用的警告消息已移除。

  • 提升哈希索引性能(Amit Kapila,Mithun Cy,Ashutosh Sharma)

  • INETCIDR 数据类型增加 SP-GiST 索引支持(Emre Hasegeli)

  • 增加一个选项,允许更积极地生成 BRIN 索引摘要(Álvaro Herrera)

    新增的 CREATE INDEX 选项可在创建新页范围时,自动为前一个 BRIN 页范围生成摘要。

  • 增加用于移除和重新添加 BRIN 索引范围的 BRIN 摘要的函数(Álvaro Herrera)

    新的 SQL 函数 brin_summarize_range() 更新指定范围的 BRIN 索引摘要,而 brin_desummarize_range() 将其移除。这有助于更新因 UPDATEDELETE 而缩小的范围的摘要。

  • 提高判断 BRIN 索引扫描是否有益的准确性(David Rowley,Emre Hasegeli)

  • 通过更有效地复用索引空间,加快 GiST 的插入和更新(Andrey Borodin)

  • 减少清理 GIN 索引期间的页锁定(Andrey Borodin)

E.24.3.1.3. 锁定
E.24.3.1.4. 优化器
  • 增加多列优化器统计信息,用于计算相关比率和不同值数量(Tomas Vondra,David Rowley,Álvaro Herrera)

    新命令包括 CREATE STATISTICSALTER STATISTICSDROP STATISTICS。此功能有助于估算查询内存用量,以及组合各列的统计信息。

  • 提高受行级安全限制影响的查询的性能(Tom Lane)

    优化器现在更清楚可以将 RLS 过滤条件放在何处,从而在安全实施 RLS 条件的同时生成更好的计划。

E.24.3.1.5. 一般性能
  • 加快使用 numeric 类型算术计算累计和的聚合函数,包括 SUM()AVG()STDDEV() 的某些变体(Heikki Linnakangas)

  • 通过使用基数树提升字符编码转换性能(Kyotaro Horiguchi,Heikki Linnakangas)

  • 降低查询执行期间的表达式求值开销和计划节点调用开销(Andres Freund)

    这对于处理大量行的查询尤其有帮助。

  • 允许对分组集使用哈希聚合(Andrew Gierth)

  • 利用唯一性保证优化某些连接类型(David Rowley)

  • 提升 macaddr 数据类型的排序性能(Brandur Leach)

  • 减少引用数千个关系的会话中的统计信息跟踪开销(Aleksander Alekseev)

E.24.3.1.6. 监控
  • 允许显式控制 EXPLAIN 是否显示规划和执行时间(Ashutosh Bapat)

    默认情况下,EXPLAIN ANALYZE 会显示规划和执行时间,其他情况下则不显示。新的 EXPLAIN 选项 SUMMARY 允许显式控制这一行为。

  • 增加默认监控角色(Dave Page)

    新角色 pg_monitorpg_read_all_settingspg_read_all_statspg_stat_scan_tables 可以简化权限配置。

  • REFRESH MATERIALIZED VIEW 期间正确更新统计信息收集器(Jim Mlodgenski)

E.24.3.1.6.1. Logging
  • 更改 log_line_prefix 的默认值,使 postmaster 日志输出的每一行都包含当前时间戳(含毫秒)和进程 ID(Christoph Berg)

    以前的默认值是空前缀。

  • 增加返回日志和 WAL 目录内容的函数(Dave Page)

    新增函数为 pg_ls_logdir()pg_ls_waldir(),拥有适当权限的非超级用户也可以执行它们。

  • 增加函数 pg_current_logfile(),用于读取日志收集器当前的 stderr 和 csvlog 输出文件名(Gilles Darold)

  • 在 postmaster 启动期间,在服务器日志中报告每个监听套接字的地址和端口号(Tom Lane)

    此外,在记录绑定监听套接字失败时,包含尝试绑定的具体地址。

  • 减少关于启动器子进程启动和停止的冗余日志(Tom Lane)

    这些消息现在使用 DEBUG1 级别。

  • 减少 log_min_messages 所控制的较低编号调试级别的消息详细程度(Robert Haas)

    这也改变了 client_min_messages 各调试级别的详细程度。

E.24.3.1.6.2. pg_stat_activity
  • 增加 pg_stat_activity 对底层等待状态的报告(Michael Paquier,Robert Haas,Rushabh Lathia)

    此变更允许报告大量底层等待条件,包括 锁存器等待、文件读取/写入/fsync、客户端读取/写入以及同步复制。

  • pg_stat_activity 中显示辅助进程、后台工作进程和 WAL 发送进程 进程(Kuntal Ghosh,Michael Paquier)

    这简化了监控。新列 backend_type 用于标识进程类型。

  • 允许 pg_stat_activity 显示并行工作进程正在执行的 SQL 查询(Rafia Sabih)

  • pg_stat_activity.wait_event_type 的值 LWLockTrancheLWLockNamed 重命名为 LWLock(Robert Haas)

    这使输出更一致。

E.24.3.1.7. Authentication
  • 增加对使用 SCRAM-SHA-256 协商和存储密码的支持(Michael Paquier,Heikki Linnakangas)

    这比现有的 md5 协商和存储方式更安全。

  • 将服务器参数 password_encryptionboolean 改为 enum(Michael Paquier)

    这是支持更多密码哈希选项所必需的。

  • 增加视图 pg_hba_file_rules,用于显示 pg_hba.conf 的内容(Haribabu Kommi)

    它显示的是文件内容,而非当前生效的设置。

  • 支持多个 RADIUS 服务器(Magnus Hagander)

    所有与 RADIUS 相关的参数现在都使用复数形式,并支持以逗号分隔的服务器列表。

E.24.3.1.8. 服务器配置
  • 允许在重新加载配置时更新 SSL 配置(Andreas Karlsson,Tom Lane)

    这允许通过使用 pg_ctl reloadSELECT pg_reload_conf() 或发送 SIGHUP 信号来重新配置 SSL,无需重启服务器。但是,如果服务器的 SSL 密钥需要口令,则无法重新加载 SSL 配置,因为无法再次提示输入口令。在这种情况下,原始配置会在 postmaster 的整个生命周期内生效。

  • 使 bgwriter_lru_maxpages 的最大值实际上不再受限(Jim Nasby)

E.24.3.1.9. 可靠性
  • 创建文件或解除文件链接后,对其父目录执行 fsync(Michael Paquier)

    这降低了断电后丢失数据的风险。

E.24.3.1.9.1. 预写式日志WAL
  • 防止在其他方面处于空闲状态的系统上执行不必要的检查点和 WAL 归档(Michael Paquier)

  • 增加服务器参数 wal_consistency_checking,用于向 WAL 添加可在备库上进行合理性检查的详细信息(Kuntal Ghosh,Robert Haas)

    任何合理性检查失败都会在备库上产生致命错误。

  • 将可配置的最大 WAL 段大小增加到 1 GB(Beena Emerson)

    较大的 WAL 段可以减少 archive_command 调用次数,以及需要管理的 WAL 文件数量。

E.24.3.2. 复制与恢复

  • 增加将表逻辑复制到备库的能力(Petr Jelinek)

    逻辑复制比物理复制更灵活,包括在不同 PostgreSQL 大版本之间复制以及选择性复制。

  • 允许等待备库的提交确认,而不受其在 synchronous_standby_names 中出现顺序的影响(Masahiko Sawada)

    以前,服务器始终等待 synchronous_standby_names 中最先出现的活动备库。新的 synchronous_standby_names 关键字 ANY 允许等待任意指定数量的备库,而不考虑其排列顺序。这称为法定人数提交。

  • 减少执行流式备份和复制所需的配置变更(Magnus Hagander,Dang Minh Huong)

    具体而言,更改了 wal_levelmax_wal_sendersmax_replication_slotshot_standby 的默认值,使其开箱即可用于这些场景。

  • pg_hba.conf 中默认启用来自 localhost 连接的复制(Michael Paquier)

    以前,pg_hba.conf 中的复制连接行默认被注释掉。这对于 pg_basebackup 尤其有用。

  • pg_stat_replication 添加列,以报告复制延迟时间(Thomas Munro)

    新列为 write_lagflush_lagreplay_lag

  • 允许在 recovery.conf 中按日志序列号(LSN)指定恢复停止点(Michael Paquier)

    以前,只能按时间戳或 XID 选择停止点。

  • 允许用户禁用 pg_stop_backup() 等待所有 WAL 完成归档的行为(David Steele)

    pg_stop_backup() 的可选第二参数控制这一行为。

  • 允许创建临时复制槽(Petr Jelinek)

    临时槽会在会话退出或出错时自动移除。

  • 通过更好地跟踪访问排他锁,提升热备重放性能(Simon Riggs,David Rowley)

  • 提升两阶段提交恢复性能(Stas Kelvich,Nikhil Sontakke,Michael Paquier)

E.24.3.3. 查询

  • 增加 XMLTABLE 函数,将 XML 格式的数据转换为行集(Pavel Stehule,Álvaro Herrera)

  • 修复正则表达式对较大字符码的字符类处理,尤其是 U+7FF 以上的 Unicode 字符(Tom Lane)

    以前,这类字符从不会被识别为属于 [[:alpha:]] 等依赖区域设置的字符类。

E.24.3.4. 工具命令

  • 增加表分区语法,自动创建分区约束,并处理元组插入和更新的路由(Amit Langote)

    该语法支持范围分区和列表分区。

  • 增加 AFTER 触发器的过渡表,以记录已变更的行(Kevin Grittner,Thomas Munro)

    使用服务器端语言编写的触发器可以访问过渡表。

  • 允许使用限制性行级安全策略(Stephen Frost)

    以前,所有安全策略都是宽松的,只要任意策略匹配就允许访问。限制性策略则必须匹配才会授予访问权限。这两类策略可以组合使用。

  • 创建外键约束时,只检查被引用表上的 REFERENCES 权限(Tom Lane)

    以前,还要求引用表上的 REFERENCES 权限。这似乎源于对 SQL 标准的误读。由于创建外键约束(或任何其他类型的约束)需要拥有被约束的表,额外要求 REFERENCES 权限似乎毫无意义。

  • 允许为模式设置默认权限(Matheus Oliveira)

    这通过 ALTER DEFAULT PRIVILEGES 命令完成。

  • 增加 CREATE SEQUENCE AS 命令,用于创建与某个整数数据类型匹配的序列(Peter Eisentraut)

    这简化了创建与基础列取值范围匹配的序列。

  • 允许对具有 INSTEAD INSERT 触发器的视图执行 COPY view FROM source(Haribabu Kommi)

    这些触发器会接收 COPY 读取的数据行。

  • 允许在 DDL 命令中指定不带参数的函数名,前提是该名称唯一(Peter Eisentraut)

    例如,如果某个名称只对应一个函数,就允许对不带参数的该函数名执行 DROP FUNCTION。这是 SQL 标准要求的行为。

  • 允许用一条 DROP 命令删除多个函数、操作符和聚合(Peter Eisentraut)

  • CREATE SERVERCREATE USER MAPPINGCREATE COLLATION 中支持 IF NOT EXISTS(Anastasia Lubennikova,Peter Eisentraut)

  • 使 VACUUM VERBOSE 报告跳过的冻结页数量和最老的 xmin(Masahiko Sawada,Simon Riggs)

    这些信息也包含在 log_autovacuum_min_duration 的输出中。

  • 加快 VACUUM 移除末尾空堆页的速度(Claudio Freire,Álvaro Herrera)

E.24.3.5. 数据类型

  • JSONJSONB 增加全文搜索支持(Dmitry Dolgov)

    现在可以将函数 ts_headline()to_tsvector() 用于这些数据类型。

  • 通过新的数据类型 macaddr8,增加对 EUI-64 MAC 地址的支持(Haribabu Kommi)

    这补充了现有的 EUI-48 MAC 地址支持(类型 macaddr)。

  • 增加标识列,用于在插入时为列分配数值(Peter Eisentraut)

    它们类似于 SERIAL 列,但符合 SQL 标准。

  • 允许重命名 ENUM 值(Dagfinn Ilmari Mannsåker)

    这使用语法 ALTER TYPE ... RENAME VALUE

  • to_json()to_jsonb() 中,正确地将数组伪类型(anyarray)视为数组(Andrew Dunstan)

    以前,声明为 anyarray 的列(尤其是 pg_stats 视图中的列)会被转换为 JSON 字符串,而不是数组。

  • 增加用于 money 值与 int8 值相乘和相除的操作符(Peter Eisentraut)

    以前,这类情况会先将 int8 值转换为 float8,再使用 moneyfloat8 的操作符。新行为避免了可能的精度损失。但请注意,money 除以 int8 现在会像其他整数除法一样截断商,而以前的行为会进行舍入。

  • money 类型的输入函数中检查溢出(Peter Eisentraut)

E.24.3.6. 函数

  • 增加简化的 regexp_match() 函数(Emre Hasegeli)

    它类似于 regexp_matches(),但只返回第一次匹配的结果,因此不需要返回集合,在简单场景下更易使用。

  • 增加 jsonb删除操作符的一个版本,接受要删除的键组成的数组(Magnus Hagander)

  • 使 json_populate_record() 及相关函数递归处理 JSON 数组和对象(Nikita Glukhov)

    此变更使目标 SQL 类型中的数组类型字段能够从 JSON 数组正确转换,复合类型字段能够从 JSON 对象正确转换。以前,这类情况会失败,因为 JSON 值的文本表示会被传给 array_in()record_in(),而其语法不符合这些输入函数的预期。

  • 增加函数 txid_current_if_assigned(),用于返回当前事务 ID,或者在尚未分配事务 ID 时返回 NULL(Craig Ringer)

    这与 txid_current() 不同,后者始终返回事务 ID,并在必要时分配一个。与后者不同,此函数可以在备库上运行。

  • 增加函数 txid_status(),用于检查事务是否已提交(Craig Ringer)

    这有助于在连接突然断开后,检查前一个事务是否其实已提交,只是您没有收到确认。

  • 允许 make_date() 将负数年份解释为公元前(BC)年份(Álvaro Herrera)

  • 使 to_timestamp()to_date() 拒绝超出范围的输入字段(Artur Zakirov)

    例如,以前会接受 to_date('2009-06-40','YYYY-MM-DD') 并返回 2009-07-10。现在它会产生错误。

E.24.3.7. 服务器端语言

  • 允许将 PL/Python 的 cursor()execute() 函数作为其计划对象参数的方法调用(Peter Eisentraut)

    这允许采用更面向对象的编程风格。

  • 允许 PL/pgSQL 的 GET DIAGNOSTICS 语句将值取回到数组元素中(Tom Lane)

    以前,一项语法限制不允许目标变量是数组元素。

E.24.3.7.1. PL/Tcl
  • 允许 PL/Tcl 函数返回复合类型和集合(Karl Lehenbauer)

  • 为 PL/Tcl 增加子事务命令(Victor Wagner)

    这允许 PL/Tcl 查询失败而不中止整个函数。

  • 增加服务器参数 pltcl.start_procpltclu.start_proc,允许在 PL/Tcl 启动时调用初始化函数(Tom Lane)

E.24.3.8. 客户端接口

  • 允许在 libpq 连接字符串和 URI 中指定多个主机名或地址(Robert Haas,Heikki Linnakangas)

    libpq 会连接到列表中第一个响应的服务器。

  • 允许 libpq 连接字符串和 URI 请求可读写主机,即主库而非备库(Victor Wagner,Mithun Cy)

    这在指定多个主机名时很有用。它由 libpq 连接参数 target_session_attrs 控制。

  • 允许将密码文件名指定为 libpq 连接参数(Julian Markwort)

    以前,只能通过环境变量指定此项。

  • 增加函数 PQencryptPasswordConn(),允许在客户端创建更多类型的加密密码(Michael Paquier,Heikki Linnakangas)

    以前,只能使用 PQencryptPassword() 创建 MD5 加密的密码。新函数还可以创建 SCRAM-SHA-256 加密的密码。

  • ecpg 预处理器版本从 4.12 改为 10(Tom Lane)

    今后,ecpg 版本将与 PostgreSQL 发行版的版本号一致。

E.24.3.9. 客户端应用程序

E.24.3.9.1. psql
  • psql 增加条件分支支持(Corey Huinker)

    此功能增加了 psql 元命令 \if\elif\else\endif。这主要有助于编写脚本。

  • 增加 psql 元命令 \gx,以扩展模式(\x)执行(\g)查询(Christoph Berg)

  • 在反引号执行的字符串中展开 psql 变量引用(Tom Lane)

    这在新的 psql 条件分支命令中尤其有用。

  • 防止将 psql 的特殊变量设为无效值(Daniel Vérité,Tom Lane)

    以前,将 psql 的某个特殊变量设为无效值,会静默采用默认行为。现在,如果拟设置的新值无效,对特殊变量执行 \set 就会失败。一个特殊例外是,对布尔值特殊变量执行 \set,且新值为空或省略时,仍会将变量设为 on;但现在它实际取得的就是该值,而不是空字符串。现在,对特殊变量执行 \unset 会显式将其设为默认值,这也是启动时取得的值。因此,控制变量现在始终有一个可显示的值,反映 psql 的实际行为。

  • 增加显示服务器版本和 psql 版本的变量(Fabien Coelho)

  • 改进 psql\d(显示关系)和 \dD(显示域)命令,在单独的列中显示排序规则、是否可空和默认值属性(Peter Eisentraut)

    以前,它们显示在同一个 Modifiers 列中。

  • 使各个 \d 命令对没有匹配对象的情况的处理更一致(Daniel Gustafsson)

    现在,它们都将相关消息输出到 stderr,而非 stdout,消息的措辞也更一致。

  • 改进 psql 的 Tab 补全(Jeff Janes,Ian Barwick,Andreas Karlsson,Sehrope Sarkuni,Thomas Munro,Kevin Grittner,Dagfinn Ilmari Mannsåker)

E.24.3.9.2. pgbench
  • 增加 pgbench 选项 --log-prefix,用于控制日志文件前缀(Masahiko Sawada)

  • 允许 pgbench 的元命令跨越多行(Fabien Coelho)

    现在可以通过在行尾写反斜杠并换行,将元命令延续到下一行。

  • 移除 -M 选项相对于其他命令行选项的位置限制(Tom Lane)

E.24.3.10. 服务器应用程序

  • 增加 pg_receivewal 选项 -Z/--compress,用于指定压缩(Michael Paquier)

  • 增加 pg_recvlogical 选项 --endpos,用于指定结束位置(Craig Ringer)

    这补充了现有的 --startpos 选项。

  • initdb 选项 --noclean--nosync 重命名为 --no-clean--no-sync(Vik Fearing,Peter Eisentraut)

    仍支持旧的拼写。

E.24.3.10.1. pg_dump, pg_dumpall, pg_restore
  • 允许 pg_restore 排除模式(Michael Banck)

    这增加了新的 -N/--exclude-schema 选项。

  • pg_dump 增加 --no-blobs 选项(Guillaume Lelarge)

    这会禁止转储大对象。

  • pg_dumpall 增加 --no-role-passwords 选项,以省略角色密码(Robins Tharakan,Simon Riggs)

    这使非超级用户也能够使用 pg_dumpall;如果没有此选项,它会因无法读取密码而失败。

  • 支持从备库转储时使用同步快照(Petr Jelinek)

  • pg_dumppg_dumpall 生成的输出文件执行 fsync()(Michael Paquier)

    这能更可靠地确保输出在程序退出前已安全存储到磁盘上。可以通过新增的 --no-sync 选项禁用此行为。

E.24.3.10.2. pg_basebackup
  • 允许 pg_basebackup 在 tar 模式下以流方式传输预写式日志(Magnus Hagander)

    WAL 将存储在与基础备份分开的 tar 文件中。

  • 使 pg_basebackup 使用临时复制槽(Magnus Hagander)

    pg_basebackup 使用默认选项进行 WAL 流传输时,默认会使用临时复制槽。

  • 更谨慎地确保 pg_basebackuppg_receivewal 在所有需要的位置执行 fsync(Michael Paquier)

  • 增加 pg_basebackup 选项 --no-sync,用于禁用 fsync(Michael Paquier)

  • 改进 pg_basebackup 对需要跳过的目录的处理(David Steele)

E.24.3.10.3. pg_ctl
  • pg_ctl 的提升操作增加等待选项(Peter Eisentraut)

  • pg_ctl 的等待和不等待操作增加长选项,分别为 --wait--no-wait(Vik Fearing)

  • pg_ctl 的服务器选项增加长选项 --options(Peter Eisentraut)

  • 使 pg_ctl start --wait 通过观察 postmaster.pid 来检测服务器是否就绪,而不是尝试连接(Tom Lane)

    postmaster 现在会在 postmaster.pid 中报告其已准备好接受连接的状态,pg_ctl 会检查该文件,以检测启动是否完成。这比旧方法更高效可靠,也消除了启动期间连接尝试被拒绝所产生的 postmaster 日志条目。

  • 缩短 pg_ctl 等待 postmaster 启动或停止时的响应时间(Tom Lane)

    现在,pg_ctl 在等待 postmaster 状态变化时每秒探测十次,而不是每秒一次。

  • 确保 pg_ctl 在所等待的操作未于超时期限内完成时,以非零状态退出(Peter Eisentraut)

    在这种情况下,startpromote 操作现在返回退出状态 1,而非 0。stop 操作一直如此。

E.24.3.11. 源代码

  • 改用由两部分组成的发行版版本号(Peter Eisentraut,Tom Lane)

    发行版版本号现在由两部分组成(如 10.1),而非三部分(如 9.6.3)。大版本现在只增加第一个数字,小版本只增加第二个数字。发布分支将用单个数字表示(如 10,而非 9.6)。此变更旨在减少用户对 PostgreSQL 大版本和小版本含义的困惑。

  • 改进 pgindent 的行为(Piotr Stefaniak,Tom Lane)

    我们已切换到新的 pg_bsd_indent 版本,其中纳入了 FreeBSD 项目近期的改进。这修复了许多导致 C 代码格式异常的小缺陷。最明显的是,括号内的行(例如多行函数调用)现在统一缩进到与左括号对齐,即使这样会使代码超出右边界。

  • 允许选择使用 ICU 库提供排序规则支持(Peter Eisentraut)

    ICU 库具有版本信息,可以检测版本之间的排序规则变更。通过 configure 选项 --with-icu 可启用此功能。默认仍使用操作系统的原生排序规则库。

  • Windows 上,自动将所有 PG_FUNCTION_INFO_V1 函数标记为 DLLEXPORT(Laurenz Albe)

    如果第三方代码使用 extern 函数声明,也应在这些声明中添加 DLLEXPORT 标记。

  • 移除不再需要的 SPI 函数 SPI_push()SPI_pop()SPI_push_conditional()SPI_pop_conditional()SPI_restore_connection()(Tom Lane)

    它们的功能现在会自动执行。目前提供了这些名称的空操作宏,使外部模块不必立即更新,但最终应移除这些调用。

    此变更的一个附带影响是,SPI_palloc() 及相关函数现在要求存在活动的 SPI 连接;没有连接时,它们不会退化为简单的 palloc() 调用。以前的行为用途不大,还存在意外内存泄漏的风险。

  • 允许动态分配共享内存(Thomas Munro,Robert Haas)

  • 增加类似 slab 的内存分配器,以高效分配固定大小的内存(Tomas Vondra)

  • LinuxFreeBSD 上使用 POSIX 信号量代替 SysV 信号量(Tom Lane)

    这避免了平台特定的 SysV 信号量使用限制。

  • 改进对 64 位原子操作的支持(Andres Freund)

  • ARM64 上启用 64 位原子操作(Roman Shaposhnik)

  • 如果 clock_gettime() 可用,则改用它进行持续时间测量(Tom Lane)

    如果 clock_gettime() 不可用,仍使用 gettimeofday()

  • 增加更健壮的随机数生成器,用于要求密码学安全性的场景(Magnus Hagander,Michael Paquier,Heikki Linnakangas)

    如果找不到强随机数生成器,configure 会失败,除非使用 --disable-strong-random 选项。但是,使用此选项时,需要强随机数生成器的 pgcrypto 函数会被禁用。

  • 允许 WaitLatchOrSocket() 在 Windows 上等待套接字连接(Andres Freund)

  • tupconvert.c 中的函数不再仅为嵌入不同的复合类型 OID 而转换元组(Ashutosh Bapat,Tom Lane)

    大多数调用者并不关心复合类型 OID;但如果结果元组要作为复合 Datum 使用,就应采取措施确保其中插入了正确的 OID。

  • 移除 SCOUnixware 移植版本(Tom Lane)

  • 全面改进文档构建过程(Alexander Lakhin)

  • 使用 XSLT 构建 PostgreSQL 文档(Peter Eisentraut)

    以前使用的是 JadeDSSSLJadeTex

  • 默认使用 XSLT 样式表构建 HTML 文档(Peter Eisentraut)

E.24.3.12. 附加模块

  • 允许 file_fdw 读取程序输出以及文件(Corey Huinker,Adam Gomaa)

  • postgres_fdw 中,尽可能将聚合函数下推到远程服务器(Jeevan Chalke,Ashutosh Bapat)

    这减少了必须从远程服务器传输的数据量,并将聚合计算从发出请求的服务器转移出去。

  • postgres_fdw 中,在更多情况下将连接下推到远程服务器(David Rowley,Ashutosh Bapat,Etsuro Fujita)

  • 正确支持 postgres_fdw 表中的 OID 列(Etsuro Fujita)

    以前,OID 列始终返回零。

  • 允许 btree_gistbtree_gin 为枚举类型建立索引(Andrew Dunstan)

    这允许在排他约束中使用枚举。

  • btree_gist 增加对 UUID 数据类型的索引支持(Paul Jungwirth)

  • 增加 amcheck,用于检查 B-树索引的有效性(Peter Geoghegan)

  • pg_stat_statements 中,将被忽略的常量显示为 $N,而非 ?(Lukas Fittl)

  • 改进 cube 对零维立方体的处理(Tom Lane)

    这也改进了对 infiniteNaN 值的处理。

  • 允许 pg_buffercache 使用更少的锁运行(Ivan Kartyshov)

    这降低了它在生产系统上运行时的干扰。

  • 增加 pgstattuple 函数 pgstathashindex(),用于查看哈希索引统计信息(Ashutosh Sharma)

  • 使用 GRANT 权限控制 pgstattuple 函数的使用(Stephen Frost)

    这使 DBA 可以允许非超级用户运行这些函数。

  • 减少 pgstattuple 检查哈希索引时的锁定(Amit Kapila)

  • 增加 pageinspect 函数 page_checksum(),用于显示页的校验和(Tomas Vondra)

  • 增加 pageinspect 函数 bt_page_items(),用于从页映像中打印页项(Tomas Vondra)

  • pageinspect 增加哈希索引支持(Jesper Pedersen,Ashutosh Sharma)

E.24.4. 致谢 #

以下人员(按字母顺序排列)作为补丁作者、提交者、审查者、测试者 或问题报告者为本版本做出了贡献。

Adam Brightwell
Adam Brusselback
Adam Gomaa
Adam Sah
Adrian Klaver
Aidan Van Dyk
Aleksander Alekseev
Alexander Korotkov
Alexander Lakhin
Alexander Sosna
Alexey Bashtanov
Alexey Grishchenko
Alexey Isayko
Álvaro Hernández Tortosa
Álvaro Herrera
Amit Kapila
Amit Khandekar
Amit Langote
Amul Sul
Anastasia Lubennikova
Andreas Joseph Krogh
Andreas Karlsson
Andreas Scherbaum
Andreas Seltenreich
Andres Freund
Andrew Dunstan
Andrew Gierth
Andrew Wheelwright
Andrey Borodin
Andrey Lizenko
Andy Abelisto
Antonin Houska
Ants Aasma
Arjen Nienhuis
Arseny Sher
Artur Zakirov
Ashutosh Bapat
Ashutosh Sharma
Ashwin Agrawal
Atsushi Torikoshi
Ayumi Ishii
Basil Bourque
Beena Emerson
Ben de Graaff
Benedikt Grundmann
Bernd Helmle
Brad DeJong
Brandur Leach
Breen Hagan
Bruce Momjian
Bruno Wolff III
Catalin Iacob
Chapman Flack
Chen Huajun
Choi Doo-Won
Chris Bandy
Chris Richards
Chris Ruprecht
Christian Ullrich
Christoph Berg
Chuanting Wang
Claudio Freire
Clinton Adams
Const Zhang
Constantin Pan
Corey Huinker
Craig Ringer
Cynthia Shang
Dagfinn Ilmari Mannsåker
Daisuke Higuchi
Damian Quiroga
Dan Wood
Dang Minh Huong
Daniel Gustafsson
Daniel Vérité
Daniel Westermann
Daniele Varrazzo
Danylo Hlynskyi
Darko Prelec
Dave Cramer
Dave Page
David Christensen
David Fetter
David Johnston
David Rader
David Rowley
David Steele
Dean Rasheed
Denis Smirnov
Denish Patel
Dennis Björklund
Devrim Gündüz
Dilip Kumar
Dilyan Palauzov
Dima Pavlov
Dimitry Ivanov
Dmitriy Sarafannikov
Dmitry Dolgov
Dmitry Fedin
Don Morrison
Egor Rogov
Eiji Seki
Emil Iggland
Emre Hasegeli
Enrique Meneses
Erik Nordström
Erik Rijkers
Erwin Brandstetter
Etsuro Fujita
Eugen Konkov
Eugene Kazakov
Euler Taveira
Fabien Coelho
Fabrízio de Royes Mello
Feike Steenbergen
Felix Gerzaguet
Filip Jirsák
Fujii Masao
Gabriele Bartolini
Gabrielle Roth
Gao Zengqi
Gerdan Santos
Gianni Ciolli
Gilles Darold
Giuseppe Broccolo
Graham Dutton
Greg Atkins
Greg Burek
Grigory Smolkin
Guillaume Lelarge
Hans Buschmann
Haribabu Kommi
Heikki Linnakangas
Henry Boehlert
Huan Ruan
Ian Barwick
Igor Korot
Ildus Kurbangaliev
Ivan Kartyshov
Jaime Casanova
Jakob Egger
James Parks
Jarred Ward
Jason Li
Jason O'Donnell
Jason Petersen
Jeevan Chalke
Jeevan Ladhe
Jeff Dafoe
Jeff Davis
Jeff Janes
Jelte Fennema
Jeremy Finzel
Jeremy Schneider
Jeroen van der Ham
Jesper Pedersen
Jim Mlodgenski
Jim Nasby
Jinyu Zhang
Joe Conway
Joel Jacobson
John Harvey
Jon Nelson
Jordan Gigov
Josh Berkus
Josh Soref
Julian Markwort
Julien Rouhaud
Junseok Yang
Justin Muise
Justin Pryzby
Kacper Zuk
KaiGai Kohei
Karen Huddleston
Karl Lehenbauer
Karl O. Pinc
Keith Fiske
Kevin Grittner
Kim Rose Carlsen
Konstantin Evteev
Konstantin Knizhnik
Kuntal Ghosh
Kurt Kartaltepe
Kyle Conroy
Kyotaro Horiguchi
Laurenz Albe
Leonardo Cecchi
Ludovic Vaugeois-Pepin
Lukas Fittl
Magnus Hagander
Maksim Milyutin
Maksym Sobolyev
Marc Rassbach
Marc-Olaf Jaschke
Marcos Castedo
Marek Cvoren
Mark Dilger
Mark Kirkwood
Mark Pether
Marko Tiikkaja
Markus Winand
Marllius Ribeiro
Marti Raudsepp
Martín Marqués
Masahiko Sawada
Matheus Oliveira
Mathieu Fenniak
Merlin Moncure
Michael Banck
Michael Day
Michael Meskes
Michael Overmeyer
Michael Paquier
Mike Palmiotto
Milos Urbanek
Mithun Cy
Moshe Jacobson
Murtuza Zabuawala
Naoki Okano
Nathan Bossart
Nathan Wagner
Neha Khatri
Neha Sharma
Neil Anderson
Nicolas Baccelli
Nicolas Guini
Nicolas Thauvin
Nikhil Sontakke
Nikita Glukhov
Nikolaus Thiel
Nikolay Nikitin
Nikolay Shaplov
Noah Misch
Noriyoshi Shinoda
Olaf Gawenda
Oleg Bartunov
Oskari Saarenmaa
Otar Shavadze
Paresh More
Paul Jungwirth
Paul Ramsey
Pavan Deolasee
Pavel Golub
Pavel Hanák
Pavel Raiskup
Pavel Stehule
Peng Sun
Peter Eisentraut
Peter Geoghegan
Petr Jelínek
Philippe Beaudoin
Pierre-Emmanuel André
Piotr Stefaniak
Prabhat Sahu
QL Zhuo
Radek Slupik
Rafa de la Torre
Rafia Sabih
Ragnar Ouchterlony
Rahila Syed
Rajkumar Raghuwanshi
Regina Obe
Richard Pistole
Robert Haas
Robins Tharakan
Rod Taylor
Roman Shaposhnik
Rushabh Lathia
Ryan Murphy
Sandeep Thakkar
Scott Milliken
Sean Farrell
Sebastian Luque
Sehrope Sarkuni
Sergey Burladyan
Sergey Koposov
Shay Rojansky
Shinichi Matsuda
Sho Kato
Simon Riggs
Simone Gotti
Spencer Thomason
Stas Kelvich
Stepan Pesternikov
Stephen Frost
Steve Randall
Steve Singer
Steven Fackler
Steven Winfield
Suraj Kharage
Sveinn Sveinsson
Sven R. Kunze
Tahir Fakhroutdinov
Taiki Kondo
Takayuki Tsunakawa
Takeshi Ideriha
Tatsuo Ishii
Tatsuro Yamada
Teodor Sigaev
Thom Brown
Thomas Kellerer
Thomas Munro
Tim Goodaire
Tobias Bussmann
Tom Dunstan
Tom Lane
Tom van Tilburg
Tomas Vondra
Tomonari Katsumata
Tushar Ahuja
Vaishnavi Prabakaran
Venkata Balaji Nagothi
Vicky Vergara
Victor Wagner
Vik Fearing
Vinayak Pokale
Viren Negi
Vitaly Burovoy
Vladimir Kunshchikov
Vladimir Rusinov
Yi Wen Wong
Yugo Nagata
Zhen Ming Yang
Zhou Digoal