万圣节快乐!
pg_statement_rollback v1.3 发布,这是一个添加了服务器端事务并支持语句级回滚的扩展。发布。
https://archives.postgresql.org/pgsql-jobs/2021-10/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上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 将回退到由 IDENTIFY_SYSTEM 命令报告的当前 WAL flush 位置。如果出于某种原因移动了 pg_receivewal 的 WAL 文件,最好尝试从上次停止的地方(即复制槽的 restart_lsn)重新开始,而不是直接跳到当前的 flush 位置,以避免备份的 WAL 出现空洞。此提交更改了 pg_receivewal 以使用以下方法序列来确定起始流式传输 LSN: - 扫描本地归档。 - 如果后端支持并且定义了槽,则使用槽的 restart_lsn。 - 回退到 IDENTIFY_SYSTEM 报告的当前 flush LSN。为了与旧版服务器兼容,我们仅在后端版本至少为 15 时尝试使用 READ_REPLICATION_SLOT,并且如果命令不受支持,则回退到从当前 flush 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 输出的 case 过于宽松,因为它会通过查询生成的任何输出。这修复了匹配模式,使其成为应有的样子,仅匹配“||”。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 测试。这添加了检查两个命令执行的测试。recovery test 002_archiving.pl 被很好地适应了,因为那里已经触发了两次 promotion,即使其中任何一个命令失败也不会影响恢复或 promotion。命令成功是通过“echo”命令生成的文件来检查的,该文件应该可以在所有 buildfarm 环境中工作,即使是 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 测试。此提交通过一些简单的想法将这些测试的速度提高了 25-30%,这些想法可以减少 pg_receivewal 写入的数据量:- 使用 1MB 的段大小。在减少 pg_receivewal 为新段零化的数据量的同时,这提高了非默认段大小的代码覆盖率。- 在涉及槽 restart_lsn 的最后一个测试中,生成一个检查点来推进 redo LSN 和由创建的槽保留的 WAL,从而减少需要归档的段数。这占了大部分的收益。- 最小化插入到 dummy 表中的数据量。审阅者: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,然后再重新打开它。不幸的是,这需要在 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 中删除无用的代码。根据注释,我们在此处初始化 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
在获取 basebackup 的 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 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's 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 release 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 中初始化交叉引用的行为。我们有一个测试表明一个变量在其自身的初始化表达式中,以及在同一块中的先前表达式中是不可引用的。它**可以**在同一块中的后续表达式中引用,但据我所知,没有测试用例能覆盖到这一点。添加一个,并添加一些错误案例。此外,记录这是可能的,因为文档未能涵盖这一点。根据 tomas 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