E.14.版本 10
发布日期: 2017-10-05
E.14.1. Overview
PostgreSQL 10 的主要增强功能包括:
-
使用发布/订阅进行逻辑复制
-
声明式表分区
-
改进的查询并行性
-
总体性能显着改善
-
基于 SCRAM-SHA-256 的更强密码验证
-
改善监控
在以下各节中将更详细地说明上述各项。
E.14.2. 迁移到版本 10
那些希望从任何先前版本迁移数据的用户都需要使用pg_dumpall或pg_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
子句中一样。对于存在多个集合返回函数的情况,这可以使语义更清晰。如果它们返回不同的行数,则通过添加空值来扩展较短的结果以匹配最长的结果。以前,结果一直循环执行,直到它们都同时终止,从而产生的行数等于函数周期的最小公倍数。另外,现在在CASE
和COALESCE
构造中不允许返回集合的函数。有关更多信息,请参见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 STATEMENT
或AFTER STATEMENT
触发器多次。另外,如果在表上存在受外键强制操作(例如ON DELETE CASCADE
)影响的语句级触发器,则每个外部 SQL 语句可能会触发多次。这与 SQL 标准相反,因此请对其进行更改。
- 将序列的元数据字段移到新的pg_sequence系统目录中(Peter Eisentraut)
现在,序列关系仅存储可由nextval()
修改的字段,即last_value
,log_cnt
和is_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服务器参数不再支持off
或plain
。 CREATE/ALTER USER ... PASSWORD
不再支持UNENCRYPTED
选项。同样,--unencrypted
选项已从 createuser 中删除。从较早版本迁移的未加密密码将在此版本中以加密方式存储。 password_encryption
的默认设置仍然是md5
。
- 添加min_parallel_table_scan_size和min_parallel_index_scan_size服务器参数以控制并行查询(Amit Kapila,Robert Haas)
它们替换了min_parallel_relation_size
,后者被认为太通用了。
- 请勿在shared_preload_libraries和相关的服务器参数中对不带引号的文本进行小写(QL 卓)
这些设置实际上是文件名列表,但是以前被视为具有不同解析规则的 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_proc和pltclu.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 EXTENSION
和DROP 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,以保留工作进程以用于并行查询以外的目的。
- 通过将默认设置max_parallel_workers_per_gather更改为
2
来默认启用并行性。
E.14.3.1.2. Indexes
- 将预写日志记录支持添加到哈希索引(Amit Kapila)
这使哈希索引具有崩溃安全性和可复制性。先前有关其使用的警告消息已删除。
-
提高哈希索引性能(Amit Kapila,Mithun Cy,Ashutosh Sharma)
-
添加对
INET
和CIDR
数据类型的 SP-GiST 索引支持(Emre Hasegeli) -
添加选项以允许 BRIN 索引汇总更积极地进行(ÁlvaroHerrera)
新的CREATE INDEX选项可在创建新页面范围时自动汇总以前的 BRIN 页面范围。
- 添加函数以删除并重新添加 BRIN 索引范围的 BRIN 摘要(ÁlvaroHerrera)
新的 SQL 函数brin_summarize_range()更新指定范围的 BRIN 索引汇总,而brin_desummarize_range()
删除它。这有助于更新由于UPDATE
和DELETE
导致的较小范围的汇总。
-
提高确定 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_relation和max_pred_locks_per_page控制锁升级。
E.14.3.1.4. Optimizer
- 添加多列优化器统计信息以计算相关比率和不同值的数量(Tomas Vondra,David Rowley,ÁlvaroHerrera)
新命令是CREATE STATISTICS,ALTER STATISTICS和DROP 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_monitor
,pg_read_all_settings
,pg_read_all_stats
和pg_stat_scan_tables
允许简化权限配置。
- 在刷新材料视图期间正确更新统计信息收集器(Jim Mlodgenski)
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_activity
。wait_event_type
值LWLockTranche
和LWLockNamed
至LWLock
(Robert Haas)
这使输出更加一致。
E.14.3.1.7. Authentication
- 添加SCRAM-SHA-256支持密码协商和存储(Michael Paquier,Heikki Linnakangas)
与现有的md5
协商和存储方法相比,这提供了更好的安全性。
- 将password_encryption服务器参数从
boolean
更改为enum
(Michael Paquier)
这是支持其他密码哈希选项的必要条件。
- 添加视图pg_hba_file_rules以显示
pg_hba.conf
的内容(Haribabu Kommi)
这显示文件内容,而不是当前活动的设置。
- 支持多个 RADIUS 服务器(Magnus Hagander)
现在,所有与 RADIUS 相关的参数都是复数,并且支持以逗号分隔的服务器列表。
E.14.3.1.8. 服务器配置
- 允许在重新加载配置期间更新 SSL 配置(Andreas Karlsson,Tom Lane)
这允许通过使用pg_ctl reload
,SELECT pg_reload_conf()
或发送SIGHUP
signal 来重新配置 SSL,而无需重新启动服务器。但是,如果服务器的 SSL 密钥需要密码,则重新加载 SSL 配置不起作用,因为无法重新提示密码。在这种情况下,原始配置将适用于邮政局长的生活。
- 有效限制bgwriter_lru_maxpages的最大值(Jim Nasby)
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. 复制和恢复
- 将logically replicate表的功能添加到备用服务器(Petr Jelinek)
逻辑复制比物理复制提供更大的灵 Active,包括在不同主要版本的 PostgreSQL 之间进行复制以及选择性复制。
- 不管备用服务器在synchronous_standby_names中出现的 Sequences 如何,都可以 await 备用服务器的提交确认(泽田正彦)
以前,服务器始终 await 在synchronous_standby_names
中首先出现的活动备用数据库。新的synchronous_standby_names
关键字ANY
允许 await 任意数量的备用数据库,而不管其 Sequences 如何。这称为仲裁提交。
- 减少执行流备份和复制所需的配置更改(Magnus Hagander,Dang Minh Huong)
具体来说,默认值已更改为wal_level,max_wal_senders,max_replication_slots和hot_standby,以使其适合于现成的这些用法。
- 默认情况下,在pg_hba.conf中启用从 localhost 连接进行复制(Michael Paquier)
以前,默认情况下已 Comments 掉pg_hba.conf
的复制连接行。这对于pg_basebackup尤其有用。
- 在pg_stat_replication中添加列以报告复制延迟时间(Thomas Munro)
新列是write_lag
,flush_lag
和replay_lag
。
- 允许通过recovery.conf中的日志序列号(LSN)指定恢复停止点(Michael Paquier)
以前只能通过时间戳或 XID 选择停止点。
- 允许用户禁用pg_stop_backup()的 await 所有 WAL 的存档(David Steele)
pg_stop_backup()
的第二个可选参数控制该行为。
- 允许创建临时复制插槽(Petr Jelinek)
会话退出或发生错误时,会自动删除临时插槽。
-
通过更好地跟踪 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
权限似乎毫无意义。
- 在模式上允许default permissions(Matheus Oliveira)
这是使用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,创建用户 Map和CREATE COLLATION中支持
IF NOT EXISTS
(Anastasia Lubennikova,Peter Eisentraut) -
让VACUUM VERBOSE报告跳过的冻结页面数和最旧的 xmin(泽田正彦,西蒙·里格斯)
此信息也包含在log_autovacuum_min_duration输出中。
- 提高
VACUUM
删除尾随空堆页面的速度(Claudio Freire,ÁlvaroHerrera)
E.14.3.5. 资料类型
- 添加对
JSON
和JSONB
的全文搜索支持(Dmitry Dolgov)
现在,可以在这些数据类型上使用函数ts_headline()
和to_tsvector()
。
- 添加对 EUI-64 MAC 地址的支持,作为新的数据类型macaddr8(Haribabu Kommi)
这是对 EUI-48 MAC 地址(类型macaddr
)的现有支持的补充。
- 添加identity columns,用于为插入的列分配数值(Peter Eisentraut)
这些类似于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_match()函数(Emre Hasegeli)
这类似于regexp_matches()
,但是它只返回第一个匹配项的结果,因此不需要返回集合,这使得在简单情况下更易于使用。
-
添加需要删除一系列键的
jsonb
的delete operator版本(Magnus Hagander) -
使json_populate_record()及相关函数递归处理 JSON 数组和对象(Nikita Glukhov)
通过此更改,可以从 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 查询失败而不会中止整个功能。
- 添加服务器参数pltcl.start_proc和pltclu.start_proc,以允许在 PL/Tcl 启动时调用初始化函数(Tom Lane)
E.14.3.8. Client 端接口
- 允许在 libpq 连接字符串和 URI 中指定多个主机名或地址(Robert Haas,Heikki Linnakangas)
libpq 将连接到列表中的第一个响应服务器。
- 允许 libpq 连接字符串和 URI 请求read/write host,即主服务器而不是备用服务器(Victor Wagner,Mithun Cy)
当指定多个主机名时,这很有用。它由 libpq 连接参数target_session_attrs
控制。
- 允许将密码文件名指定为 libpq 连接参数(Julian Markwort)
以前只能通过环境变量来指定。
- 添加功能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)
在这种情况下,start
和promote
操作现在返回退出状态 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 的本机归类库。
- 在 Windows 上自动将所有PG_FUNCTION_INFO_V1函数标记为
DLLEXPORT
-ed(Laurenz Albe)
如果第三方代码使用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和btree_gin索引枚举类型(Andrew Dunstan)
这允许枚举在排除约束中使用。
-
向 btree_gist 添加
UUID
数据类型的索引支持(Paul Jungwirth) -
添加amcheck可以检查 B 树索引的有效性(Peter Geoghegan)
-
在pg_stat_statements中将忽略的常量显示为
$N
而不是?
(Lukas Fittl) -
改进cube对零维多维数据集的处理(Tom Lane)
这也改善了对infinite
和NaN
值的处理。
- 允许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.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 |