PostgreSQL 每周新闻 - 2021年11月7日

发布于 2021-11-08,PostgreSQL Global Development Group
PG 每周新闻

PostgreSQL 每周新闻 - 2021年11月7日

PG Build 2021 将于2021年11月30日和12月1日 09:00-17:00 GMT 在线举行。 详情

PostgreSQL 产品新闻

PostgresDAC 3.11,一个 PostgreSQL 直接访问组件套件,已发布。 http://microolap.com/products/connectivity/postgresdac/download/

JDBC 42.3.1 已发布

ODB C++ ORM 版本 2.5.0-b.21 已发布

DynamoDB FDW 1.0.0 已发布

Babelfish,一个 PostgreSQL 的 MS SQL Server 兼容层, 已发布

PostgreSQL 十一月招聘信息

https://archives.postgresql.org/pgsql-jobs/2021-11/

PostgreSQL 新闻报道

Planet PostgreSQL: https://planet.postgresql.org/

本周 PostgreSQL 每周新闻由 David Fetter 为您呈现

请于太平洋时间每周日下午3:00前将新闻和公告提交至 david@fetter.org。

已应用的补丁

Tom Lane 推送了:

Michaël Paquier 推送了:

  • 在 REINDEX CONCURRENTLY 中保留操作符类参数。旧索引的操作符类参数 Datum 以与谓词和表达式相同的方式获取,即直接从系统目录中获取,然后复制到将用于创建新副本的新 IndexInfo 中。这导致新索引使用默认参数而非用户预定义的参数进行重建。恢复具有正确操作符类参数的新索引的唯一方法是从头开始重新创建索引。 该问题由 911e702 引入。 作者:Michael Paquier 审查者:Zhihong Yu 讨论: https://postgr.es/m/YX0CG/QpLXcPr8HJ@paquier.xyz 回溯移植至:13 https://git.postgresql.org/pg/commitdiff/add5cf28d48149459466b9aff374d78aebf17482

  • 为 pg_receivewal 添加时间线切换的 TAP 测试。pg_receivewal 能够跟随时间线切换,但这一点之前没有测试过。此测试使用一个空的归档位置并从一个槽重新启动,使其实现比重用现有归档目录稍微简单一些。 作者:Ronan Dunklau 审查者:Kyotaro Horiguchi、Michael Paquier 讨论: https://postgr.es/m/18708360.4lzOvYHigE@aivenronan https://git.postgresql.org/pg/commitdiff/0f9b9938a0367313fcf6a32fcb7fb5be9e281198

  • 重构 pg_receivewal 的压缩选项。pg_receivewal 自 cada1af 以来包含 --compress 选项,允许使用 gzip 压缩 WAL 段,值为 0(默认值)表示不使用压缩。此提交引入了一个名为 --compression-method 的新选项,能够使用"none"(默认值)和"gzip"作为值,使其更具可扩展性。--compress=0 的情况在这个选项层中变得模糊,因此我们选择让 pg_receivewal 在使用"none"和非零压缩级别时返回错误,这意味着 --compress 的授权值现在是 [1,9] 而不是 [0,9]。不指定 --compress 并使用"gzip"作为压缩方法会使 pg_receivewal 使用 zlib 的默认值(Z_DEFAULT_COMPRESSION)。扫描现有归档以查找流起始 LSN 的代码被重构并使其更具可扩展性。同时,将 walmethods.c 中的"compression"重命名为"compression_level",以减少与压缩方法引入的混淆,即使 pg_basebackup 使用的 tar 方法不依赖于压缩方法(至少目前是这样),而只是依赖于压缩级别(这个领域实际上还可以进一步改进)。 这是为即将到来的为 pg_receivewal 添加 LZ4 支持的补丁做准备。 作者:Georgios Kokolatos 审查者:Michael Paquier、Jian Guo、Magnus Hagander、Dilip Kumar、Robert Haas 讨论: https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/d62bcc8b07f921bad105c7a826702c117ea7be58

  • 修复 pg_receivewal --compression-method 的一些笔误。其中一条错误消息中的选项名称不正确,代码中使用了短选项 'I',但我们并不打算这样做。同时,修复文档以引用"方法"而非"级别"。 提交 d62bcc8 中的疏忽,在我对 pg_receivewal 的 LZ4 补丁进行更多审查后发现。 https://git.postgresql.org/pg/commitdiff/9588622945754305836555273a6a3be814db315c

  • 在 pg_receivewal 中添加 LZ4 压缩支持。pg_receivewal 获得了一个新选项 --compression-method=lz4,在代码使用 --with-lz4 编译时可用。与 gzip 类似,这提供了使用 LZ4 压缩归档 WAL 段的可能性。此选项与 --compress 不兼容。实现使用 LZ4 帧,与简单的 lz4 命令兼容。与 gzip 一样,使用 --synchronous 确保任何数据都将在当前的 .partial 段内刷新到磁盘,这样即使从未完成的段中也可以检索尽可能多的 WAL 数据(这需要在解压后用零填充部分文件至后端支持的 WAL 段大小,但这与 gzip 相同)。流起始 LSN 的计算能够透明地查找和检查 LZ4 压缩的段。与 gzip 中未压缩大小直接存储在读取的对象中不同,LZ4 块协议默认不存储未压缩的数据。有 contentSize 可以与 LZ4 帧一起使用,但如果使用包含以"lz4"命令的默认设置压缩的段的归档(其中不存储此信息),则无济于事。 因此,此提交采用了最具可扩展性的方法,通过 64kB 块的空白输出缓冲区解压已归档的段以检查其未压缩大小(使用 8kB、16kB 或 32kB 未注意到实际性能差异,且操作本身实际上很快)。已添加测试以验证生成的 LZ4 文件的创建和正确性。后者通过使用"lz4"命令(如果在环境中找到)来实现。walmethods.c 中基于 tar 的 WAL 方法(现在仅由 pg_basebackup 使用)尚不了解 LZ4。其代码可以为此目的进行扩展。 作者:Georgios Kokolatos 审查者:Michael Paquier、Jian Guo、Magnus Hagander、Dilip Kumar 讨论: https://postgr.es/m/ZCm1J5vfyQ2E6dYvXz8si39HQ2gwxSZ3IpYaVgYa3lUwY88SLapx9EEnOf5uEwrddhx2twG7zYKjVeuP5MwZXCNPybtsGouDsAD1o2L_I5E=@pm.me https://git.postgresql.org/pg/commitdiff/babbbb595d2322da095a1e6703171b3f1f2815cb

  • 改进 psql 对 COMMENT 的 Tab 补全。为更多对象类型添加了补全,如域约束、文本搜索相关对象或策略。此外,该区域已重新组织,将 COMMENT 支持的对象列表更改为与文档相同的顺序,以方便未来的添加。 作者:Ken Kato 审查者:Fujii Masao、Shinya Kato、Suraj Khamkar、Michael Paquier 讨论: https://postgr.es/m/6e0c2f3f657b229bea32d098d118f307@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/a5b336b8b9e04a93e7c8526302504d2e5201eb80

Álvaro Herrera 推送了:

Daniel Gustafsson 推送了:

Amit Kapila 推送了:

Fujii Masao 推送了:

Peter Geoghegan 推送了:

Peter Eisentraut 推送了:

Heikki Linnakangas 推送了:

Robert Haas 推送了:

  • amcheck:添加额外的 TOAST 指针检查。扩展对 toast 属性的检查,在 rawsize 过大时发出警告。对于压缩属性,如果压缩似乎扩大了属性或压缩方法无效,也会发出警告。 Mark Dilger,由 Justin Pryzby、Alexander Alekseev、Heikki Linnakangas、Greg Stark 和我审查。 讨论: http://postgr.es/m/8E42250D-586A-4A27-B317-8B062C3816A8@enterprisedb.com https://git.postgresql.org/pg/commitdiff/bd807be6935929bdefe74d1258ca08048f0aafa3

  • 引入 'bbsink' 抽象以模块化基础备份代码。基础备份代码多年来积累了大量新功能,但由于没有真正的关注点分离,维护和进一步增强该代码变得越来越困难。例如,了解如何使用 libpq 协议向客户端发送数据的详细信息的代码分散在 basebackup.c 各处,而不是集中在一个地方。 为了改善这种情况,引入了一个新的 'bbsink' 对象,作为基础备份进程中生成的归档以及备份清单的接收者。此提交引入了三种类型的 bbsink:'copytblspc' bbsink 使用每个表空间一个 COPY OUT 操作和另一个用于清单将备份转发到客户端,'progress' bbsink 执行命令进度报告,'throttle' bbsink 执行速率限制。'progress' 和 'throttle' bbsink 类型还将数据转发给后继 bbsink;目前,链中的最后一个 bbsink 始终是 'copytblspc' 类型。计划在未来的提交中添加更多类型的 'bbsink'。 这个抽象在进度报告方面有点泄漏,但这仍然比我们之前的方式更清洁。 由我编写补丁,由 Andres Freund、Sumanta Mukherjee、Dilip Kumar、Suraj Kharage、Dipesh Pandit、Tushar Ahuja、Mark Dilger 和 Jeevan Ladhe 审查和测试。 讨论: https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 讨论: https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bef47ff85df18bf4a3a9b13bd2a54820e27f3614

  • 引入 'bbstreamer' 抽象以模块化 pg_basebackup。pg_basebackup 知道如何对从服务器获取的备份做很多事情,比如直接写出文件,或先压缩它们,甚至解析 tar 格式并将修改后的 postgresql.auto.conf 文件注入到服务器生成的归档中。不幸的是,这使得 pg_basebackup.c 成为一个非常大的源文件,而且也有些难以增强,因为例如服务器发送给我们的是 'tar' 文件而不是其他类型归档的知识分散在各处而不是集中管理。 为了改善这种情况,此提交发明了一个新的 'bbstreamer' 抽象。从服务器接收的每个归档都被馈送到一个 bbstreamer,后者可以选择处理它或将其传递给其他某个 bbstreamer。块也可以根据它们是归档中文件的载荷数据还是归档元数据的一部分来"标记"。 因此,例如,如果我们想获取一个 tar 文件,修改它包含的 postgresql.auto.conf 文件,然后 gzip 结果并写出,我们可以使用 bbstreamer_tar_parser 解析从服务器接收的 tar 文件,bbstreamer_recovery_injector 修改 postgresql.auto.conf 的内容,bbstreamer_tar_archiver 用为前一步中修改的文件新构建的正确 tar 头替换 tar 头,以及 bbstreamer_gzip_writer 对结果数据进行 gzip 并写入。只有名称中包含"tar"的对象知道 tar 归档格式的任何信息,理论上如果有人想编写代码,我们可以使用其他格式而不是"tar"重新归档。 这些更改确实添加了大量代码,但我认为结果在可维护性和可扩展性方面好得多。pg_basebackup.c 本身缩减了大约三分之一,之前包含在其中的很多复杂性移到了新添加的文件中。 由我编写补丁。包含此补丁的更大补丁系列在不同时间由 Andres Freund、Sumanta Mukherjee、Dilip Kumar、Suraj Kharage、Dipesh Pandit、Tushar Ahuja、Mark Dilger、Sergei Kornilov 和 Jeevan Ladhe 审查和测试。 讨论: https://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com 讨论: https://postgr.es/m/CA+TgmoZvqk7UuzxsX1xjJRmMGkqoUGYTZLDCH8SmU1xTPr1Xig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/23a1c6578c87fca0e361c4f5f9a07df5ae1f9858

  • 不要在没有理由时设置 ThisTimeLineID。在 slotfuncs.c 中,pg_replication_slot_advance() 需要确定槽应该推进到的 LSN,但这并不要求我们更新 ThisTimeLineID,因为此处调用的代码都不依赖于它。如果复制槽是逻辑的,pg_logical_replication_slot_advance 将调用 read_local_xlog_page,它确实使用 ThisTimeLineID,但也会确保它是最新的。如果复制槽是物理的,时间线根本不用于任何事情。 在 logicalfuncs.c 中,pg_logical_slot_get_changes_guts() 有相同的问题:我们将要运行的关心时间线的唯一代码在 read_local_xlog_page 中或其下游,它已经确保设置了正确的值。因此,不要在这里做。 由我编写补丁,由 Michael Paquier、Amul Sul 和 Álvaro Herrera 审查和测试。 讨论: https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/caf1f675b88d1aa67ea3fb642e8f38b470cc911e

  • 移除 xlog.c 之外所有对 ThisTimeLineID 全局变量的使用。所有此类代码以三种方式之一处理此全局变量。有时同一函数同时以多种方式使用它。 首先,有时它是 xlog.c 或其他地方调用的一个或多个函数的隐式参数,必须在调用这些函数之前设置为适当的值,否则它们会出现问题。在这些情况下,现在改为作为显式参数传递。 其次,有时它用于在恢复结束后获取当前时间线,即正在写入和刷新 WAL 的时间线。此类代码现在调用 GetWALInsertionTimeLine() 或依赖于添加到 GetFlushRecPtr() 的新输出参数。 第三,有时在恢复期间用于存储当前重放时间线。这可能会改变,因此此类代码通常必须在每次使用前更新该值。它仍然可以这样做,但现在必须使用局部变量。 这些更改的净效果是大幅减少了直接访问此全局变量的代码量。这是好事,因为历史表明,我们并不总是清楚地考虑在任何给定时间点它应该包含哪个时间线 ID,或者实际上它是否在代码中的任何给定点已经或需要被初始化。 由我编写补丁,由 Michael Paquier、Amul Sul 和 Álvaro Herrera 审查和测试。 讨论: https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e997a0c642860a96df0151cbeccfecbdf0450d08

  • 将 ThisTimeLineID 从全局变量更改为局部变量。StartupXLOG() 仍然将 ThisTimeLineID 作为局部变量,但 xlog.c 中的其余代码现在需要通过其他方式获取相关的 TimeLineID。大多数情况下,这意味着我们现在将其作为函数参数传递给以前不需要的许多函数。但是,一些情况需要特殊处理: - 对于可能被不一定知道应指定哪个时间线的外部调用者调用的函数,我们从共享内存获取时间线 ID。在大多数情况下可以使用 XLogCtl->ThisTimeLineID,因为在调用这些函数时已知恢复已完成。在 xlog_redo() 中,我们可以使用 XLogCtl->replayEndTLI。 - XLogFileClose() 需要知道打开的日志文件的 TLI。使用新的全局变量 openLogTLI 来做到这一点。虽然有人可能认为这只是用一个全局变量换另一个,但新变量的用途要窄得多,仅在几个地方被引用。 - read_backup_label() 现在返回它通过解析 backup_label 文件获得的 TLI。此前,可以在 ThisTimeLineID 未被初始化的情况下调用 ReadRecord() 来解析检查点记录。现在,时间线被传递下去,我不想传递未初始化的变量;这个更改让我们避免了这种情况。旧的编码似乎没有我们需要担心的实际后果,但这样做更清洁。 - 在 BootstrapXLOG() 中,它只是一个常量。 由我编写补丁,由 Michael Paquier、Amul Sul 和 Álvaro Herrera 审查和测试。 讨论: https://postgr.es/m/CA+TgmobfAAqhfWa1kaFBBFvX+5CjM=7TE=n4r4Q1o2bjbGYBpA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/4a92a1c3d1c361ffb031ed05bf65b801241d7cdd

  • 移除 bd807be6935929bdefe74d1258ca08048f0aafa3 添加的测试。构建农场不满意。目前还不清楚它为什么不喜欢这些测试,但让我们先移除它们,直到我们弄清楚。 讨论: http://postgr.es/m/462618.1636171009@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/ccf289745d3e50360653181dce6a277a1fc79730

Tomáš Vondra 推送了:

Alexander Korotkov 推送了:

Andres Freund 推送了: