E.2. 版本 10

E.2.1. 概述
E.2.2. 迁移到版本 10
E.2.3. 修改列表
E.2.4. 致谢

发布日期: 2017-10-05

E.2.1. 概述

PostgreSQL 10 中的主要增强包括:

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

  • 声明表分区

  • 提高查询的并行性

  • 重要的一般性能改进

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

  • 改善的监测和控制

以上各项在下面的部分有更详细的解释。

E.2.2. 迁移到版本 10

想要从之前的任意版本中迁移数据的用户,需要使用pg_dumpall 转储/恢复,或者使用pg_upgrade

版本10包含一些修改,可能会影响到与之前版本的兼容性。注意以下不兼容性:

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

    主要的哈希索引改进需要这个要求。pg_upgrade 将创建一个脚本来协助它。

  • 重命名预写式日志目录pg_xlogpg_wal,并重命名事务状态目录 pg_clogpg_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 结构中现在不允许设置返回函数。有关更多信息,请查看 第 37.4.8 节

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

    现在可以用关键字ROW开始row_constructor; 以前不得不省略。如果只有一个列名出现在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 也可以用于此目的;它提供了与现有代码更兼容的列名称。

    还重新设计了序列的psql\d 命令的输出。

  • 默认情况下,恢复备份所需的WAL需要使用 pg_basebackup流式传输 (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运行时环境版本6的某些修订, 将不会接受超过1024位的DH参数,因此将无法通过SSL进行连接。 如果需要支持这样的旧客户端,则可以使用自定义的1024位DH参数, 而不是内编译的默认值。请参阅ssl_dh_params_file

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

    password_encryption服务器参数不再支持 offplainCREATE/ALTER USER ... PASSWORD中不再支持 UNENCRYPTED选项。类似的, --unencrypted选项已经从createuser 中删除。从旧版本迁移的未加密密码将在本版本中进行加密存储。 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的module自动加载工具 (Tom Lane)

    这个功能已经被新的服务器参数pltcl.start_procpltclu.start_proc所替代,这些参数比较容易使用, 而且更加类似于在其他PL中可用的功能。

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

    需要从8.0之前的服务器中转储的用户将需要使用 PostgreSQL 9.6或更早版本的转储程序。 结果输出仍然应该成功加载到较新的服务器。

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

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

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

    该协议自PostgreSQL 6.3以来没有客户端支持。

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

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

  • 删除createlangdroplang 命令行应用 (Peter Eisentraut)

    这从PostgreSQL 9.1开始就废弃了。 取而代之的,直接使用CREATE EXTENSIONDROP EXTENSION

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

    提供C编码功能的扩展现在必须符合版本1的调用约定。 版本0自2001年以来已经弃用。

E.2.3. 修改列表

下面你会找到PostgreSQL 10 和前一个主要版本之间变化的详细说明。

E.2.3.1. 服务器

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

    该修改允许B-tree索引页被单独的并行工作者搜索。

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

    这允许单个索引扫描分派并行工作人员来处理堆的不同区域。

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

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

  • 提高并行工作人员返回预先排序的数据的能力 (Rushabh Lathia)

  • 增加过程语言函数中的并行查询使用 (Robert Haas, Rafia Sabih)

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

    此参数可以设置为低于max_worker_processes, 以保留工作进程以用于并行查询以外的目的。

E.2.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.2.3.1.3. 锁定
E.2.3.1.4. 优化器
  • 添加多列优化程序统计信息以计算相关比率和不同值的数量 (Tomas Vondra, David Rowley, Álvaro Herrera)

    新增命令是CREATE STATISTICSALTER STATISTICSDROP STATISTICS。 此功能有助于估算查询内存使用情况,以及组合各个列的统计信息。

  • 改善被行级安全限制影响的查询性能 (Tom Lane)

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

E.2.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.2.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.2.3.1.6.1. 日志
  • 更改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.2.3.1.6.2. pg_stat_activity
  • 添加低级别等待状态的pg_stat_activity报告 (Michael Paquier, Robert Haas, Rushabh Lathia)

    此更改可以报告许多低级别的等待条件,包括锁定等待,文件读取/写入/fsyncs, 客户端读取/写入以及同步复制。

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

    这简化了监控。一个新的backend_type字段标识进程类型。

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

  • 重命名 pg_stat_activity.wait_event_type 的值LWLockTrancheLWLockNamedLWLock (Robert Haas)

    这使得输出更加一致。

E.2.3.1.7. 认证
  • 添加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.2.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.2.3.1.9. 可靠性
  • 创建或取消链接文件后,在其父目录上执行fsync (Michael Paquier)

    这减少了电源故障后数据丢失的风险。

E.2.3.1.9.1. 预写式日志 (WAL)
  • 防止在其他空闲系统上进行不必要的检查点和WAL归档 (Michael Paquier)

  • 添加wal_consistency_checking服务器参数, 将详细信息添加到WAL, 可以在备用服务器上进行健全性检查 (Kuntal Ghosh, Robert Haas)

    任何健全性检查失败都会在备机中产生致命错误。

  • 将最大可配置的WAL段大小增加到1千兆字节 (Beena Emerson)

    一个更大的WAL段大小可以减少 archive_command调用和要管理的 WAL文件。

E.2.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 中默认启用本地连接的复制功能 (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)

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

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

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

E.2.3.3. 查询

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

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

    以前,这些字符永远不会被识别为属于依赖于语言环境的字符类, 如[[:alpha:]]

E.2.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)

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

  • 允许在视图上COPY view FROM source带有INSTEAD INSERT触发器 (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.2.3.5. 数据类型

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

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

  • 添加对EUI-64 MAC地址的支持, 作为新的数据类型macaddr8 (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字符串而不是数组。

  • int8值为 money 值添加乘法和除法运算 (Peter Eisentraut)

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

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

E.2.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,如果需要的话分配一个事务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.2.3.7. 服务器端语言

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

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

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

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

E.2.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.2.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)

    以前只有MD5加密的口令可以使用PQencryptPassword() 创建。这个新的函数也可以创建SCRAM-SHA-256加密的口令。

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

    因此,ecpg版本将匹配 PostgreSQL发布版本号。

E.2.3.9. 客户端应用

E.2.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.2.3.9.2. pgbench
  • 添加pgbench选项--log-prefix 控制日志文件前缀 (Masahiko Sawada)

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

    一个元命令现在可以通过写回反斜杠继续到下一行。

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

E.2.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)

    仍然支持旧的拼写方式。

  • 允许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_dumppg_dumpall 生成的输出文件发出fsync() (Michael Paquier)

    这提供了更高的安全性,以便在程序退出之前将输出安全地存储在磁盘上。 这可以通过新的--no-sync选项禁用。

E.2.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.2.3.10.3. pg_ctl
  • pg_ctl 的提升操作添加等待选项 (Peter Eisentraut)

  • pg_ctl wait (--wait) 和 no-wait 添加长选项 (--no-wait) (Vik Fearing)

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

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

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

  • 在等待postmaster启动/停止时减少pg_ctl的响应时间 (Tom Lane)

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

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

    在这种情况下,startpromote 操作现在返回退出状态1,不是0。stop操作一直这样做。

E.2.3.11. 源代码

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

    版本号现在有两个部分(例如,10.1),而不是三个 (例如,9.6.3)。主要版本现在只会增加第一个数字, 次要版本只会增加第二个数字。发布分支将被单个数字引用(例如, 10,而不是9.6)。 此更改旨在减少用户对PostgreSQL 的主要或次要版本的混淆。

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

    根据FreeBSD项目最近的改进,我们已经转向了新版本的 pg_bsd_indent。 这修复了许多导致奇怪的C代码格式化决定的小错误。最值得注意的是, 括号内的行(如多行函数调用中)现在可以统一缩进以匹配开始参数, 即使这会导致代码延伸超出右边距。

  • 允许ICU 库可选地用于整理支持 (Peter Eisentraut)

    ICU库具有版本控制功能,可以检测版本之间的归类更改。 它通过配置选项--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-like内存分配器以获得有效的固定大小分配 (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)

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

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

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

    大多数调用者不关心复合型OID;但是如果结果元组要用作复合数据, 则应采取措施确保在其中插入正确的OID。

  • 删除SCOUnixware端口 (Tom Lane)

  • 大修文档构建过程 (Alexander Lakhin)

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

    以前使用JadeDSSSLJadeTex

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

E.2.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)

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

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

  • 添加amcheck, 它可以检查B-tree索引的有效性 (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.2.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
Fakhroutdinov Evgenievich
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
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