万圣节快乐!
pg_statement_rollback v1.3,一个添加服务器端语句级回滚事务支持的扩展, 已发布。
https://archives.postgresql.org/pgsql-jobs/2021-10/
Planet PostgreSQL: https://planet.postgresql.org/
本周 PostgreSQL 每周新闻由 David Fetter 为您呈现
请于太平洋时间每周日下午3:00前将新闻和公告提交至 david@fetter.org。
Michaël Paquier 推送了:
添加复制命令 READ_REPLICATION_SLOT。该命令目前支持物理槽,并返回槽的类型、其 restart_lsn 和 restart_tli。这将对即将到来的与 pg_receivewal 相关的补丁有用,允许该工具从槽的位置开始流传输,而不是在归档目录为空时从后端刷新的最后 WAL 位置(如 IDENTIFY_SYSTEM 所报告的)开始,这在切换到不同归档位置并使用同一个槽以避免 WAL 段归档中出现空洞的情况下是一个优势。 作者:Ronan Dunklau 审查者:Kyotaro Horiguchi、Michael Paquier、Bharath Rupireddy 讨论: https://postgr.es/m/18708360.4lzOvYHigE@aivenronan https://git.postgresql.org/pg/commitdiff/b4ada4e19fd7bedb433e46516ccd0ca4213d2719
允许 pg_receivewal 从槽的 restart LSN 开始流传输。在此补丁之前,运行 pg_receivewal 时,如果在写入 WAL 段的本地目录中发现任何内容,流起始点将是归档的当前位置,如果没有归档,pg_receivewal 将回退到当前 WAL 刷新位置(作为 IDENTIFY_SYSTEM 命令的结果)。如果由于某种原因 pg_receivewal 的 WAL 文件被移动了,最好尝试从我们上次停止的地方重新启动,即复制槽的 restart_lsn,而不是直接跳到当前刷新位置,以避免备份的 WAL 中出现空洞。 此提交更改了 pg_receivewal,使用以下方法序列来确定起始流 LSN:- 扫描本地归档。- 如果后端支持且定义了槽,则使用槽的 restart_lsn。- 回退到 IDENTIFY_SYSTEM 报告的当前刷新 LSN。 为了保持与旧服务器版本的兼容性,我们仅在后端版本至少为 15 时才尝试使用 READ_REPLICATION_SLOT,如果不支持该命令,则回退到从当前刷新 LSN 流传输的旧行为。 添加了一些 TAP 测试来覆盖此功能。 作者:Ronan Dunklau 审查者:Kyotaro Horiguchi、Michael Paquier、Bharath Rupireddy 讨论: https://postgr.es/m/18708360.4lzOvYHigE@aivenronan https://git.postgresql.org/pg/commitdiff/f61e1dd2cee6b1a1da75c2bb0ca3bc72f18748c1
修复 READ_REPLICATION_SLOT 的 TAP 测试中过于宽松的正则表达式模式。检查槽不存在时的 NULL 输出的案例过于宽松,因为它对查询生成的任何输出都会通过。这修复了匹配模式,使其只匹配"||"。 b4ada4e 中的疏忽。 https://git.postgresql.org/pg/commitdiff/0db343dc13bc8657976c39ddbf7e0c7db8b2efff
文档:修复 pg_receivewal 页面的语法。由 f61e1dd 引入。 作者:Kyotaro Horiguchi 讨论: https://postgr.es/m/20211026.112304.1962954080884317968.horikyota.ntt@gmail.com https://git.postgresql.org/pg/commitdiff/8af09daf5629e9b85f37cc23983819b8ccd11b43
添加从模板数据库复制共享依赖关系的测试。正如 98ec35b 所证明的,该代码区域以前从未有过覆盖。此提交添加了一个新的 TAP 测试,其中模板数据库包含一小组复制到新数据库的共享依赖关系。该测试添加在 createdb 中,我们此前也从未测试过 -T 生成带有 TEMPLATE 的查询。 审查者:Tom Lane 讨论: https://postgr.es/m/YXDTl+PfSnqmbbkE@paquier.xyz https://git.postgresql.org/pg/commitdiff/70bfc5ae537c8bfeed4849b7d9f814de89a155fe
文档:修复 sepgsql 页面中指向 SELinux 用户指南的链接。 报告者:Anton Voloshin 讨论: https://postgr.es/m/15a86d4e-a237-1acd-18a2-fd69730f1ab9@postgrespro.ru 回溯移植至:10 https://git.postgresql.org/pg/commitdiff/cc1853b30048307d93f8aa30f4d64f88b527f04d
为 archive_cleanup_command 和 recovery_end_command 添加 TAP 测试。这添加了检查这两个命令执行情况的测试。恢复测试 002_archiving.pl 很适合用于此目的,因为其中已经触发了两次提升(promotion),而且即使这些命令中的任何一个失败,它们也不会影响恢复或提升。 命令成功通过"echo"命令生成的文件来检查,该命令应该能在所有构建农场环境中工作,甚至包括 Msys(但我们很快就会知道)。命令失败使用指向不存在路径的"echo"命令来测试,扫描后端日志以确保失败发生。两者都依赖于后端从数据文件夹的根目录触发命令,使其逻辑更健壮。 感谢 Neha Sharma 在 Windows 上的额外测试。 作者:Amul Sul、Michael Paquier 审查者:Andres Freund、Euler Taveira 讨论: https://postgr.es/m/CAAJ_b95R_c4T5moq30qsybSU=eDzDHm=4SPiAWaiMWc2OW7=1Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/46dea2419ee7895a4eb3d048317682e6f18a17e1
加速 pg_receivewal 的 TAP 测试。此提交通过一些简单的方法减少 pg_receivewal 写入的数据量,将这些测试的速度提高了 25~30%:- 使用 1MB 的段大小。在减少 pg_receivewal 为新段清零的数据量的同时,这改善了非默认段大小的代码覆盖率。- 在涉及槽的 restart_lsn 的最后一个测试中,生成一个检查点以推进 redo LSN 和槽保留的 WAL,减少需要归档的段数。这占了大部分收益。- 最小化插入到虚拟表中的数据量。 审查者:Ronan Dunklau 讨论: https://postgr.es/m/YXqYKAdVEqmyTltK@paquier.xyz https://git.postgresql.org/pg/commitdiff/d680992af5406245f769b697fbb4e130e6220664
Heikki Linnakangas 推送了:
Robert Haas 推送了:
StartupXLOG:在 XLogReportParameters 之后调用 CleanupAfterArchiveRecovery。这在将相关操作分组在一起方面做得更好,因为我们在允许 WAL 写入之前需要写入的所有 WAL 记录通常由一段不间断的代码编写。 由于 CleanupAfterArchiveRecovery() 只是 (1) 运行 recovery_end_command,(2) 删除非父 xlog 文件,和 (3) 归档任何最终的部分段,这应该是安全的,因为所有这些都与 XLogReportParameters() 写入的 WAL 记录基本无关。 Amul Sul,根据我的建议 讨论: http://postgr.es/m/CAAJ_b97fysj6sRSQEfOHj-y8Jfd5uPqOgO74qast89B4WfD+TA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/a75dbf7f9ee6ff0c0e2ab4b224b04fc50c4e6577
StartupXLOG:不要反复禁用/启用本地 xlog 插入。所有在 WAL 写入被普遍允许之前在启动进程中运行以写入 WAL 记录的代码现在是连续的,所以没有理由关闭本地写入 WAL 的功能然后连续三次重新打开它。 不幸的是,这需要在 checkpointer 中做一个小的变通,它需要单独启用 WAL 写入以写入检查点记录。因为如果我们在单用户模式下,该代码可能在与 StartupXLOG() 相同的进程中运行,我们必须保存/恢复 LocalXLogInsertAllowed 标志的状态。希望我们能在进一步重构中消除这个不足,但它无论如何也不太严重。 Amul Sul,由我修改。 讨论: http://postgr.es/m/CAAJ_b97fysj6sRSQEfOHj-y8Jfd5uPqOgO74qast89B4WfD+TA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/18e0913a420349d373cfd8e45b91b4777501fb74
移除 CreateReplicationSlot 中无用的代码。根据注释,我们在这里为 WalSndSegmentOpen 的利益初始化 sendTimeLineIsHistoric 和 sendTimeLine。然而,这种情况发生的唯一途径是 logical_read_xlog_page 调用 WALRead。由于 logical_read_xlog_page 在内部初始化了相同的全局变量,我们不需要也在这里做。 这些初始化自提交 858ec11858a914d4c380971985709b6d6b7dd6fc 引入复制槽以来就存在。当时它们也肯定是无用的,因为逻辑解码那时还不存在,而物理复制在创建槽时不检查任何 WAL。我没有检查所有中间版本,但我怀疑这段代码从来没有做过任何有用的事情。 为减少未来的混淆,删除该代码。由于没有功能缺陷,不进行回溯移植。 讨论: http://postgr.es/m/CA+TgmobSWzacEs+r6C-7DrOPDHoDar4i9gzxB3SCBr5qjnLmVQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/902a2c280012557b85c7e0fce3f6f0e355cb2d69
添加 enable_timeout_every() 以重复触发同一超时。enable_timeout_at() 和 enable_timeout_after() 仍可用于只触发一次超时的情况。 由我编写补丁,根据 Tom Lane 的建议。 讨论: http://postgr.es/m/2992585.1632938816@sss.pgh.pa.us 讨论: http://postgr.es/m/CA+TgmoYqSF5sCNrgTom9r3Nh=at4WmYFD=gsV-omStZ60S0ZUQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/732e6677a667c03b1551a855e3216644b0f125ec
报告耗时较长的启动操作的进度。用户有时会在启动服务器后看到它发出几条消息然后长时间不再发出任何消息时感到担忧。通常情况下,要么是系统花了很长时间应用 WAL,要么是花了很长时间重置非日志关系,要么是花了很长时间 fsync 数据目录,但不容易判断是哪种情况。 为了解决这个问题,添加了一个新的 'log_startup_progress_interval' 设置,默认为 10 秒。当已知可能耗时较长的操作花费超过此时间时,我们将在每次此间隔过去时记录一条状态更新。 为避免不必要的日志噪音,在备机模式下不记录任何有关 WAL 重放的信息。 Nitin Jadhav 和 Robert Haas,由 Amul Sul、Bharath Rupireddy、Justin Pryzby、Michael Paquier 和 Álvaro Herrera 审查。 讨论: https://postgr.es/m/CA+TgmoaHQrgDFOBwgY16XCoMtXxsrVGFB2jNCvb7-ubuEe1MGg@mail.gmail.com 讨论: https://postgr.es/m/CAMm1aWaHF7VE69572_OLQ+MgpT5RUiUDgF1x5RrtkJBLdpRj3Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9ce346eabf350a130bba46be3f8c50ba28506969
初始化变量以安抚编译器。 根据 Nathan Bossart。 讨论: http://postgr.es/m/FECEE7FC-CB74-45A9-BB24-89FEE52A9585@amazon.com https://git.postgresql.org/pg/commitdiff/a030a0c5ccb113ccd09d0f0b82f1edb5e49ed607
在获取基础备份的 WAL 时,使用合理的 TLI 报告错误。之前的代码使用 ThisTimeLineID,它在这里甚至不一定被初始化,尽管在实践中通常是的,因为 pg_basebackup 在调用 BASE_BACKUP 之前发出 IDENTIFY_SYSTEM,这作为副作用初始化了 ThisTimeLineID。但这并不够好,不仅因为我们不应该依赖这样的副作用,而且因为 TLI 可能在此期间发生变化。幸运的是,我们可以方便地访问更有意义的 TLI 值,所以改用那些。 由于此逻辑的编码方式,在这里使用可能不正确的 TLI 的后果不过是稍微令人困惑的错误消息,我不想在这里冒任何风险,所以至少目前不回溯移植。 由我编写补丁,由 Kyotaro Horiguchi 和 Michael Paquier 审查 讨论: http://postgr.es/m/CA+TgmoZRNWGWYDX9RgTXMG6_nwSdB=PB-PPRUbvMUTGfmL2sHQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/2f5c4397c39dea49c5608ba583868e26d767fc32
修复启动进度报告中的竞态条件。提交 9ce346eabf350a130bba46be3f8c50ba28506969 添加了启动进度报告,但 begin_startup_progress_phase 存在竞态条件:前一阶段的超时可能在我们为下一阶段重新调度中断之前触发。 为避免竞态,先禁用超时,清除标志,然后重新启用超时。 由我编写补丁,由 Nitin Jadhav 审查。 讨论: https://postgr.es/m/CA+TgmoYq38i6iAzfRLVxA6Cm+wMCf4WM8wC3o_a+X_JvWC8bJg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5ccceb2946d4104804f8dca67515b602f5e78cdd
Thomas Munro 推送了:
Daniel Gustafsson 推送了:
确保槽在使用前被清零。之前的代码依赖于其他地方将槽的内存清零,虽然在这种情况下确实如此,但这不是一个保证成立的契约。显式清除 tts_isnull 数组以确保槽从已知状态填充。 回溯移植到 v14,引入目录多行插入的版本。 审查者:Michael Paquier michael@paquier.xyz 讨论: https://postgr.es/m/CAJ7c6TP0AowkUgNL6zcAK-s5HYsVHVBRWfu69FRubPpfwZGM9A@mail.gmail.com 回溯移植至:14 https://git.postgresql.org/pg/commitdiff/e63ce9e8d6ac8dced20592c4134004640f9f5644
修复 src/test/ssl 目标的 VPATH 构建。提交 b4c4a00ea 将 sslfiles 目标的核心部分重构到一个单独的 makefile 中,以覆盖 Makefile.global 中的设置。然而,此文件的调用没有包含 VPATH 构建的绝对路径,导致"make clean"失败。 修复方式是提供新 makefile 的路径。 报告者:Andres Freund andres@anarazel.de 讨论: https://postgr.es/m/20211026174152.jjcagswnbhxu7uqz@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/349cd8c582a1e666c9c804850cf5b532b86cd1b4
修复注释中的拼写错误。 作者:Peter Smith smithpb2250@gmail.com 讨论: https://postgr.es/m/CAHut+PsN_gmKu-KfeEb9NDARoTPbs4AN4PPu=6LZXFZRJ13SEw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8af57ad81578f825ac8c46840c841833db205106
Fujii Masao 推送了:
Jeff Davis 推送了:
允许 GRANT pg_log_backend_memory_contexts()。移除超级用户检查,允许任何被授予 pg_log_backend_memory_contexts() 权限的用户记录任何后端的内存上下文。 注意,这可能允许特权非超级用户记录超级用户后端的内存上下文,但正如所讨论的,这似乎不是一个问题。 审查者:Nathan Bossart、Bharath Rupireddy、Michael Paquier、Kyotaro Horiguchi、Andres Freund 讨论: https://postgr.es/m/e5cf6684d17c8d1ef4904ae248605ccd6da03e72.camel@j-davis.com https://git.postgresql.org/pg/commitdiff/f0b051e322d530a340e62f2ae16d99acdbcb3d05
将内存视图授予 pg_read_all_stats。将视图 pg_backend_memory_contexts 和 pg_shmem_allocations 的权限授予角色 pg_read_all_stats。同时授予这些视图依赖的底层函数的权限。 作者:Bharath Rupireddy bharath.rupireddyforpostgres@gmail.com 审查者:Nathan Bossart bossartn@amazon.com 讨论: https://postgr.es/m/CALj2ACWAZo3Ar_EVsn2Zf9irG+hYK3cmh1KWhZS_Od45nd01RA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/77ea4f94393eb4a16df32b573bf053bedaef2e09
Amit Kapila 推送了:
允许发布模式中的表。在 Create/Alter Publication 中新增 "FOR ALL TABLES IN SCHEMA" 选项,允许指定一个或多个模式,其中的表由发布者选择以将数据发送给订阅者。新语法允许同时指定表和模式。例如:CREATE PUBLICATION pub1 FOR TABLE t1,t2,t3, ALL TABLES IN SCHEMA s1,s2; 或 ALTER PUBLICATION pub1 ADD TABLE t1,t2,t3, ALL TABLES IN SCHEMA s1,s2; 添加了新的系统表 "pg_publication_namespace",用于维护用户希望通过发布发布的模式。修改了输出插件(pgoutput),在关系属于模式发布的一部分时发布变更。 更新了 pg_dump 以识别和转储模式发布。更新了 \d 系列命令以显示模式发布,\dRp+ 变体现在如果有的话会显示关联的模式。 作者:Vignesh C、Hou Zhijie、Amit Kapila 语法建议者:Tom Lane、Alvaro Herrera 审查者:Greg Nancarrow、Masahiko Sawada、Hou Zhijie、Amit Kapila、Haiying Tang、Ajin Cherian、Rahila Syed、Bharath Rupireddy、Mark Dilger 测试者:Haiying Tang 讨论: https://www.postgresql.org/message-id/CALDaNm0OANxuJ6RXqwZsM1MSY4s19nuH3734j4a72etDwvBETQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5a2832465fd8984d089e8c44c094e6900d987fcd
为模式发布添加 TAP 测试。这为提交 5a2832465f("允许发布模式中的表")添加了额外的测试。这允许测试通过模式发布发布的表中的数据流传输。 作者:Vignesh C、Haiying Tang 审查者:Greg Nancarrow、Hou Zhijie、Amit Kapila 讨论: https://www.postgresql.org/message-id/CALDaNm0OANxuJ6RXqwZsM1MSY4s19nuH3734j4a72etDwvBETQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/6b0f6f79eef2168ce38a8ee99c3ed76e3df5d7ad
Magnus Hagander 推送了:
Peter Geoghegan 推送了:
进一步加固 nbtree posting split 代码。围绕 posting list split 代码添加更多防御性检查。这些检查应该比任何现有检查更早、更可靠地检测涉及重复表 TID 的损坏。 提交 8f72bbac 的后续。 讨论: https://postgr.es/m/CAH2-WzkrSY_kjyd1_M5xJK1uM0govJXMxPn8JUSvwcUOiHuWVw@mail.gmail.com 回溯移植:13-,引入 nbtree 去重的版本。 https://git.postgresql.org/pg/commitdiff/a5213adf3d351a31c5f5eae1a756a9d3555dc31c
修复 nbtree 错误消息中项目的排序。提交 a5213adf 中的疏忽。 回溯移植:13-,与提交 a5213adf 相同。 https://git.postgresql.org/pg/commitdiff/c2381b51049bad5dd1863ab1116b315bd7693b7c
移除过时的 nbtree LP_DEAD 项注释。_bt_findinsertloc() 上方讨论 LP_DEAD 项的注释现在已经不合时宜了。我们已经在同一注释块的更早位置讨论了索引元组删除。 提交 d168b666 中的疏忽。
https://git.postgresql.org/pg/commitdiff/4c6afd805b8db3492c8f409ecdba192d853fd571
将 heapam 中的 pg_unreachable() 降级为断言。提交 d168b66682 全面改造了索引删除,在对来自索引页面的堆 TID 进行排序的排序比较器末尾添加了一个 pg_unreachable()。这允许编译器应用假定索引 AM 中的堆 TID 必须始终唯一的优化。鉴于最近关于 Postgres 上索引中涉及重复 TID 的损坏报告,这现在似乎不是一个好主意。
Tom Lane 推送了:
改进 contrib/amcheck 对 CREATE INDEX CONCURRENTLY 的测试。提交 fdd965d07 和 3cd9c3b92 通过同时启动两个独立的 pgbench 运行来测试 CREATE INDEX CONCURRENTLY。这是为了让只有单个客户端线程运行 CREATE INDEX CONCURRENTLY,避免两个 CIC 之间的死锁。然而,有更好的方法,即使用咨询锁来防止并发 CIC。这样更好,部分因为测试代码更短、更可读,但主要是因为它自动调整启动适当数量的 CIC 相对于 INSERT 事务的比例。按照之前的提交,通常一半到四分之三的 CIC 事务是无意义的,因为 INSERT 事务已经停止了。 顺便移除了 background_pgbench,它是为支持这些测试而添加的,现在不再需要了。如果以后找到用途,我们可以把它加回来。 回溯移植到 v12;旧版 pgbench 缺少此方法所需的条件执行功能。 Tom Lane 和 Andrey Borodin 讨论: https://postgr.es/m/139687.1635277318@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7f580aa5d88a9b03d66fcb9a1d7c4fcd69d9e126
加速 snprintf.c 中整数的打印。由于唯一可能的除数是 8、10 和 16,用三个使用常量除数的副本替换除法循环不需要太多代码空间。在大多数机器上,除以常量比除以任意值的开销低得多。测试仅 snprintf("foo %d") 使用 9 位数值的微基准测试显示,对我(tgl)来说大约有 2 倍的加速。Postgres 的大部分内容对 snprintf 的速度不太依赖,因此在实际场景中效果几乎不可测量。不过,节省的周期就是赚到的周期。 Arjan van de Ven 讨论: https://postgr.es/m/40a4b32a-b841-4667-11b2-a0baedb12714@linux.intel.com 讨论: https://postgr.es/m/6e51c644-1b6d-956e-ac24-2d1b0541d532@linux.intel.com https://git.postgresql.org/pg/commitdiff/3c17926eedd51c4094db7c62f59950918044ab1c
将时区数据文件更新为 tzdata 2021e 版本。斐济、约旦、巴勒斯坦和萨摩亚的夏令时法律变更。巴巴多斯、库克群岛、圭亚那、纽埃、葡萄牙和汤加的历史更正。此外,Pacific/Enderbury 时区已重命名为 Pacific/Kanton。以下时区已合并到附近、人口更多的时区中,这些时区的时钟自 1970 年以来一直一致:Africa/Accra、America/Atikokan、America/Blanc-Sablon、America/Creston、America/Curacao、America/Nassau、America/Port_of_Spain、Antarctica/DumontDUrville 和 Antarctica/Syowa。 https://git.postgresql.org/pg/commitdiff/937aafd6d5580b81134c7f303d04cf7561ad0309
测试并记录 plpgsql 中初始化交叉引用的行为。我们有一个测试显示变量在其自身的初始化表达式中不可引用,也不可在同一块中之前的表达式中引用。它在同一块中后续的表达式中可以引用,但据我所知没有测试用例来验证这一点。添加一个,并添加一些错误案例。 此外,记录这是可能的,因为文档未涵盖这一点。 根据 tomás at tuxteam 的问题。我认为不需要回溯移植此内容,但我们应确保将来不会破坏它。 讨论: https://postgr.es/m/20211029121435.GA5414@tuxteam.de https://git.postgresql.org/pg/commitdiff/a2a731d6c9db0ba650aa6f7c4fe349ccf712f74d
Peter Eisentraut 推送了:
从 standalone-profile.xsl 中移除未使用的块。自 1707a0d2aa6b2bcfe78f63836c769943a1a6b9e0 以来未使用。 https://git.postgresql.org/pg/commitdiff/b8b62b4be28b8acd36d32d5db65162bbbcd3a754
uuid-ossp:移除与 pgcrypto 的过时构建关联。自 a8ed6bb8f4cf259b95c1bff5da09a8f4c79dca46 以来未使用。 https://git.postgresql.org/pg/commitdiff/237c12aabe39a58f3f5364fd94e0ca8ae8824957
文档:移除一些过时的 pgcrypto 文档。pgcrypto 文档包含对使用的外部代码的致谢,但其中一些代码已移至 src/common/,因此在 pgcrypto 中提及不再合理,予以移除。 https://git.postgresql.org/pg/commitdiff/e6c60719e6c6ee9bd396f430879e1de9079bf74c
pg_dump:重构消息。这减少了需要翻译的独立消息数量。 https://git.postgresql.org/pg/commitdiff/fd2706589a7da4be6f6998befdf8e5fdea1565b8