万圣节快乐!
pg_statement_rollback v1.3,一个在语句级别添加服务器端事务回滚的扩展,已发布。
https://archives.postgresql.org/pgsql-jobs/2021-10/
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 很好地适应了这一点,因为在那里已经触发了两次升级,即使这些命令中的任何一个失败,它们也不会影响恢复或升级。使用由“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 以便写入检查点记录。因为如果我们在单用户模式下,该代码可能与 StartupXLOG() 在同一个进程中运行,因此我们必须保存/恢复 LocalXLogInsertAllowed 标志的状态。希望我们能够在进一步的重构中消除这个缺陷,但无论如何它还不错。Amul Sul,由我修改。讨论:http://postgr.es/m/CAAJ_b97fysj6sRSQEfOHj-y8Jfd5uPqOgO74qast89B4WfD+TA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/18e0913a420349d373cfd8e45b91b4777501fb74
从 CreateReplicationSlot 中删除无用的代码。根据注释,我们在这里初始化 sendTimeLineIsHistoric 和 sendTimeLine 是为了 WalSndSegmentOpen 的利益。但是,唯一发生这种情况的方式是 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 推送
允许对 pg_log_backend_memory_contexts() 进行 GRANT。删除超级用户检查,允许任何被授予 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://postgresql.ac.cn/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://postgresql.ac.cn/message-id/CALDaNm0OANxuJ6RXqwZsM1MSY4s19nuH3734j4a72etDwvBETQ%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/6b0f6f79eef2168ce38a8ee99c3ed76e3df5d7ad
Magnus Hagander 推送
Peter Geoghegan 推送
进一步加强 nbtree 发布拆分代码。在发布列表拆分代码周围添加更多防御性检查。这些应该比任何现有检查更早、更可靠地检测到涉及重复表 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 项目注释。关于 LP_DEAD 项目的 _bt_findinsertloc()
上方的注释现在已不适用。我们已经在同一注释块的较早位置讨论了索引元组删除。提交 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。这更好,部分原因在于测试代码更短、更易读,但主要是因为它会自动扩展事物,以相对于 INSERT 事务的数量启动适当数量的 CIC。按照提交的方式,通常一半到四分之三的 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,因此将除法循环替换为使用常量除数的三个副本不会花费太多代码空间。在大多数机器上,用常量除法可以比用任意值除法便宜得多。一个仅使用 9 位值的 snprintf("foo %d") 测试的微基准测试显示,我的速度提高了约 2 倍 (tgl)。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。斐济、约旦、巴勒斯坦和萨摩亚的 DST 法规变更。巴巴多斯、库克群岛、圭亚那、纽埃、葡萄牙和汤加的历史修正。此外,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 中初始化交叉引用的行为。我们有一个测试表明,变量在其自己的初始化表达式中以及同一块中的先前表达式中都不可引用。它在同一块中的后续表达式中是可引用的,但 AFAICS 没有测试用例来练习它。添加一个,并添加一些错误情况。此外,记录这是可能的,因为文档未能涵盖这一点。根据来自 tomás 在 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
doc:删除一些过时的 pgcrypto 文档。pgcrypto 文档包含对所用外部代码的确认,但其中一些代码已移至 src/common/,因此在 pgcrypto 中提及它不再有意义,因此将其删除。https://git.postgresql.org/pg/commitdiff/e6c60719e6c6ee9bd396f430879e1de9079bf74c
pg_dump:重构消息。这减少了用于翻译的单独消息的数量。https://git.postgresql.org/pg/commitdiff/fd2706589a7da4be6f6998befdf8e5fdea1565b8