发布说明

PostgreSQL 15.0

E.18. 发布版本 15 #

发布日期:. 2022-10-13

E.18.1. 概述 #

PostgreSQL 15 包含许多新特性和增强功能,包括:

  • 支持 SQL MERGE 命令。

  • 逻辑复制发布中,通过指定列列表和行过滤条件有选择地发布表的内容。

  • 更多的压缩选项,包括支持 Zstandard(zstd)压缩。这也包括在 pg_basebackup 期间由服务器端执行压缩。

  • 支持使用 JSON 格式进行结构化服务器日志输出

  • 性能改进,特别是在内存排序和磁盘排序方面。

上述条目以及 PostgreSQL 15 的其他新特性将在下面的章节中作更详细的说明。

E.18.2. 迁移到版本 15 #

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

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

  • 移除 public 模式PUBLIC 的创建权限(Noah Misch) §

    这一默认设置是 Section 5.10.6 自 CVE-2018-1058 安全发布以来推荐的安全模式使用模式之一。此变更适用于新的数据库集簇和现有集簇中新创建的数据库。升级集簇或恢复数据库导出将保留 public 的现有权限。

    对于现有数据库,尤其是多用户数据库,请考虑撤销 public 模式上的 CREATE 权限,以采用这一新的默认设置。对于无需防御内部威胁的新数据库,授予 CREATE 权限即可恢复先前版本的行为。

  • public 模式的所有者更改为新的 pg_database_owner 角色(Noah Misch) §

    这使每个数据库的所有者都能对其数据库中的 public 模式行使所有者权限。此前,该模式由引导超级用户拥有,因此非超级用户的数据库所有者无法对其执行任何操作。

    此变更适用于新的数据库集簇和现有集簇中新创建的数据库。升级集簇或恢复数据库导出将保留 public 的现有所有权设置。

  • 移除长期弃用的独占备份模式(David Steele,Nathan Bossart) §

    如果数据库服务器在此模式下突然停止,服务器可能无法启动。非独占备份模式在各方面都被认为更优。函数 pg_start_backup()/pg_stop_backup() 已重命名为 pg_backup_start()/pg_backup_stop(),而函数 pg_backup_start_time()pg_is_in_backup() 已被移除。

  • hash_mem_multiplier 默认值增加到 2.0(Peter Geoghegan) §

    这允许查询哈希操作使用比其他操作更多的 work_mem 内存。

  • 移除服务器端语言 plpython2u 和通用 Python 语言 plpythonu(Andres Freund) §

    Python 2.x 已不再受支持。虽然 plpythonu 最初的意图是最终可以指向 plpython3u,但现在更改它似乎更可能造成问题而非解决问题,因此它被直接移除。

  • 如果向 array_to_tsvector() 传递空字符串数组元素,则生成错误(Jean-Christophe Arnu) §

    这是被禁止的,因为词位不应为空。先前 Postgres 版本的用户应确认未存储空词位,因为它们可能导致导出/恢复失败和结果不一致。

  • 当向 chr() 提供负参数时生成错误(Peter Eisentraut) §

  • 防止 CREATE OR REPLACE VIEW 更改输出列的排序规则(Tom Lane) §

  • 禁止零长度的 Unicode 标识符,例如 U&""(Peter Eisentraut) §

    非 Unicode 的零长度标识符已经被禁止。

  • 防止数字字面量具有非数字的尾随字符(Peter Eisentraut) §

    以前,像 123abc 这样的查询文本会被解释为 123 后跟一个单独的标记 abc

  • 调整 JSON 数字字面量处理以匹配 SQL/JSON 标准(Peter Eisentraut) §

    这接受像 .11. 这样的数字格式,并禁止数字字面量之后的尾随垃圾,如 1.type()

  • interval 输入为大于月的单位提供分数值时,四舍五入到最近的月(Bruce Momjian) §

    例如,将 1.99 years 转换为 2 years,而不是像以前那样转换为 1 year 11 months

  • 改进带有尾随句点的 interval 解析的一致性(Tom Lane) §

    带有尾随句点的数字在某些平台上被拒绝。

  • interval 输出函数标记为 stable 而非 immutable,因为它依赖于 IntervalStyle(Tom Lane) §

    例如,这将导致依赖于 interval 值文本输出的索引创建失败。

  • 间隔调整函数中检测整数溢出(Joe Koshakow) §

    受影响的函数是 justify_interval()justify_hours()justify_days()

  • 更改类型 "char" 非 ASCII 字符的 I/O 格式(Tom Lane) §

    高位被设置的字节现在输出为反斜杠和三个八进制数字,以避免编码问题。

  • 移除登录角色对其自身角色成员资格的默认 ADMIN OPTION 权限(Robert Haas) §

    以前,登录角色即使没有 ADMIN OPTION 权限也可以添加/移除其自身角色的成员。

  • 允许逻辑复制以订阅的所有者身份运行(Mark Dilger) §

    因为不检查行级安全策略,所以只有超级用户、具有 bypassrls 的角色和表所有者才能复制到具有行级安全策略的表中。

  • 防止在订阅所有者对表没有 SELECT 权限的表上执行 UPDATEDELETE 逻辑复制操作(Jeff Davis) §

    UPDATEDELETE 命令通常也涉及读取表,因此要求订阅所有者具有表的 SELECT 权限。

  • EXPLAIN 引用会话的临时对象模式时,将其称为 pg_temp(Amul Sul) §

    以前报告的是实际模式名称,导致不同会话之间的不一致。

  • 修复 pg_statio_all_tables 以在 TOAST 表具有多个索引的罕见情况下求和值(Andrei Zubkov) §

    以前这种情况会为每个索引显示一行。

  • 禁止设置与已安装扩展名称匹配但不是该扩展声明的变量之一的自定义选项(Florin Irion,Tom Lane) § § §

    此变更导致在扩展加载期间删除任何此类已存在的变量,然后防止在会话中稍后创建新的变量。其目的是防止关于变量是否与扩展关联的混淆。

  • 移除过时的服务器变量 stats_temp_directory(Andres Freund,Kyotaro Horiguchi) §

  • 改进用于计算 random() 的算法(Fabien Coelho) § §

    这将导致 random() 的结果与以前版本发出的结果不同,即使是相同的种子值。

  • libpqPQsendQuery() 函数在管道模式下不再被支持(Álvaro Herrera) §

    使用该组合的应用程序需要修改为使用 PQsendQueryParams() 代替。

  • 在非 Windows 平台上,查询 HOME 环境变量以查找用户的主目录(Anders Kaseorg) §

    如果 HOME 为空或未设置,则回退到先前的方法,检查 <pwd.h> 数据库。此变更影响 libpq(例如,在查找 ~/.pgpass 时)以及各种客户端应用程序。

  • 移除 pg_dump--no-synchronized-snapshots 选项(Tom Lane) §

    所有仍受支持的服务器版本都支持同步快照,因此不再需要此选项。

  • psql--single-transaction 模式中检测到错误后,仅在设置了 ON_ERROR_STOP 时才将最终的 COMMIT 命令更改为 ROLLBACK(Michael Paquier) §

  • 避免在 postgres_fdw 发送的查询中对常量进行不必要的类型转换(Dian Fay) §

    当本地和远程数据库之间的列类型故意不同时,这种类型转换可能会导致错误。

  • 移除 xml2xml_is_well_formed() 函数(Tom Lane) §

    此函数自 Postgres 9.1 以来已在核心后端中实现。

  • 允许自定义扫描提供者指示它们是否支持投影(Sven Klemm) §

    现在默认假设自定义扫描提供者不支持投影;支持投影的提供者需要为此版本进行更新。

E.18.3. 变更 #

下面你将找到 PostgreSQL 15 与上一个主版本之间变更的详细说明。

E.18.3.1. 服务器 #

  • 记录并检查每个数据库的排序规则版本(Peter Eisentraut) §

    此功能旨在检测排序规则版本变更以避免索引损坏。函数 pg_database_collation_actual_version() 报告底层操作系统的排序规则版本,而 ALTER DATABASE ... REFRESH 将记录的数据库排序规则版本设置为与操作系统排序规则版本匹配。

  • 允许将 ICU 排序规则设置为集簇和数据库的默认值(Peter Eisentraut) §

    以前,只能在集簇和数据库级别选择基于 libc 的排序规则。ICU 排序规则只能通过显式的 COLLATE 子句使用。

  • 增加系统视图 pg_ident_file_mappings 以报告 pg_ident.conf 信息(Julien Rouhaud) §

E.18.3.1.1. 分区 #
  • 改进引用分区表的查询的规划时间(David Rowley) §

    此变更在只有少数分区相关时有所帮助。

  • 允许分区的有序扫描在更多情况下避免排序(David Rowley) §

    以前,具有 DEFAULT 分区或包含多个值的 LIST 分区的分区表不能用于有序分区扫描。现在,如果这些分区在规划期间被剪枝,则可以使用它们。

  • 改进在分区表上执行将行在分区之间移动的更新时的外键行为(Amit Langote) §

    以前,这样的更新在源分区上运行删除操作,在目标分区上运行插入操作。PostgreSQL 现在将在分区根上运行更新操作,提供更清晰的语义。

  • 允许在分区表上执行 CLUSTER(Justin Pryzby) § §

  • 修复分区表上的 ALTER TRIGGER RENAME 以正确重命名所有分区上的触发器(Arne Roland,Álvaro Herrera) §

    同时禁止重命名克隆的触发器。

E.18.3.1.2. 索引 #
  • 允许系统表和 TOAST 表上的 btree 索引高效存储重复项(Peter Geoghegan) §

    以前,这些类型的索引禁用了去重。

  • 改进使用排序构建的 GiST 索引的查找性能(Aliaksandr Kalenik,Sergei Shoulbakov,Andrey Borodin) §

  • 允许唯一约束和索引将 NULL 值视为不唯一(Peter Eisentraut) §

    以前 NULL 条目总是被视为不同的值,但现在可以通过使用 UNIQUE NULLS NOT DISTINCT 创建约束和索引来更改此行为。

  • 允许 ^@ 起始匹配操作符和 starts_with() 函数在使用 C 排序规则时使用 btree 索引(Tom Lane) §

    以前它们只能使用 SP-GiST 索引。

E.18.3.1.3. 优化器 #
  • 允许扩展统计记录父表及其所有子表的统计信息(Tomas Vondra,Justin Pryzby) §

    常规统计已经分别跟踪父表和父表加所有子表的统计信息。

  • 增加服务器变量 recursive_worktable_factor 以允许用户指定递归查询工作表的预期大小(Simon Riggs) §

E.18.3.1.4. 一般性能 #
  • 允许对包含许多常量的 NOT IN 子句使用哈希查找(David Rowley,James Coleman) §

    以前代码总是顺序扫描值列表。

  • 允许 SELECT DISTINCT 并行化(David Rowley) §

  • 通过每次处理 16 字节来加速 UTF-8 文本的编码验证(John Naylor,Heikki Linnakangas) §

    这将改进文本密集型操作,如 COPY FROM

  • 改进超过 work_mem 的排序性能(Heikki Linnakangas) § §

    当排序数据不再适合 work_mem 时,切换到使用比以前更多输出流的批量排序算法。

  • 改进内存排序的性能并减少内存消耗(Ronan Dunklau,David Rowley,Thomas Munro,John Naylor) § § §

  • 允许 WAL 全页写入使用 LZ4 和 Zstandard 压缩(Andrey Borodin,Justin Pryzby) § §

    这由 wal_compression 服务器设置控制。

  • 增加在 macOS 上使用直接 I/O 写入 WAL 的支持(Thomas Munro) §

    这仅在 max_wal_senders = 0wal_level = minimal 时有效。

  • 允许 vacuum 在设置最旧的冻结和多事务 ID 时更积极(Peter Geoghegan) §

  • 允许引用多个外部表的查询在更多情况下执行并行外部表扫描(Andrey Lepikhov,Etsuro Fujita) §

  • 改进使用 row_number()rank()dense_rank()count()窗口函数的性能(David Rowley) §

  • 改进高核心数 ARM64 系统上自旋锁的性能(Geoffrey Blake) §

E.18.3.1.5. 监控 #
  • 启用检查点和慢速自动清理操作的默认日志记录(Bharath Rupireddy) §

    这将 log_checkpoints 的默认值更改为 on,将 log_autovacuum_min_duration 的默认值更改为 10 分钟。这将导致即使是空闲的服务器也会生成一些日志输出,这在没有日志文件轮转的资源受限服务器上可能会造成问题。在这种情况下应更改这些默认值。

  • 在服务器缓慢启动期间在服务器日志中生成进度消息(Nitin Jadhav,Robert Haas) § §

    消息报告延迟的原因。通知的时间间隔由新的服务器变量 log_startup_progress_interval 控制。

  • 累计统计系统数据存储在共享内存中(Kyotaro Horiguchi,Andres Freund,Melanie Plageman) § §

    以前,此数据通过 UDP 数据包发送到统计收集器进程,只有在通过文件系统传输后会话才能读取。现在不再有单独的统计收集器进程。

  • VACUUM VERBOSE 和自动清理日志消息添加额外信息(Peter Geoghegan) § § §

  • 增加临时文件块 I/O 的 EXPLAIN (BUFFERS) 输出(Masahiko Sawada) §

  • 允许以 JSON 格式进行日志输出(Sehrope Sarkuni,Michael Paquier) §

    新的设置是 log_destination = jsonlog

  • 允许 pg_stat_reset_single_table_counters() 重置所有数据库间共享的关系的计数器(Sadhuprasad Patro) §

  • 为本地 shell 命令增加等待事件(Fujii Masao) §

    新的等待事件在调用 archive_commandarchive_cleanup_commandrestore_commandrecovery_end_command 时使用。

E.18.3.1.6. 权限 #
  • 允许通过视图进行的表访问可选择性地由视图调用者的权限控制(Christoph Heiss) §

    以前,视图访问总是被视为由视图所有者完成。这仍然是默认行为。

  • 允许 pg_write_server_files 预定义角色的成员执行服务器端基础备份(Dagfinn Ilmari Mannsåker) §

    以前只有超级用户可以执行此类备份。

  • 允许 GRANT 授予通过 SETALTER SYSTEM 更改单个服务器变量的权限(Mark Dilger) § §

    新函数 has_parameter_privilege() 报告此权限。

  • 增加预定义角色 pg_checkpoint,允许其成员运行 CHECKPOINT(Jeff Davis) § §

    以前只有超级用户可以运行检查点。

  • 允许 pg_read_all_stats 预定义角色的成员访问 pg_backend_memory_contextspg_shmem_allocations 视图(Bharath Rupireddy) §

    以前这些视图只能由超级用户访问。

  • 允许 GRANT 授予 pg_log_backend_memory_contexts() 的权限(Jeff Davis) §

    以前此函数只能由超级用户运行。

E.18.3.1.7. 服务器配置 #
  • 增加服务器变量 shared_memory_size 以报告已分配共享内存的大小(Nathan Bossart) § §

  • 增加服务器变量 shared_memory_size_in_huge_pages 以报告所需的大内存页数量(Nathan Bossart) § §

    这仅在 Linux 上受支持。

  • 在单用户模式下遵守服务器变量 shared_preload_libraries(Jeff Davis) §

    此变更支持使用 shared_preload_libraries 加载自定义访问方法和 WAL 资源管理器,即使在单用户模式下这对数据库访问也是必需的。

  • 在 Solaris 上,将 dynamic_shared_memory_type 的默认设置设为 sysv(Thomas Munro) §

    之前的默认选择 posix 可能导致此平台上的虚假失败。

  • 允许 postgres -C 正确报告运行时计算的值(Nathan Bossart) §

    以前,运行时计算的值 data_checksumswal_segment_sizedata_directory_mode 会报告在运行中的服务器上不准确的值。但是,这在运行中的服务器上不起作用。

E.18.3.2. 流复制和恢复 #

  • 增加对服务器端基础备份的 LZ4 和 Zstandard 压缩支持(Jeevan Ladhe,Robert Haas) § § §

  • 在崩溃恢复期间运行检查点进程和后台写入进程(Thomas Munro) §

    这有助于加速长时间的崩溃恢复。

  • 允许 WAL 处理预取所需的文件内容(Thomas Munro) §

    这由服务器变量 recovery_prefetch 控制。

  • 允许通过可加载模块进行归档(Nathan Bossart) §

    以前,归档只能通过调用 shell 命令完成。新的服务器变量 archive_library 可以设置为指定用于归档的库。

  • 不再要求在 START_REPLICATION 之前运行 IDENTIFY_SYSTEM(Jeff Davis) §

E.18.3.2.1. 逻辑复制 #
  • 允许发布模式中的所有表(Vignesh C,Hou Zhijie,Amit Kapila) § § §

    例如,现在支持此语法:CREATE PUBLICATION pub1 FOR TABLES IN SCHEMA s1,s2ALTER PUBLICATION 支持类似的语法。稍后添加到列出的模式中的表也将被复制。

  • 允许使用 WHERE 子句过滤发布内容(Hou Zhijie,Euler Taveira,Peter Smith,Ajin Cherian,Tomas Vondra,Amit Kapila) § § §

    不满足 WHERE 子句的行不会被发布。

  • 允许将发布内容限制为特定列(Tomas Vondra,Álvaro Herrera,Rahila Syed) §

  • 允许使用 ALTER SUBSCRIPTION ... SKIP 在订阅者上跳过事务(Masahiko Sawada) §

  • 为逻辑复制增加预备(两阶段)事务支持(Peter Smith,Ajin Cherian,Amit Kapila,Nikhil Sontakke,Stas Kelvich) § § §

    新的 CREATE_REPLICATION_SLOT 选项称为 TWO_PHASEpg_recvlogical 现在在创建槽时支持新的 --two-phase 选项。

  • 防止空事务的逻辑复制(Ajin Cherian,Hou Zhijie,Euler Taveira) §

    以前,如果订阅的表没有被修改,发布者会向订阅者发送空事务。

  • 增加 SQL 函数来监控逻辑复制槽的目录内容(Bharath Rupireddy) §

    新函数是 pg_ls_logicalsnapdir()pg_ls_logicalmapdir()pg_ls_replslotdir()。它们可以由预定义的 pg_monitor 角色的成员运行。

  • 允许订阅者在出错时停止应用逻辑复制变更(Osumi Takamichi,Mark Dilger) §

    这通过订阅者选项 disable_on_error 启用,避免流应用期间可能的无限错误循环。

  • 调整订阅者服务器变量以匹配发布者,使 datetime 和 float8 值被一致地解释(Japin Li) §

    某些发布者可能依赖于不一致的行为。

  • 增加系统视图 pg_stat_subscription_stats 以报告订阅者活动(Masahiko Sawada) § §

    新函数 pg_stat_reset_subscription_stats() 允许重置这些统计计数器。

  • pg_publication_tables 系统视图中抑制重复条目(Hou Zhijie) §

    在某些情况下,一个分区可能出现多次。

E.18.3.3. 工具命令 #

  • 增加 SQL MERGE 命令以调整一个表使其与另一个表匹配(Simon Riggs,Pavan Deolasee,Álvaro Herrera,Amit Langote) §

    这与 INSERT ... ON CONFLICT 类似,但更面向批量操作。

  • 增加 COPY 文本格式中 HEADER 选项的支持(Rémi Lapeyre) § §

    新选项导致列名被输出,并可选择在输入时进行验证。

  • 增加新的 WAL 日志记录方法用于数据库创建(Dilip Kumar) §

    这是复制模板数据库的新默认方法,因为它避免了数据库创建期间对检查点的需求。但是,如果模板数据库很大,它可能会很慢,因此旧方法仍然可用。

  • 允许 CREATE DATABASE 设置数据库 OID(Shruthi Gowda,Antonin Houska) §

  • 防止 DROP DATABASEDROP TABLESPACEALTER DATABASE SET TABLESPACE 在 Windows 上并发使用时偶尔失败(Thomas Munro) §

  • 允许外键 ON DELETE SET 操作仅影响指定的列(Paul Martinez) §

    以前,外键中的所有列总是受到影响。

  • 允许 ALTER TABLE 修改表的 ACCESS METHOD(Justin Pryzby,Jeff Davis) §

  • ALTER TABLE 导致表重写时正确调用对象访问钩子(Michael Paquier) §

  • 允许创建非日志记录的序列(Peter Eisentraut) §

  • 跟踪返回复合类型的函数结果中各个列的依赖关系(Tom Lane) §

    以前,如果视图或规则包含对返回复合类型的函数结果中特定列的引用,这不会被记录为依赖关系;视图或规则仅被认为依赖于整个复合类型。这意味着允许删除单个列,从而在以后使用视图或规则时造成问题。现在也记录了列级依赖关系,因此除非更改或删除视图,否则删除此类列将被拒绝。

E.18.3.4. 数据类型 #

  • 允许 numeric 值的精度为负数或大于其精度(Dean Rasheed,Tom Lane) §

    这允许对小数点左边的值进行四舍五入,例如,'1234'::numeric(4, -2) 返回 1200。

  • 改进将值转换为 interval 时的溢出检测(Joe Koshakow) §

  • 更改类型 "char" 非 ASCII 字符的 I/O 格式(Tom Lane) §

  • 更新现代 Unicode 字符(如表情符号)的显示宽度信息(Jacob Champion) § §

    同时从 Unicode 5.0 更新到 14.0.0。现在有一种自动化方法来保持 Postgres 与 Unicode 发布同步。

E.18.3.5. 函数 #

  • range_agg() 增加多范围输入(Paul Jungwirth) §

  • xid8 数据类型增加 MIN()MAX() 聚合(Ken Kato) §

  • 增加正则表达式函数以与其他关系系统兼容(Gilles Darold,Tom Lane) §

    新函数是 regexp_count()regexp_instr()regexp_like()regexp_substr()。还为 regexp_replace() 增加了一些新的可选参数。

  • 增加计算多边形之间距离的能力(Tom Lane) §

  • to_char() 增加格式代码 oftzhtzm(Nitin Jadhav) §

    这些的大写等价形式已经被支持。

  • 当将 AT TIME ZONE 应用于 time with time zone 值时,使用事务开始时间而不是挂钟时间来确定是否适用夏令时(Aleksander Alekseev,Tom Lane) §

    这允许将转换视为稳定的而不是易变的,并且每次调用节省一次内核调用。

  • 在带数组参数的 ts_delete()setweight() 函数中忽略 NULL 数组元素(Jean-Christophe Arnu) §

    这些函数实际上会忽略空字符串数组元素(因为它们永远不会匹配有效的词素)。让它们也忽略 NULL 元素而不是失败似乎是一致的。

  • pg_size_pretty()pg_size_bytes() 增加 PB 单位支持(David Christensen) §

  • 更改 pg_event_trigger_ddl_commands() 以使用实际模式名称输出对其他会话临时模式的引用(Tom Lane) §

    以前此函数将所有临时模式报告为 pg_temp,但对当前会话的临时模式以外的任何模式使用该名称是有误导性的。

E.18.3.6. PL/pgSQL #

  • 修复 PL/pgSQL 变量 CONSTANT 标记的强制执行(Tom Lane) §

    以前,变量即使被标记为 CONSTANT,仍可以用作 CALL 输出参数或 refcursor OPEN 变量。

E.18.3.7. libpq #

  • 允许 IP 地址与服务器证书的主体替代名称进行匹配(Jacob Champion) §

  • 允许 PQsslAttribute() 在不需要 libpq 连接的情况下报告 SSL 库类型(Jacob Champion) §

  • 更改客户端发送的查询取消以使用与正常客户端连接相同的 TCP 设置(Jelte Fennema) §

    这允许配置的 TCP 超时应用 到查询取消连接。

  • 防止 libpq 事件回调失败强制产生错误结果(Tom Lane) § §

E.18.3.8. 客户端应用 #

  • 允许 pgbench 在序列化和死锁失败后重试(Yugo Nagata,Marina Polyakova) §

E.18.3.8.1. psql #
  • 通过以更大的块发送数据来改进 psql\copy 命令的性能(Heikki Linnakangas) §

  • 增加 \dconfig 命令以报告服务器变量(Mark Dilger,Tom Lane) § § §

    这类似于服务器端的 SHOW 命令,但它可以处理模式以方便地显示多个变量。

  • 增加 \getenv 命令以将环境变量的值赋给 psql 变量(Tom Lane) §

  • \lo_list\dl 命令增加 + 选项以显示大对象权限(Pavel Luzanov) §

  • \watch 命令增加分页器选项(Pavel Stehule,Thomas Munro) §

    这仅在 Unix 上受支持,由 PSQL_WATCH_PAGER 环境变量控制。

  • 使 psql 在发送到服务器的查询中包含查询内的双连字符注释(Tom Lane,Greg Nancarrow) § §

    以前,这些注释在发送之前会从查询中删除。在任何查询文本之前的双连字符注释不会被发送,也不会被记录为单独的 psql 历史条目。

  • 调整 psql,使 Readline 的 meta-# 命令插入双连字符注释标记(Tom Lane) §

    以前会插入井号标记,除非用户费心配置了非默认的注释标记。

  • 使 psql 在一次向服务器传递多个查询时输出所有结果(Fabien Coelho) §

    以前只显示最后一个查询结果。可以通过将 SHOW_ALL_RESULTS psql 变量设置为 off 来恢复旧行为。

  • --single-transaction 模式中检测到错误后,仅在设置了 ON_ERROR_STOP 时才将最终的 COMMIT 命令更改为 ROLLBACK(Michael Paquier) §

    以前,在 -c 命令或 -f 脚本文件中检测到错误会导致在最后发出 ROLLBACK,而不管 ON_ERROR_STOP 的值如何。

  • 改进 psql 的 Tab 补全(Shinya Kato,Dagfinn Ilmari Mannsåker,Peter Smith,Koyu Tanigawa,Ken Kato,David Fetter,Haiying Tang,Peter Eisentraut,Álvaro Herrera,Tom Lane,Masahiko Sawada) § § § § § § § § § § § § § § § § § § § §

  • psql 反斜杠命令的支持限制为运行 PostgreSQL 9.2 或更高版本的服务器(Tom Lane) §

    移除仅在与较旧服务器一起运行时使用的代码。与 9.2 相比不需要任何特定版本调整的命令仍然可以工作。

E.18.3.8.2. pg_dump #
  • 使 pg_dump 导出 public 模式的所有权变更和安全标签(Noah Misch) § §

  • 改进导出包含许多对象的数据库的性能(Tom Lane) § § §

    这也将改进 pg_upgrade 的性能。

  • 改进并行 pg_dump 对具有大型 TOAST 表的表的性能(Tom Lane) §

  • 增加导出/恢复选项 --no-table-access-method 以强制恢复仅使用默认表访问方法(Justin Pryzby) §

  • pg_dumppg_dumpall 的支持限制为运行 PostgreSQL 9.2 或更高版本的服务器(Tom Lane) §

E.18.3.9. 服务器应用 #

  • pg_basebackup 增加新选项 --target 以控制基础备份位置(Robert Haas) §

    新选项是 server(在本地写入备份)和 blackhole(丢弃备份,用于测试)。

  • 允许 pg_basebackup 对基础备份文件进行服务器端 gzip、LZ4 和 Zstandard 压缩以及客户端 LZ4 和 Zstandard 压缩(Dipesh Pandit,Jeevan Ladhe) § § §

    客户端 gzip 压缩已经被支持。

  • 允许 pg_basebackup 在服务器端压缩并在客户端存储之前解压缩(Dipesh Pandit) §

    这通过指定服务器端压缩和纯文本输出格式来实现。

  • 允许 pg_basebackup--compress 选项控制压缩位置(服务器或客户端)、压缩方法和压缩选项(Michael Paquier,Robert Haas) § § §

  • pg_receivewal 增加 LZ4 压缩方法(Georgios Kokolatos) § §

    这通过 --compress=lz4 启用,需要使用 --with-lz4 构建二进制文件。

  • pg_receivewal--compress 选项增加额外功能(Georgios Kokolatos) §

  • 改进 pg_receivewal 在正确的 WAL 位置重新启动的能力(Ronan Dunklau) §

    以前,pg_receivewal 会基于存储在本地归档目录中的 WAL 文件启动,或从发送服务器的当前 WAL 刷新位置启动。通过此变更,如果发送服务器运行 Postgres 15 或更高版本,本地归档目录为空,并且指定了复制槽,则将使用复制槽的重新启动点。

  • pg_rewind 增加选项 --config-file 以简化服务器配置文件存储在数据目录之外时的使用(Gunnar Bluth) §

E.18.3.9.1. pg_upgrade #
  • pg_upgrade 的日志和临时文件存储在新集簇的名为 pg_upgrade_output.d 的子目录中(Justin Pryzby) § § §

    以前这些文件留在当前目录中,需要手动清理。现在它们在 pg_upgrade 成功完成后会自动删除。

  • 如果输出不是终端,则在 pg_upgrade 操作期间禁用默认状态报告(Andres Freund) §

    可以通过使用 --verbose 为非终端使用启用状态报告输出。

  • 使 pg_upgrade 报告所有具有无效连接设置的数据库(Jeevan Ladhe) §

    以前只报告第一个具有无效连接设置的数据库。

  • 使 pg_upgrade 保留表空间和数据库 OID,以及关系的 relfilenode 编号(Shruthi Gowda,Antonin Houska) § § §

  • pg_upgrade 增加 --no-sync 选项(Michael Paquier) §

    这仅推荐用于测试。

  • pg_upgrade 的支持限制为运行 PostgreSQL 9.2 或更高版本的旧服务器(Tom Lane) §

E.18.3.9.2. pg_waldump #
  • 允许按关系文件节点、块号、分叉号和全页镜像过滤 pg_waldump 输出(David Christensen,Thomas Munro) § §

  • 使 pg_waldump 在被中断退出之前报告统计信息(Bharath Rupireddy) §

    例如,在运行 pg_waldump --stats --follow 的终端中按 Ctrl-C 将在退出前报告当前统计信息。这在 Windows 上不起作用。

  • 改进 pg_waldump 报告的某些事务 WAL 记录的描述(Masahiko Sawada,Michael Paquier) §

  • 允许 pg_waldump 转储多个资源管理器的信息(Heikki Linnakangas) §

    这通过多次指定 --rmgr 选项来启用。

E.18.3.10. 文档 #

  • 增加 pg_encoding_to_char()pg_char_to_encoding() 的文档(Ian Lawrence Barwick) §

  • 记录 ^@ 起始匹配操作符的文档(Tom Lane) §

E.18.3.11. 源代码 #

  • 增加使用 cirrus-ci 进行持续集成测试的支持(Andres Freund,Thomas Munro,Melanie Plageman) §

  • 增加配置选项 --with-zstd 以启用 Zstandard 构建(Jeevan Ladhe,Robert Haas,Michael Paquier) §

  • 在可加载库的魔术块中增加 ABI 标识符字段,允许非社区 PostgreSQL 发行版识别与其他构建不兼容的库(Peter Eisentraut) §

    ABI 字段不匹配将在加载时生成错误。

  • "char" 创建新的 pg_type.typcategory 值(Tom Lane) §

    一些其他仅供内部使用的类型也已被分配到此类别。

  • 增加新的协议消息 TARGET 以指定用于基础备份的新 COPY 方法(Robert Haas) §

    pg_basebackup 现在使用此方法。

  • 增加新的协议消息 COMPRESSIONCOMPRESSION_DETAIL 以指定压缩方法和选项(Robert Haas) § §

  • 移除服务器对旧的 BASE_BACKUP 命令语法和基础备份协议的支持(Robert Haas) § §

  • 增加扩展设置自定义备份目标的支持(Robert Haas) §

  • 允许扩展定义自定义 WAL 资源管理器(Jeff Davis) §

  • 增加函数 pg_settings_get_flags() 以获取服务器变量的标志(Justin Pryzby) §

  • 在 Windows 上,使用 PGDLLIMPORT 标记导出服务器的所有全局变量(Robert Haas) §

    以前,在 Windows 上只有特定变量可供扩展访问。

  • 构建 PostgreSQL 需要 GNU make 3.81 或更高版本(Tom Lane) §

  • 构建 pgcrypto 扩展需要 OpenSSL(Peter Eisentraut) §

  • 需要 Perl 5.8.3 或更高版本(Dagfinn Ilmari Mannsåker) §

  • 需要 Python 3.2 或更高版本(Andres Freund) §

E.18.3.12. 附加模块 #

  • 允许 amcheck 检查序列(Mark Dilger) §

  • 改进 amcheckTOAST 表的完整性检查(Mark Dilger) §

  • 增加新模块 basebackup_to_shell 作为自定义备份目标的示例(Robert Haas) § §

  • 增加新模块 basic_archive 作为通过库执行归档的示例(Nathan Bossart) §

  • 允许在布尔列上创建 btree_gist 索引(Emre Hasegeli) § § §

    这些可以用于排除约束。

  • 修复 pageinspectpage_header() 以处理 32KB 页面大小(Quan Zongliang) §

    以前,在某些情况下可能返回不正确的负值。

  • pg_stat_statements 增加临时文件块 I/O 的计数器(Masahiko Sawada) §

  • 为 pg_stat_statements 增加 JIT 计数器(Magnus Hagander) §

  • 增加新模块 pg_walinspect(Bharath Rupireddy) §

    这提供了类似于 pg_waldumpSQL 级别输出。

  • sepgsql 日志消息中指示宽容/强制状态(Dave Page) §

E.18.3.12.1. postgres_fdw #
  • 允许 postgres_fdw 下推 CASE 表达式(Alexander Pyhalov) §

  • 增加服务器变量 postgres_fdw.application_name 以控制 postgres_fdw 连接的应用程序名称(Hayato Kuroda) § § §

    以前远程会话的 application_name 只能在远程服务器上设置或通过 postgres_fdw 连接规范设置。postgres_fdw.application_name 支持一些用于自定义的转义序列,使得在远程服务器上更容易区分这些连接。

  • 允许在 postgres_fdw 服务器上进行并行提交(Etsuro Fujita) §

    这通过 CREATE SERVER 选项 parallel_commit 启用。

E.18.4. 致谢 #

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

Abhijit Menon-Sen
Adam Brusselback
Adam Mackler
Adrian Ho
Ahsan Hadi
Ajin Cherian
Alastair McKinley
Aleksander Alekseev
Ales Zeleny
Alex Kingsborough
Alex Kozhemyakin
Alexander Korotkov
Alexander Kukushkin
Alexander Lakhin
Alexander Nawratil
Alexander Pyhalov
Alexey Borzov
Alexey Ermakov
Aliaksandr Kalenik
Álvaro Herrera
Amit Kapila
Amit Khandekar
Amit Langote
Amul Sul
Anastasia Lubennikova
Anders Kaseorg
Andreas Dijkman
Andreas Grob
Andreas Seltenreich
Andrei Zubkov
Andres Freund
Andrew Alsup
Andrew Bille
Andrew Dunstan
Andrew Gierth
Andrew Kesper
Andrey Borodin
Andrey Lepikhov
Andrey Sokolov
Andy Fan
Anton Melnikov
Anton Voloshin
Antonin Houska
Arjan van de Ven
Arne Roland
Arthur Zakirov
Ashutosh Bapat
Ashutosh Sharma
Ashwin Agrawal
Asif Rehman
Asim Praveen
Atsushi Torikoshi
Aya Iwata
Bauyrzhan Sakhariyev
Benoit Lobréau
Bernd Dorn
Bertrand Drouvot
Bharath Rupireddy
Björn Harrtell
Boris Kolpackov
Boris Korzun
Brad Nicholson
Brar Piening
Bruce Momjian
Bruno da Silva
Bryn Llewellyn
Carl Sopchak
Cary Huang
Chapman Flack
Chen Jiaoqian
Chris Bandy
Chris Lowder
Christian Quest
Christoph Berg
Christoph Heiss
Christophe Pettus
Christopher Painter-Wakefield
Claudio Freire
Clemens Zeidler
Corey Huinker
Dag Lem
Dagfinn Ilmari Mannsåker
Dan Kubb
Daniel Cherniy
Daniel Gustafsson
Daniel Polski
Daniel Vérité
Daniel Westermann
Daniele Varrazzo
Daniil Anisimov
Danny Shemesh
Darafei Praliaskouski
Daria Lepikhova
Dave Cramer
Dave Page
David Christensen
David Fetter
David G. Johnston
David Rowley
David Steele
David Zhang
Dean Rasheed
Dian Fay
Dilip Kumar
Dipesh Pandit
Dmitry Dolgov
Dmitry Koval
Dmitry Marakasov
Dominique Devienne
Dong Wook
Drew DeVault
Eduard Català
Egor Chindyaskin
Egor Rogov
Ekaterina Kiryanova
Elena Indrupskaya
Elvis Pranskevichus
Emmanuel Quincerot
Emre Hasegeli
Eric Mutta
Erica Zhang
Erik Rijkers
Erki Eessaar
Etsuro Fujita
Euler Taveira
Fabien Coelho
Fabrice Chapuis
Fabrice Fontaine
Fabrízio de Royes Mello
Feike Steenbergen
Filip Gospodinov
Florin Irion
Floris Van Nee
Frédéric Yhuel
Gabriela Serventi
Gaurab Dey
Geoff Winkless
Geoffrey Blake
Georgios Kokolatos
Gilles Darold
Greg Nancarrow
Greg Rychlewski
Greg Sabino Mullane
Greg Stark
Gregory Smith
Guillaume Lelarge
Gunnar Bluth
Gurjeet Singh
Haiyang Wang
Haiying Tang
Hannu Krosing
Hans Buschmann
Hayato Kuroda
Heath Lord
Heikki Linnakangas
Herwig Goemans
Himanshu Upadhyaya
Holly Roberts
Hou Zhijie
Hubert Lubaczewski
Ian Barwick
Ian Campbell
Ibrar Ahmed
Ildus Kurbangaliev
Ilya Anfimov
Itamar Gafni
Jacob Champion
Jaime Casanova
Jakub Wartak
James Coleman
James Hilliard
James Inform
Jan Piotrowski
Japin Li
Jason Harvey
Jason Kim
Jean-Christophe Arnu
Jeevan Ladhe
Jeff Davis
Jeff Janes
Jehan-Guillaume de Rorthais
Jelte Fennema
Jeremy Evans
Jeremy Schneider
Jian Guo
Jian He
Jimmy Yih
Jiri Fejfar
Jitka Plesníková
Joe Conway
Joe Wildish
Joel Jacobson
Joey Bodoia
John Naylor
Jonathan Katz
Josef Simanek
Joseph Koshakow
Josh Soref
Joshua Brindle
Juan José Santamaría Flecha
Julien Rouhaud
Julien Roze
Junwang Zhao
Jürgen Purtz
Justin Pryzby
Ken Kato
Kevin Burke
Kevin Grittner
Kevin Humphreys
Kevin McKibbin
Kevin Sweet
Kevin Zheng
Klaudie Willis
Konstantin Knizhnik
Konstantina Skovola
Kosei Masumura
Kotaro Kawamoto
Koyu Tanigawa
Kuntal Ghosh
Kyotaro Horiguchi
Lars Kanis
Lauren Fliksteen
Laurent Hasson
Laurenz Albe
Leslie Lemaire
Liam Bowen
Lingjie Qiang
Liu Huailing
Louis Jachiet
Lukas Fittl
Ma Liangzhu
Maciek Sakrejda
Magnus Hagander
Mahendra Singh Thalor
Maksim Milyutin
Marc Bachmann
Marcin Krupowicz
Marcus Gartner
Marek Szuba
Marina Polyakova
Mario Emmenlauer
Mark Dilger
Mark Murawski
Mark Wong
Markus Wanner
Markus Winand
Martijn van Oosterhout
Martin Jurca
Martin Kalcher
Martín Marqués
Masahiko Sawada
Masahiro Ikeda
Masao Fujii
Masaya Kawamoto
Masayuki Hirose
Matthias van de Meent
Matthijs van der Vleuten
Maxim Orlov
Maxim Yablokov
Melanie Plageman
Michael Banck
Michael Harris
Michael J. Sullivan
Michael Meskes
Michael Mühlbeyer
Michael Paquier
Michael Powers
Mike Fiedler
Mike Oh
Mikhail Kulagin
Miles Delahunty
Naoki Okano
Nathan Bossart
Nathan Long
Nazir Bilal Yavuz
Neha Sharma
Neil Chen
Nicola Contu
Nicolas Lutic
Nikhil Benesch
Nikhil Shetty
Nikhil Sontakke
Nikita Glukhov
Nikolai Berkoff
Nikolay Samokhvalov
Nikolay Shaplov
Nitin Jadhav
Noah Misch
Noboru Saito
Noriyoshi Shinoda
Olaf Bohlen
Olly Betts
Onder Kalaci
Oskar Stenberg
Otto Kekalainen
Paul Guo
Paul Jungwirth
Paul Martinez
Pavan Deolasee
Pavel Borisov
Pavel Luzanov
Pavel Stehule
Peter Eisentraut
Peter Geoghegan
Peter Slavov
Peter Smith
Petr Jelínek
Phil Florent
Phil Krylov
Pierre-Aurélien Georges
Prabhat Sahu
Quan Zongliang
Rachel Heaton
Rahila Syed
Rajakavitha Kodhandapani
Rajkumar Raghuwanshi
Ranier Vilela
Rei Kamigishi
Reid Thompson
Rémi Lapeyre
Renan Soares Lopes
Richard Guo
Richard Wesley
RKN Sai Krishna
Robert Haas
Robert Treat
Roberto Mello
Robins Tharakan
Roger Mason
Roman Zharkov
Ronan Dunklau
Rui Zhao
Ryan Kelly
Ryo Matsumura
Ryohei Takahashi
Sadhuprasad Patro
Sait Talha Nisanci
Sami Imseih
Sandeep Thakkar
Sebastian Kemper
Sehrope Sarkuni
Sergei Kornilov
Sergei Shoulbakov
Sergey Shinderuk
Shay Rojansky
Shenhao Wang
Shi Yu
Shinya Kato
Shruthi Gowda
Simon Perepelitsa
Simon Riggs
Sirisha Chamarthi
Soumyadeep Chakraborty
Stan Hu
Stas Kelvich
Stefen Hillman
Stephen Frost
Steve Chavez
Sumanta Mukherjee
Suraj Khamkar
Suraj Kharage
Sven Klemm
Takamichi Osumi
Takayuki Tsunakawa
Takeshi Ideriha
Tatsuhiro Nakamori
Tatsuhito Kasahara
Tatsuo Ishii
Tatsuro Yamada
Teja Mupparti
Teodor Sigaev
Thibaud Walkowiak
Thom Brown
Thomas McKay
Thomas Munro
Tim McNamara
Timo Stolz
Timur Khanjanov
Tom Lane
Tomas Barton
Tomas Vondra
Tony Reix
Troy Frericks
Tushar Ahuja
Victor Wagner
Victor Yegorov
Vignesh C
Vik Fearing
Vincas Dargis
Vitaly Burovoy
Vitaly Voronov
Vladimir Sitnikov
Wang Ke
Wei Sun
Wei Wang
Whale Song
Will Mortensen
Wolfgang Walther
Yanliang Lei
Yaoguang Chen
Yogendra Suralkar
YoungHwan Joo
Yugo Nagata
Yukun Wang
Yura Sokolov
Yusuke Egashira
Yuzuko Hosoya
Zhang Mingli
Zhang Wenjie
Zhihong Yu
Zhiyong Wu