E.14.版本 10

发布日期: 2017-10-05

E.14.1. Overview

PostgreSQL 10 的主要增强功能包括:

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

  • 声明式表分区

  • 改进的查询并行性

  • 总体性能显着改善

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

  • 改善监控

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

E.14.2. 迁移到版本 10

那些希望从任何先前版本迁移数据的用户都需要使用pg_dumpallpg_upgrade或逻辑复制进行转储/还原。有关迁移到新的主要版本的一般信息,请参见Section 18.6

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

  • 在 pg_upgrade-ing 之后,必须从任何先前的主要 PostgreSQL 版本(Mithun Cy,Robert Haas,Amit Kapila)重建哈希索引

哈希索引的重大改进使此要求成为必需。 pg_upgrade 将创建一个脚本来辅助这一工作。

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

用户有时会认为这些目录仅包含非必需的日志文件,然后 continue 手动删除预写日志文件或事务状态文件,从而导致不可恢复的数据丢失。这些名称更改旨在防止将来出现此类错误。

  • 将引用“ xlog”的 SQL 函数,工具和选项重命名为“ 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 * s 的其他用法中一样。
  • 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之类的关键字进行匹配。物理复制 continue 使用replication关键字。由于内置逻辑复制是此版本中的新增功能,因此此更改仅影响第三方逻辑复制插件的用户。

  • 默认情况下,让所有pg_ctl个动作 await 完成(Peter Eisentraut)

以前,某些 pg_ctl 操作不 await 完成,而需要使用-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 连接。如果有必要支持此类旧 Client 端,则可以使用自定义的 1024 位 DH 参数,而不使用已编译的默认值。参见ssl_dh_params_file

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

password_encryption服务器参数不再支持offplainCREATE/ALTER USER ... PASSWORD不再支持UNENCRYPTED选项。同样,--unencrypted选项已从 createuser 中删除。从较早版本迁移的未加密密码将在此版本中以加密方式存储。 password_encryption的默认设置仍然是md5

它们替换了min_parallel_relation_size,后者被认为太通用了。

这些设置实际上是文件名列表,但是以前被视为具有不同解析规则的 SQL 标识符列表。

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

从默认值更改此设置会导致引用父表的查询不包括子表。 SQL 标准要求将它们包括在内,但这是自 PostgreSQL 7.1 起的默认设置。

  • 允许将多维数组传递到 PL/Python 函数中,并作为嵌套的 Python 列表返回(Alexey Grishchenko,Dave Cramer,Heikki Linnakangas)

此功能要求对 PL/Python 中的复合类型数组的处理进行向后不兼容的更改。以前,您可以通过编写例如[[col1, col2], [col1, col2]]返回组合值数组。但现在将其解释为二维数组。现在必须将数组中的复合类型编写为 PythonTuples,而不是列表,以解决歧义。也就是说,Rewrite[(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)

这将删除配置的--disable-integer-datetimes选项。自 PostgreSQL 8.3 以来,浮点时间戳几乎没有优势,并且不是默认值。

  • 删除对 Client 端/服务器协议版本 1.0(Tom Lane)的服务器支持

自 PostgreSQL 6.3 起,该协议就没有 Client 端支持。

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

该模块与 8.3 之前的 PostgreSQL 版本中提供的全文搜索版本兼容。

  • 删除 createlang 和 droplang 命令行应用程序(Peter Eisentraut)

自 PostgreSQL 9.1 起不推荐使用这些功能。而是直接使用CREATE EXTENSIONDROP EXTENSION

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

提供 C 编码功能的扩展现在必须符合版本 1 的调用约定。自 2001 年以来,不推荐使用版本 0.

E.14.3. Changes

在下面,您将详细了解 PostgreSQL 10 和以前的主要发行版之间的更改。

E.14.3.1. Server

E.14.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,以保留工作进程以用于并行查询以外的目的。

E.14.3.1.2. Indexes
  • 将预写日志记录支持添加到哈希索引(Amit Kapila)

这使哈希索引具有崩溃安全性和可复制性。先前有关其使用的警告消息已删除。

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

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

  • 添加选项以允许 BRIN 索引汇总更积极地进行(ÁlvaroHerrera)

新的CREATE INDEX选项可在创建新页面范围时自动汇总以前的 BRIN 页面范围。

  • 添加函数以删除并重新添加 BRIN 索引范围的 BRIN 摘要(ÁlvaroHerrera)

新的 SQL 函数brin_summarize_range()更新指定范围的 BRIN 索引汇总,而brin_desummarize_range()删除它。这有助于更新由于UPDATEDELETE导致的较小范围的汇总。

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

  • 通过更有效地重用索引空间来允许更快的 GiST 插入和更新(Andrey Borodin)

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

E.14.3.1.3. Locking
  • 减少更改表参数所需的锁定(Simon Riggs,Fabrikozio Mello)

例如,现在可以使用更轻巧的锁来更改表的effective_io_concurrency设置。

  • 允许调整谓词锁提升阈值(Dagfinn IlmariMannsåker)

现在可以通过两个新的服务器参数max_pred_locks_per_relationmax_pred_locks_per_page控制锁升级。

E.14.3.1.4. Optimizer
  • 添加多列优化器统计信息以计算相关比率和不同值的数量(Tomas Vondra,David Rowley,ÁlvaroHerrera)

新命令是CREATE STATISTICSALTER STATISTICSDROP STATISTICS。此功能在估计查询内存使用情况以及合并各个列的统计信息时非常有用。

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

现在,优化器对可以在哪里放置 RLS 过滤条件有了更多的了解,可以生成更好的计划,同时仍然可以安全地强制执行 RLS 条件。

E.14.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.14.3.1.6. Monitoring
  • 允许显式控制EXPLAIN的计划和执行时间显示(Ashutosh Bapat)

默认情况下,计划和执行时间以EXPLAIN ANALYZE显示,在其他情况下则不显示。新的EXPLAIN选项SUMMARY允许对此进行显式控制。

  • 添加默认监视角色(Dave 页面)

新角色pg_monitorpg_read_all_settingspg_read_all_statspg_stat_scan_tables允许简化权限配置。

E.14.3.1.6.1. Logging
  • 更改默认值log_line_prefix以在邮局主管日志输出的每一行中包含当前时间戳(以毫秒为单位)和进程 ID(Christoph Berg)

先前的默认值为空前缀。

  • 添加函数以返回日志和 WAL 目录内容(Dave 页面)

新功能是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.14.3.1.6.2. pg_stat_activity
  • 添加pg_stat_activity报告低级别的 await 状态(Michael Paquier,Robert Haas,Rushabh Lathia)

通过此更改,可以报告许多低级 await 条件,包括闩锁 await,文件读/写/ fsync,Client 端读/写和同步复制。

  • pg_stat_activity(Kuntal Ghosh,Michael Paquier)中显示辅助流程,后台工作人员和 walsender 流程

这简化了监视。新列backend_type标识进程类型。

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

  • 重命名pg_stat_activitywait_event_typeLWLockTrancheLWLockNamedLWLock(Robert Haas)

这使输出更加一致。

E.14.3.1.7. Authentication
  • 添加SCRAM-SHA-256支持密码协商和存储(Michael Paquier,Heikki Linnakangas)

与现有的md5协商和存储方法相比,这提供了更好的安全性。

这是支持其他密码哈希选项的必要条件。

这显示文件内容,而不是当前活动的设置。

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

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

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

这允许通过使用pg_ctl reloadSELECT pg_reload_conf()或发送SIGHUPsignal 来重新配置 SSL,而无需重新启动服务器。但是,如果服务器的 SSL 密钥需要密码,则重新加载 SSL 配置不起作用,因为无法重新提示密码。在这种情况下,原始配置将适用于邮政局长的生活。

E.14.3.1.9. Reliability
  • 创建或取消链接文件后,在其父目录上执行 fsync(Michael Paquier)

这样可以减少断电后数据丢失的风险。

E.14.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 文件进行 Management。

E.14.3.2. 复制和恢复

逻辑复制比物理复制提供更大的灵 Active,包括在不同主要版本的 PostgreSQL 之间进行复制以及选择性复制。

  • 不管备用服务器在synchronous_standby_names中出现的 Sequences 如何,都可以 await 备用服务器的提交确认(泽田正彦)

以前,服务器始终 await 在synchronous_standby_names中首先出现的活动备用数据库。新的synchronous_standby_names关键字ANY允许 await 任意数量的备用数据库,而不管其 Sequences 如何。这称为仲裁提交。

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

具体来说,默认值已更改为wal_levelmax_wal_sendersmax_replication_slotshot_standby,以使其适合于现成的这些用法。

  • 默认情况下,在pg_hba.conf中启用从 localhost 连接进行复制(Michael Paquier)

以前,默认情况下已 Comments 掉pg_hba.conf的复制连接行。这对于pg_basebackup尤其有用。

新列是write_lagflush_lagreplay_lag

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

以前只能通过时间戳或 XID 选择停止点。

  • 允许用户禁用pg_stop_backup()的 await 所有 WAL 的存档(David Steele)

pg_stop_backup()的第二个可选参数控制该行为。

会话退出或发生错误时,会自动删除临时插槽。

  • 通过更好地跟踪 Access Exclusive 锁(Simon Riggs,David Rowley)来提高热备用重放的性能

  • 加快两阶段落实恢复性能(Stas Kelvich,Nikhil Sontakke,Michael Paquier)

E.14.3.3. Queries

  • 添加XMLTABLE函数,该函数将XML格式的数据转换为行集(Pavel Stehule,ÁlvaroHerrera)

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

以前,此类字符从未被视为属于与语言环境相关的字符类,例如[[:alpha:]]

E.14.3.4. Util 命令

  • 添加表partitioning syntax,该表自动创建分区约束并处理 Tuples 插入和更新的路由(Amit Langote)

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

  • 添加AFTER trigger过渡表以记录已更改的行(Kevin Grittner,Thomas Munro)

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

以前,所有安全策略都是允许的,这意味着任何匹配的策略都允许访问。限制性策略必须匹配才能授予访问权限。这些策略类型可以组合。

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

以前,还需要对引用表具有REFERENCES权限。这似乎是由于对 SQL 标准的误读造成的。由于创建外键(或任何其他类型的)约束需要对约束表具有所有权特权,因此另外需要REFERENCES权限似乎毫无意义。

这是使用ALTER DEFAULT PRIVILEGES命令完成的。

  • 添加创建序列为命令以创建与整数数据类型匹配的序列(Peter Eisentraut)

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

  • 允许带有INSTEAD INSERT个触发器的视图上COPY view FROM source个(Haribabu Kommi)

触发器被提供给COPY读取的数据行。

  • 允许在 DDL 命令中指定不带参数的函数名(如果它是唯一的)(Peter Eisentraut)

例如,如果只有一个具有该名称的函数,则在不带参数的函数名称上允许DROP FUNCTION。 SQL 标准要求此行为。

  • 允许使用单个DROP命令删除多个函数,运算符和聚合(Peter Eisentraut)

  • CREATE SERVER创建用户 MapCREATE COLLATION中支持IF NOT EXISTS(Anastasia Lubennikova,Peter Eisentraut)

  • VACUUM VERBOSE报告跳过的冻结页面数和最旧的 xmin(泽田正彦,西蒙·里格斯)

此信息也包含在log_autovacuum_min_duration输出中。

  • 提高VACUUM删除尾随空堆页面的速度(Claudio Freire,ÁlvaroHerrera)

E.14.3.5. 资料类型

  • 添加对JSONJSONB的全文搜索支持(Dmitry Dolgov)

现在,可以在这些数据类型上使用函数ts_headline()to_tsvector()

  • 添加对 EUI-64 MAC 地址的支持,作为新的数据类型macaddr8(Haribabu Kommi)

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

这些类似于SERIAL列,但符合 SQL 标准。

  • 允许重命名ENUM个值(Dagfinn IlmariMannsåker)

这使用语法更改类型...重命名值

  • 适当地将数组伪类型(anyarray)视为to_json()to_jsonb()中的数组(Andrew Dunstan)

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

  • 添加用于将money值与int8值相乘和除的运算符(Peter Eisentraut)

以前,这种情况会导致将int8值转换为float8,然后使用money和-4 运算符。新的行为避免了可能的精度损失。但是请注意,像其他整数除法情况一样,现在将money除以int8会截断商,而先前的行为会四舍五入。

  • 检查money类型的 Importing 功能(Peter Eisentraut)中是否溢出

E.14.3.6. Functions

这类似于regexp_matches(),但是它只返回第一个匹配项的结果,因此不需要返回集合,这使得在简单情况下更易于使用。

通过此更改,可以从 JSON 数组正确转换目标 SQL 类型中的数组类型字段,并从 JSON 对象正确转换复合类型字段。以前,这种情况将失败,因为 JSON 值的文本表示将被馈送到array_in()record_in(),并且其语法将与那些 Importing 函数期望的语法不匹配。

  • 添加函数txid_current_if_assigned()以返回当前 TransactionID;如果没有分配 TransactionID,则添加NULL(Craig Ringer)

这不同于txid_current(),后者总是返回 TransactionID,并在必要时分配一个 TransactionID。与该功能不同,该功能可以在备用服务器上运行。

  • 添加功能txid_status()来检查事务是否已提交(Craig Ringer)

这对于在突然断开连接后检查先前的事务是否已提交以及您是否刚刚没有收到确认非常有用。

  • 允许make_date()将负数年份解释为 BC 年(ÁlvaroHerrera)

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

例如,先前的to_date('2009-06-40','YYYY-MM-DD')被接受并返回2009-07-10。现在它将产生一个错误。

E.14.3.7. 服务器端语言

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

这允许一种更加面向对象的编程风格。

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

以前,语法限制阻止目标变量成为数组元素。

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

  • 向 PL/Tcl 添加子事务命令(Victor Wagner)

这允许 PL/Tcl 查询失败而不会中止整个功能。

E.14.3.8. Client 端接口

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

  • 允许 libpq 连接字符串和 URI 请求read/write host,即主服务器而不是备用服务器(Victor Wagner,Mithun Cy)

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

以前只能通过环境变量来指定。

  • 添加功能PQencryptPasswordConn()以允许在 Client 端创建更多类型的加密密码(Michael Paquier,Heikki Linnakangas)

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

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

此后,ecpg 版本将与 PostgreSQL 发行版本号匹配。

E.14.3.9. Client 应用

E.14.3.9.1. psql
  • 向 psql 添加条件分支支持(Corey Huinker)

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

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

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

这在新的 psql 条件分支命令中特别有用。

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

以前,将 psql 的特殊变量之一设置为无效值会导致默认行为。如果建议的新值无效,则对特殊变量的\set现在会失败。作为特殊的 exception,在布尔值特殊变量上具有空值或省略新值的\set仍具有将变量设置为on的效果;但是现在它实际上获取了该值,而不是一个空字符串。现在,将特殊变量上的\unset显式设置为默认值,该默认值也是其在启动时获取的值。总之,控制变量现在始终具有可显示的值,该值反映了 psql 实际在做什么。

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

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

以前,它们显示在单个“修饰符”列中。

  • 使各种\d命令更一致地处理不匹配对象的情况(Daniel Gustafsson)

现在,他们都将有关该消息的消息打印到 stderr,而不是 stdout,并且消息的措辞更加一致。

  • 改善 psql 的制表符完成度(Jeff Janes,Ian Barwick,Andreas Karlsson,Sehrope Sarkuni,Thomas Munro,Kevin Grittner,Dagfinn IlmariMannsåker)
E.14.3.9.2. pgbench
  • 添加 pgbench 选项--log-prefix以控制日志文件前缀(泽田雅彦)

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

现在,可以通过写反斜杠-返回将元命令 continue 到下一行。

  • 取消相对于其他命令行选项(Tom Lane)对-M选项的放置的限制

E.14.3.10. 服务器应用

  • 添加pg_receivewal选项-Z/--compress以指定压缩率(Michael Paquier)

  • 添加pg_recvlogical选项--endpos以指定结束位置(克雷格·林格)

这是对现有--startpos选项的补充。

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

仍然支持旧的拼写。

E.14.3.10.1. pg_dump,pg_dumpall,pg_restore
  • 允许 pg_restore 排除架构(Michael Banck)

这会添加一个新的-N/--exclude-schema选项。

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

这抑制了大物体的倾倒。

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

这允许非超级用户使用 pg_dumpall。如果没有此选项,则由于无法读取密码而失败。

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

  • 关于 pg_dump 和 pg_dumpall 生成的输出文件的问题fsync()(Michael Paquier)

这样可以提供更高的安全性,确保在程序退出之前将输出安全地存储在磁盘上。可以使用新的--no-sync选项禁用此功能。

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

WAL 将与基本备份存储在单独的 tar 文件中。

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

当 pg_basebackup 使用带有默认选项的 WAL 流时,默认情况下将使用临时复制插槽。

  • 在 pg_basebackup 和 pg_receivewal(Michael Paquier)中所有必需的地方进行 fsync 时要格外小心

  • 添加 pg_basebackup 选项--no-sync以禁用 fsync(Michael Paquier)

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

E.14.3.10.3. pg_ctl
  • pg_ctl的升级操作添加 await 选项(Peter Eisentraut)

  • 为 pg_ctlawait(--wait)和无 await(--no-wait)添加长选项(Vik Fearing)

  • 为 pg_ctl 服务器选项(--options)添加长选项(Peter Eisentraut)

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

邮政 Management 员已更改为在postmaster.pid中报告其准备连接的状态,并且 pg_ctl 现在检查该文件以检测启动是否完成。这比旧方法更有效,更可靠,并且消除了启动期间有关拒绝连接尝试的邮局主管日志条目。

  • 减少 awaitpostmaster 启动/停止时(Tom Lane)的 pg_ctl 的反应时间

现在,pg_ctl 在 awaitpostmaster 状态更改时每秒探测十次,而不是每秒探测一次。

  • 如果 await 的操作未在超时时间内完成,请确保 pg_ctl 以非零状态退出(Peter Eisentraut)

在这种情况下,startpromote操作现在返回退出状态 1,而不是 0. stop操作始终可以做到这一点。

E.14.3.11. 源代码

  • 更改为两部分发行版本编号(Peter Eisentraut,Tom Lane)

发布编号现在将分为两部分(例如10.1),而不是三部分(例如9.6.3)。现在,主要版本将仅增加第一个数字,次要版本将仅增加第二个数字。发行分支将由单个数字(例如10而不是9.6)引用。此项更改旨在减少用户对 PostgreSQL 的主要或次要版本感到困惑。

  • 改善原始人的行为(Piotr Stefaniak,汤姆·莱恩)

基于 FreeBSD 项目的最新改进,我们已切换到 pg_bsd_indent 的新版本。这修复了许多小错误,这些小错误导致了奇怪的 C 代码格式化决策。最值得注意的是,括号中的行(例如在多行函数调用中)现在会统一缩进以匹配开头括号,即使这会导致代码超出右边距。

  • 允许ICU库有选择地用于排序规则支持(Peter Eisentraut)

ICU 库具有版本控制功能,可以检测版本之间的排序规则更改。通过配置选项--with-icu启用它。默认值仍使用 os 的本机归类库。

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

  • 删除不必要的 SPI 函数SPI_push()SPI_pop()SPI_push_conditional()SPI_pop_conditional()SPI_restore_connection()(Tom Lane)

现在,它们的功能会自动发生。这些名称现在有 no-op 宏,因此不需要立即更新外部模块,但最终应删除此类调用。

此更改的副作用是SPI_palloc()和相关功能现在需要有效的 SPI 连接。如果没有,它们不会退化为简单的palloc()。先前的行为不是很有用,并带来了意外内存泄漏的风险。

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

  • 添加类似于平板的内存分配器以进行有效的固定大小分配(Tomas Vondra)

  • 在 Linux 和 FreeBSD(Tom Lane)上使用 POSIXsignal 量而不是 SysVsignal 量

这样可以避免特定于平台的 SysVsignal 量使用限制。

  • 改善对 64 位原子的支持(Andres Freund)

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

  • 切换为使用clock_gettime()(如果可用)进行持续时间测量(Tom Lane)

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

  • 添加更多健壮的随机数生成器以用于加密安全用途(Magnus Hagander,Michael Paquier,Heikki Linnakangas)

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

  • 允许WaitLatchOrSocket()awaitWindows 上的套接字连接(Andres Freund)

  • tupconvert.c函数不再将 Tuples 转换为仅在其中嵌入其他复合类型的 OID(Ashutosh Bapat,Tom Lane)

大多数呼叫者并不在乎复合类型的 OID;但是如果将结果 Tuples 用作复合基准,则应采取步骤以确保将正确的 OID 插入其中。

  • 删除 SCO 和 Unixware 端口(Tom Lane)

  • 大修文档build process(Alexander Lakhin)

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

以前使用 Jade,DSSSL 和 JadeTex。

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

E.14.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列(藤田悦郎)

以前OID列始终返回零。

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

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

  • 添加amcheck可以检查 B 树索引的有效性(Peter Geoghegan)

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

  • 改进cube对零维多维数据集的处理(Tom Lane)

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

这使得它在生产系统上运行时的破坏性较小。

  • 添加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.14.4. Acknowledgments

以下个人(按字母 Sequences)以补丁作者,提交者,审阅者,测试者或问题的报告者的身份对该发行版做出了贡献。

Adam Brightwell
Adam Brusselback
Adam Gomaa
Adam Sah
Adrian Klaver
艾丹·范戴克
Aleksander Alekseev
Alexander Korotkov
Alexander Lakhin
Alexander Sosna
Alexey Bashtanov
Alexey Grishchenko
Alexey Isayko
阿尔瓦罗·埃尔南德斯·托尔托萨
Álvaro Herrera
Amit Kapila
Amit Khandekar
Amit Langote
Amul Sul
Anastasia Lubennikova
安德里亚斯·约瑟夫·克罗格
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
本德格拉夫
Benedikt Grundmann
Bernd Helmle
Brad DeJong
Brandur Leach
Breen Hagan
Bruce Momjian
布鲁诺·沃尔夫三世
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
达格芬·伊尔马里·曼斯柯
Daisuke Higuchi
Damian Quiroga
Dan Wood
邓敏香
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
法布里齐奥·德·罗耶斯·梅洛
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
耶罗恩·范德汉姆
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
卡尔·O·平克
Keith Fiske
Kevin Grittner
金·罗斯·卡尔森
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
拉法德拉托雷
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
斯文·R·昆兹
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
汤姆·范·蒂尔堡
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
黄奕文
Yugo Nagata
杨振明
Zhou Digoal