PostgreSQL 14 Release Candidate 1 已发布。 快来测试!
JDBC 42.2.24 已发布 https://jdbc.postgresql.ac.cn/documentation/changelog.html#version_42.2.24
check_pgbackrest 2.1 (一个兼容 Nagios 的 pgBackRest 监控工具) 已发布。 https://github.com/dalibo/check_pgbackrest/releases
sqlite_fdw 2.1.0 已发布。
https://archives.postgresql.org/pgsql-jobs/2021-09/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Tomáš Vondra 提交了
不允许在系统列上使用扩展统计信息。自引入扩展统计信息以来,我们一直禁止引用系统列。因此,例如 CREATE STATISTICS s ON ctid FROM t; 会失败。但对于表达式上的扩展统计信息,可以很容易地绕过此限制 CREATE STATISTICS s ON (ctid::text) FROM t; 这是 a4d75c86bf 中的一个疏忽,通过添加一个简单的检查来修复。向 PostgreSQL 14 回溯,其中引入了对表达式上扩展统计信息的支持。回溯至:14 讨论:https://postgr.es/m/20210816013255.GS10479%40telsasoft.com https://git.postgresql.org/pg/commitdiff/c9eeef2a15c02ff7dd2bf3251dbee925b050fc0f
在构建每个统计信息对象后释放内存。到目前为止,给定关系上的所有扩展统计信息都在同一个内存上下文中构建,而没有重置。一些内存被显式释放,但并非全部——例如,在 detoasting 值时分配的内存很难释放。自 PostgreSQL 10 引入扩展统计信息以来,它一直是这样工作的,但增加了对表达式上扩展统计信息的支持使得问题稍微恶化,因为它增加了要构建的统计信息的数量。通过添加一个在构建每个统计信息对象(其中包含的所有统计信息种类)后重置的内存上下文来解决。在构建每种统计信息后重置它会更好,但这需要更具侵入性的更改和结果的复制,使其更难回溯。向 PostgreSQL 10 回溯,其中引入了扩展统计信息。作者:Justin Pryzby 报告者:Justin Pryzby 审阅者:Tomas Vondra 回溯至:10 讨论:https://postgresql.ac.cn/message-id/20210915200928.GP831%40telsasoft.com https://git.postgresql.org/pg/commitdiff/83772cc78e0392a247231ba510c61b6612b93b3f
释放 dependency_degree 分配的内存。计算函数依赖的度可能会分配大量内存——我们已经释放了大部分显式分配的内存,但例如 detoasted varlena 值却被遗留下来。这可能是一个问题,因为我们考虑了很多依赖关系(所有组合),并且 detoasting 可能需要为每个依赖关系重新进行。通过在专用上下文中调用 dependency_degree() 并在每次调用后重置它来解决。我们只需要计算出的依赖度,所以不需要复制任何东西。向 PostgreSQL 10 回溯,其中引入了扩展统计信息。回溯至:10 讨论:https://postgresql.ac.cn/message-id/20210915200928.GP831%40telsasoft.com https://git.postgresql.org/pg/commitdiff/ad8a166ca86846ab691bd6dafc695e0f7dd96012
Tom Lane 提交
文档:对“格式化”部分进行小的改进。添加指向源代码树的更具体的链接。 https://git.postgresql.org/pg/commitdiff/5577cd571ad3528471152f68636ac03c80576977
修复 plpgsql 中 CALL 语句内 STABLE 参数的错误评估。在 commit 84f5c2908 之前,plpgsql CALL 语句参数列表中的 STABLE 函数会看到一个最新的快照,因为 exec_stmt_call 会推送一个新的快照。我将此移除,因为快照在 COMMIT 中消失的可能性使得跨 CALL 语句管理快照变得过于困难。对于过程本身来说,这没关系,但我忘记了考虑 CALL 参数列表内的 STABLE 函数的可能性。目前,这些函数将使用 Portal 的快照作为 ActiveSnapshot 执行,使它们无法看到比 Portal 启动更新的更新。(VOLATILE 函数没有问题,因为它们会获取自己的快照;这实际上也是为什么过程本身没有问题的原因。没有 STABLE 的过程。)我们可以通过在 ExecuteCallStmt 本身内暂时推送一个新快照来解决此问题。在进入过程主体之前弹出快照消除了管理问题。可能无用的额外快照获取有点令人恼火,但它并不比 84f5c2908 之前的行为更糟。根据 Alexander Nawratil 的 bug #17199。回溯到 v11,与之前的补丁相同。讨论:https://postgr.es/m/17199-1ab2561f0d94af92@postgresql.org https://git.postgresql.org/pg/commitdiff/4476bcb8773b306b9ca84bf2fadcf30acfa2c687
文档:扩展关于 postgres_fdw 中 collation 匹配风险的警告。对远程 collation 与本地 collation 不匹配的风险进行更明确的说明。实际上修复这些风险似乎很困难,我已经放弃了它可能可以回溯的想法。因此,对于回溯分支,我们所能做的最好的就是添加文档。根据 Jiří Fejfar 的 bug #16583 的讨论。讨论:https://postgr.es/m/2438715.1632510693@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7b0be9fb2dddb214db2bed0e137b9b42c1479455
避免 interval_cmp_value() 中的不必要除法。将时间字段拆分为天和微秒,当我们只是要重新组合这些值时,这是相当无用的。在实际情况中,是否有人会注意到速度提升尚不清楚,但节省的周期就是赚到的周期。讨论:https://postgr.es/m/2629129.1632675713@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/e94c1a55dada49772622d2be2d17a2a9973b2661
Álvaro Herrera 提交
文档:为“辅助进程”添加术语表条目。也为现有未记录的进程添加条目,并调整现有定义以保持一致。根据 Bharath Rupireddy 的提问。作者:Justin Pryzby pryzby@telsasoft.com 作者:Alvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/CALj2ACVpYCT0M+k8zqrAa4ZQZV+ce5s6G=yajwoS1m=h-jj8NQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/d3014fff4cd4dcaf4b2764d96ad038f3be7413b0
更好地记录 XLOG_INCLUDE_XID。我注意到 commit 0bead9af484c 在 XLogSetRecordFlags 中留下了这个标志未记录,这导致我发现该标志实际上并没有起到它所说的作用(只有一个注释)。通过添加更多注释来改善情况。回溯到 14,其中出现了上述 commit。作者:Álvaro Herrera alvherre@alvh.no-ip.org 讨论:https://postgr.es/m/202109212119.c3nhfp64t2ql@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/ade24dab97a20dae74fb57c0106dfe0e0303541b
Andres Freund 提交
pgstat:将 relation 统计信息处理从 AtEO[Sub]Xact_PgStat() 等函数中拆分出来。即将进行的补丁将为这些函数添加额外的工作。为了避免函数变得过于复杂/一次做太多事情,将子任务拆分到自己的函数中。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/e1f958d759ff71a264973d13e9bc86c7db822928
pgstat:为被丢弃的 rels 准备使用截断 rels 的机制。即将到来的共享内存统计补丁将以事务性的方式丢弃已删除对象的统计信息,而不是稍后在 vacuum 过程中删除它们。这意味着事务中 DROP 的统计信息需要像 TRUNCATE 一样处理已中止(子)事务:应恢复到 DROP 的统计信息。为此重命名现有基础设施。作者:Andres Freund andres@anarazel.de 讨论:https://postgr.es/m/20210405092914.mmxqe7j56lsjfsej@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/6b9501660c9384476ca9a04918f5cf94379e419e
Peter Geoghegan 提交
移除过度索引删除断言。一个损坏的 HOT 链并非异常情况,即使偏移量指向了页面行指针数组的末尾之外。heap_prune_chain() 并不(也从未)将此情况视为异常,因此 heap_index_delete_tuples() 中的派生代码也不应该这样做。commit 4228817449 中的疏忽。此断言可能只在 Postgres 14 和 master 上失败。早期版本没有 commit 3c3b8a4b,该 commit 指导 VACUUM 截断堆页的行指针数组。但仍将回溯,以保持一致。作者:Peter Geoghegan pg@bowt.ie 报告者:Alexander Lakhin exclusion@gmail.com 讨论:https://postgr.es/m/17197-9438f31f46705182@postgresql.org 回溯:12-,与 commit 4228817449 相同。https://git.postgresql.org/pg/commitdiff/5e6716cde5749aea506dd3f30b099b6e9b4c5af8
修复“单一值策略”索引删除问题。当由自底向上的索引删除通道触发时,重复数据删除不应应用单一值策略。这会浪费周期,因为后来的自底向上删除通道将过度解释重复数据删除实际上“按设计”跳过的旧重复元组。它还使得自底向上删除对于那些恰好越过无意义的“索引每叶页面具有单个键值”阈值的低基数索引效果大大降低。为了解决这个问题,稍微缩小了考虑重复数据删除单一值策略的条件。我们已经避免了对唯一索引使用该策略,因为我们的首要目标必须是为 VACUUM 运行争取时间(而不是节省空间)。现在,当我们在自底向上通道报告失败时,我们也将避免使用它。这两种情况共享相同的首要目标,并且已经重叠很多,所以这种方法非常自然。commit d168b666(添加了自底向上索引删除)中的疏忽。作者:Peter Geoghegan pg@bowt.ie 讨论:https://postgr.es/m/CAH2-WznaOvM+Gyj-JQ0X=JxoMDxctDTYjiEuETdAGbF5EUc3MA@mail.gmail.com 回溯:14-,其中引入了自底向上删除。https://git.postgresql.org/pg/commitdiff/dd94c2852e6e3a246b9fd64bf2d9c7fc01020905
记录 heapam 行指针截断问题。在 commit 3c3b8a4b 之前,检查偏移量是否超过堆页面行指针数组的末尾只是 HOT 链遍历代码的一个防御性健全性检查。但现在它是严格必需的。向 heapam 中需要正确处理此问题的代码添加引用该问题的注释。根据 Alexander Lakhin 的建议。讨论:https://postgr.es/m/f76a292c-9170-1aef-91a0-59d9443b99a3@gmail.com https://git.postgresql.org/pg/commitdiff/c7aeb775df895db240dcd6f47242f7e08899adfb
nbtree README:添加关于 latestRemovedXid 的注释。指出索引元组删除通常需要 latestRemovedXid 值用于删除操作的 WAL 记录。这无疑是整个删除操作中最昂贵的部分,因为它现在发生在索引删除的初始执行期间。这可以说是 commit 558a9165e08 中的一个疏忽,该 commit 将生成这些值所需的工作从索引删除 REDO 例程移到了索引删除操作的初始执行。 https://git.postgresql.org/pg/commitdiff/48064a8d330db259076fb7b2300544fbf65f4109
vacuumlazy.c:移除过时的 'onecall' 注释。移除对 lazy_vacuum() 的 onecall 参数的过时引用。该函数参数已由 commit 3499df0dee 移除。还移除相邻的介绍 wraparound failsafe 概念的注释块。现在在此处讨论 failsafe 没有意义,因为 lazy_vacuum()(及其相关函数)不再是 failsafe 可能被触发的唯一地方。自 commit c242baa4a8 教会 VACUUM 在其初始堆扫描期间考虑触发 failsafe 机制以来,情况一直是这样。https://git.postgresql.org/pg/commitdiff/c1a47dfe2e9f814e61377f47aa79a113a4c73a63
更新过时的 nbtree 删除注释。_bt_delitems_delete() 不再是索引元组删除(由设置了 LP_DEAD 位的索引元组驱动,现在称为“简单索引元组删除”)使用的高层入口点。它现在是一个低层例程,仅在 commit d168b66682 之后由 _bt_delitems_delete_check() 调用。https://git.postgresql.org/pg/commitdiff/ce2a86053380f7e82dc8318ac48a22a7ab266398
Michaël Paquier 提交
引入 GUC shared_memory_size_in_huge_pages。这个运行时计算的 GUC 显示了服务器主共享内存区域所需的 huge pages 数量,它利用了 0c39c29 和 0bd305e 的工作成果。这对于用户估计服务器所需的 huge pages 数量非常有用,因为无需启动服务器并可能分配大量共享内存就可以进行估算。huge pages 的数量根据现有的 GUC huge_page_size(如果已设置)计算,或者通过查看 Linux 上的 /proc/meminfo 来使用系统的默认值。这里没有什么新的,因为此提交重用了现有的计算方法,只是直接向用户公开了此信息。用于计算 huge page 大小的例程被重构,以限制包含平台特定标志的文件数量。此新 GUC 的名称是基于讨论中最受欢迎的选择。这仅在 Linux 上受支持。我花时间在 Linux、Windows 和 MacOS 上测试了此更改,尽管后两者不支持大页面。前者根据现有的 GUC huge_page_size 或系统默认值正确计算了页面数量。感谢 Andres Freund、Robert Haas、Kyotaro Horiguchi、Tom Lane、Justin Pryzby(以及在此过程中被遗忘的任何人)的讨论。作者:Nathan Bossart 讨论:https://postgr.es/m/F2772387-CE0F-46BF-B5F1-CC55516EB885@amazon.com https://git.postgresql.org/pg/commitdiff/43c1c4f65eab77bcfc4f535a7e9ac0421e0cf2a5
修复 TestLib.pm 中需要适配 Msys perl 输出的地方。与原生 perl 的输出相反,Msys perl 生成的输出包含 CRLF 字符。TAP 代码中已经有一些地方会自动将 CRLF (\r\n) 转换为 Msys 上的 LF (\n),但在运行命令并使用其输出进行比较时,我们忽略了几个地方,这会导致失败。通过使用 TestLib::command_checks_all() 添加的测试,在 Msys 上找到了此问题,但在仔细查看后,更多代码路径缺少过滤器。此更改将回溯到最远的版本,以防止在稳定分支中引入新测试时出现任何意外。审阅者:Andrew Dunstan、Álvaro Herrera 讨论:https://postgr.es/m/1252480.1631829409@sss.pgh.pa.us 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/0d91c52a8fc71bfe5664a13368e42e1dabc5fe78
修复 postgres -C 的 TAP 测试中的一些问题。这解决了在 0c39c292 中为运行时 GUC 添加的测试中的两个问题:- 在 Msys 上重新启用测试。由于 Msys perl 生成的 \r\n,测试可能会失败。0d91c52a 已处理此问题。- 允许测试在特权账户的上下文中运行。根据 Andres Freund 的报告,在特权账户下运行的 CI 会因权限失败而失败。通过将 postgres 命令包装在 pg_ctl 中来解决此问题,因为后者将处理任何所需的权限。移除了检查运行实例时对运行时参数使用 postgres -C 失败的测试,因为 pg_ctl 会产生不稳定的错误代码(CI 不需要复现)。讨论:https://postgr.es/m/20210921032040.lyl4lcax37aedx2x@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/1a9d802828110c87a207785aaf6b00d8917a86ad
doc:在 CREATE EVENT TRIGGER 页面中添加缺失的标记。报告者:rir 讨论:https://postgr.es/m/20210924183658.3syyitp3yuxjv2fp@localhost 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/1ab70b11e6425c955c24aa301188de32356bebb8
doc:改进关于 GUCs 的索引 vacuuming 的描述。根据 maintenance_work_mem 的值,索引 vacuum 可能会发生多次,以存储死元组,用于手动 VACUUM。对于 autovacuum,如果设置了 autovacuum_work_mem,则由其控制。文档提到了前者,但在 autovacuum 的上下文中未提及后者。报告者:Nikolai Berkoff 作者:Laurenz Albe、Euler Taveira 讨论:https://postgr.es/m/161545365522.10134.12195402324485546870@wrigleys.postgresql.org 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/1ba841072ebeb1a6605395950a51c869de42a104
修复文档中的拼写错误。作者:Justin Pryzby 讨论:https://postgr.es/m/20210924215827.GS831@telsasoft.com 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/7c1d8a243f8bd46604c9b292f392aab170eed821
Amit Kapila 提交
在 reorderbuffer.c 的错误中添加父表名称。这有助于排查解码过程中可能发生的特定错误的根本原因。作者:Jeremy Schneider 审阅者:Amit Kapila 讨论:https://postgr.es/m/808ed65b-994c-915a-361c-577f088b837f@amazon.com https://git.postgresql.org/pg/commitdiff/5e77625b260a781316bb94ea9750dc66c50152bf
在 publication 中使分区表的所有分区失效。即使在父表被添加到 publication 后,对分区的更新/删除也允许在没有 replica identity 的情况下进行。这后来会导致订阅者出错。原因是,我们没有使分区的 relcache 失效,并且分区的 publication 信息没有被重新构建。同样,在从 publication 中删除分区表后,我们也没有使分区的 relcache 失效,这将禁止对其分区进行更新/删除,即使没有 publication 也可以,但需要 replica identity。报告者:Haiying Tang 作者:Hou Zhijie 和 Vignesh C 审阅者:Vignesh C 和 Amit Kapila 回溯至:13 讨论:https://postgr.es/m/OS0PR01MB6113D77F583C922F1CEAA1C3FBD29@OS0PR01MB6113.jpnprd01.prod.outlook.com https://git.postgresql.org/pg/commitdiff/4548c76738b368a11a5dad052f9653a349eeb52c
Peter Eisentraut 提交
使用 PG_INT64_MAX/PG_INT64_MIN。这段代码是在这些符号引入之前编写的,但现在我们可以简化它。https://git.postgresql.org/pg/commitdiff/f9ea2960310c235a7ae97847c0757eba9f6f9a85
添加缺失的 $Test::Builder::Level 设置。其中一个被 c50624c 意外移除。其他则根据类比添加。讨论:https://postgresql.ac.cn/message-id/ae1143fb-455c-c80f-ed66-78d45bd93303@enterprisedb.com https://git.postgresql.org/pg/commitdiff/73aa5e0cafd0d577fe464ed1d9ac317103f27ea4
Fujii Masao 提交
Alexander Korotkov 提交了
John Naylor 提交了
向 cpluspluscheck 添加 unicode_east_asian_fw_table.h 的例外。unicode_east_asian_fw_table.h 不应像 unicode_combining_table.h 一样单独编译,但 cpluspluscheck 没有收到这个通知。bab982161 中的疏忽。根据 Tom Lane 的报告 https://git.postgresql.org/pg/commitdiff/a315b19cceeb2ccbe17c7ddd6e7c90911b325f9b
也向 headerscheck 添加 unicode_east_asian_fw_table.h 的例外。a315b19cc 的后续操作 https://git.postgresql.org/pg/commitdiff/88b0ae15bc099df6192a3b69b853f86fb015339a