PostgreSQL 每周新闻 - 2021 年 3 月 28 日

发布于 2021-03-29,作者:PWN
PWN

PostgreSQL 每周新闻 - 2021 年 3 月 28 日

本周人物:https://postgresql.life/post/julien_riou/

PostgreSQL 产品新闻

pspg 4.5.0 发布,这是一款为 PostgreSQL 设计的分页器。https://github.com/okbob/pspg/releases/tag/4.5.0

pgAdmin4 5.1 发布,这是一个用于 PostgreSQL 的 Web 和本地 GUI 控制中心。https://www.pgadmin.org/docs/pgadmin4/5.1/release_notes_5_1.html

3 月 PostgreSQL 工作

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

PostgreSQL 新闻

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

本周的 PostgreSQL 每周新闻由 David Fetter 带给您

请在太平洋标准时间下午 3:00 前(PST8PDT)将新闻和公告发送至 david@fetter.org。

已应用的补丁

Andrew Dunstan 推送了

Tom Lane 推送了

  • 使 compression.sql 回归测试独立于默认值。如果安装的 default_toast_compression 设置不是“pglz”,则此测试将在“make installcheck”中失败。使其对这种情况具有鲁棒性。Dilip Kumar 讨论:https://postgr.es/m/CAFiTN-t0w+Rc2U3S+y=7KWcLuOYNB5MfWeGdNa7+pg0UovVdcQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/fd1ac9a548966786cf7978e590be816c55936a50

  • 将 configure 对 LZ4 的支持提升到标准水平。将 pkg_config 的结果直接推送到我们的构建标志中是不行的,原因有几个

  • 这无法维持 CPPFLAGS 和 CFLAGS 之间以及 LDFLAGS 和 LIBS 之间的分离。(我认为 CPPFLAGS 角度是使用 MacPorts 的 liblz4 构建时报告警告消息的原因。) * 如果 pkg_config 发出除 -I/-D/-L/-l 开关之外的任何内容,那么我们很可能不想吸收这些内容。这更有可能破坏构建而不是做任何有用的事情。(即使是 -D 情况也值得怀疑;但是我们正在为 libxml2 执行此操作,所以我保留了它。)此外,跳过执行 AC_CHECK_LIB 探测是不行的,最近在 topminnow 上构建失败证明了这一点;应该在配置时捕获到它。在配置的 libxml2 支持中为这个问题建模修复。似乎有人也忽略了 autoheader 运行。讨论:https://postgr.es/m/20210119190720.GL8560@telsasoft.com https://git.postgresql.org/pg/commitdiff/4d399a6fbeb720b34d33441330910b7d853f703d

  • 修复 ATExecSetCompression() 中的各种愚蠢行为。直接涂写 syscache 条目是不行的。在释放该条目后继续访问该条目也是不行的。还要去掉未使用的局部变量。根据 valgrind 测试。https://git.postgresql.org/pg/commitdiff/ac897c483485d3858ada23ca49650a0f2742a50f

  • 删除 <lz4/lz4.h> 的无用配置探测。这似乎只是从其他一些头文件检查中复制粘贴过来的。但是我们的 C 代码完全没有准备好支持这样的头文件名,因此查找它只是在浪费周期。如果我们确实需要支持它,则需要一些 #ifdefs。(对 codesearch.debian.net 的快速浏览发现了一些引用 lz4/lz4.h 的包;但是它们使用该拼写,并且似乎打算引用它们自己的副本,而不是系统级安装的 liblz4。没有证据表明需要这种拼写的独立安装。)讨论:https://postgr.es/m/457962.1616362509@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2c75f8a612b207c7d36e5dc73317dc9ab6fb29d4

  • 主要是在外观上调整与 TOAST 相关的宏。bbe0a81db 的作者并没有完全理解名为 SOMETHING_4B_C 的宏仅用于 postgres.h 中的内部字节序相关详细信息。为打算在其他地方使用的宏选择更易读的名称。稍微重新排列 postgres.h,以阐明这些内部宏和用于更广泛的宏之间的分离。此外,避免使用术语“rawsize”表示真正的解压缩大小;我们已经使用“extsize”表示它,因为“rawsize”通常表示包括标头在内的总 Datum 大小。在将这些含义之一与另一个进行比较的测试中,此选择似乎特别不幸。此补丁包括几个并非纯粹在外观上的更改:请确保对齐压缩方法的移位是无符号的(今天并不关键,但在存在压缩方法 2 时将至关重要),并修复了 VARATT_EXTERNAL_GET_COMPRESSION(现在为 VARATT_EXTERNAL_GET_COMPRESS_METHOD)的损坏定义,其调用者只是偶然地起作用。讨论:https://postgr.es/m/574197.1616428079@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/aeb1631ed207cef2d80e20f79eb52c72f03bca7d

  • 短路请求,该请求的切片大于对象的大小。substring(),以及其他可能的调用者,没有注意传递的切片长度不能大于 datum 的真实大小。由于 toast_decompress_datum_slice 的子项将 palloc 请求的切片长度,这可能会浪费内存。此外,对 liblz4 文档的仔细研究表明,它取决于调用者不请求超过正确解压缩数据量的请求;这与使用 liblz4 1.8.3 观察到的错误行为一致。如果切片请求 >= datum 的解压缩大小,则通过切换到正常的完整解压缩代码路径来避免这些问题。Tom Lane 和 Dilip Kumar 讨论:https://postgr.es/m/507597.1616370729@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/063dd37ebc7644e8db6419565b50dca019e69e86

  • 避免在完成堆重写时可能发生的崩溃。end_heap_rewrite 没有注意确保目标关系在 smgr 级别打开,然后才执行其最终的 smgrimmedsync。在正常情况下,这没有问题,因为它会在重写期间较早打开。但是,可以通过在启用 CLOBBER_CACHE_ALWAYS 的情况下重新集群空表来重现崩溃。虽然在 v13 中确切的场景不会崩溃,但我认为这是不相关的规划器更改的偶然结果,并且该问题仍然可以通过其他测试用例访问。此失败的真正直接原因是提交 c6b92041d,该提交将对 heap_sync 的调用(该调用谨慎地打开 smgr)替换为直接调用 smgrimmedsync。因此,将补丁向后移植到 v13。Amul Sul,根据 Neha Sharma 的报告;由我进行外观更改和测试用例。讨论:https://postgr.es/m/CANiYTQsU7yMFpQYnv=BrcRVqK_3U3mtAzAsJCaqtzsDHfsUbdQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9d523119fd38fd205cb9c8ea8e7cceeb54355818

  • 进一步修复 psql 的 \connect 命令。Jasen Betts 报告了提交 85c54287a 的另一个意外副作用:使用“\c service=whatever”重新连接没有产生预期的结果。原因是,从 PQconndefaults() 的输出开始,实际上允许环境变量(如 PGPORT)覆盖服务文件中的条目,而正常的优先级顺序相反。根本不使用 PQconndefaults 将需要在 do_connect 的参数设置中引入第三个主要代码路径,所以我真的不想以这种方式修复它。但是,我们可以让逻辑有效地忽略默认值,只需再编写几行代码即可。此补丁不会更改“\c -reuse-previous=on service=whatever”的行为。这与 85c54287a 之前的行为有很大不同,因为将重用更多参数,因此服务条目不可能替换这些参数。但我认为这是(大部分是?)有意的。在任何情况下,由于 libpq 不会报告它从何处获取参数值,因此很难做到不同。根据 Jasen Betts 的 bug #16936。与之前的补丁一样,向后移植到所有受支持的分支。(9.5 不幸的是现在不再受支持,因此不会在此处修复。)讨论:https://postgr.es/m/16936-3f524322a53a29f0@postgresql.org https://git.postgresql.org/pg/commitdiff/ea80138545043c0cfcff8405b15626796f2695fe

Peter Geoghegan 推送了

  • 在同一次 VACUUM 期间回收删除的 nbtree 页面。维护一个简单的元数据数组,记录在 nbtree VACUUM 的当前 btvacuumscan() 调用期间被删除的页面。在 btvacuumscan() 结束时使用此元数据,尝试将新删除的页面放入 FSM 中,而无需进一步延迟。到那时,将任何页面放入 FSM 可能还不太安全(它们可能被认为不可回收),但尝试一下我们没什么损失,却可能获得很多好处。在实践中,当清理较大的索引时,这种情况很有可能成功,因为扫描索引自然需要相当长的时间。此提交不会更改页面回收不变性;它只是在现有设计范围内提高了页面回收的效率。“回收安全”是 nbtree 对 Lanin & Shasha 所谓的“排出技术”的实现的一部分。该设计碰巧使用了事务 ID(它们存储在已删除的页面中),但这本身并没有将回收安全的截止点与 VACUUM 使用的任何基于 XID 的截止点(例如,OldestXmin)对齐。所有重要的是,其他后端是否能够观察到树结构中的各种不一致(它们不能通过向右移动来检测和恢复)。回收安全纯粹是一个维护物理数据结构一致性(或表面一致性)的问题。请注意,运行一个简单的串行测试用例,其中包含一个大的范围 DELETE,然后是一个 VACUUM VERBOSE,可能会显示任何新删除的 nbtree 页面尚不可重用/回收。即使没有一个并发 XID 分配,也预计会如此。这是一个旧的实现限制。在实践中,它不太可能成为使回收仍然不安全的原因,至少对于较大的索引而言,在同一次 VACUUM 期间回收新删除的页面实际上很重要。此提交(以及相关的最近提交 e5d8a999 和 9f3665fb)的一个重要高层目标是使索引 AM 中的昂贵延迟清理操作通常变得罕见。如果索引清理操作经常依赖于下一个 VACUUM 操作来完成当前操作开始的工作,那么索引清理的总体行为就很难预测。这与正在进行的向 vacuumlazy.c 添加机制以在某些情况下跳过索引清理的工作有关。任何使索引清理的实际行为更简单、更线性的东西,也将使 vacuumlazy.c 中的自顶向下建模更加健壮。作者:Peter Geoghegan pg@bowt.ie 审核人:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/CAH2-Wzk76_P=67iUscb1UN44-gyZL-KgpsXbSxq_bdcMa7Q+wQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/9dd963ae2534e9614f0abeccaafbd39f1b93ff8a

  • nbtree VACUUM:处理有缺陷的操作符类。教会 nbtree VACUUM 在尝试删除页面但未能“重新找到”其子/目标页面的下行链接时,继续执行清理操作。没有充分的理由将其视为不可恢复的错误。但有一个很好的理由不这样做:此时继续执行可以消除 VACUUM 仅因用户定义的操作符类代码的错误行为而无法取得进展的任何疑问。讨论:https://postgr.es/m/CAH2-Wzma5G9CTtMjbrXTwOym+U=aWg-R7=-htySuztgoJLvZXg@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5b861baa550a369e04bf67fbe83f3a5a8c742fb4

Michaël Paquier 推送

  • 修复具有 2PC 事务的检查点中的时间线分配。任何被检查点发现仍处于预备状态的事务,其状态数据都从 PREPARE TRANSACTION 生成的 WAL 记录中读取,然后移动到 pg_twophase/ 中的新位置。在读取此类记录时,WAL 读取器使用回调 read_local_xlog_page() 来读取页面,该页面在系统的各个部分之间共享。自 1148e22a 以来,此回调在恢复时读取记录时引入了 ThisTimeLineID 的更新,这在级联 WAL 发送器的上下文中可能很有用。如果在从其记录读取某些 2PC 数据时发生提升,则 ThisTimeLineID 的此更新与检查点程序发生不良的相互作用,因为通过更改 ThisTimeLineID,任何后续 WAL 记录都将写入比提升的更新的时间线。这会导致一致性问题。例如,随后的服务器重启会导致无法找到有效的检查点记录,从而导致 PANIC 等错误。此提交更改了读取 2PC 数据的代码,以便在读取 2PC 记录后重置时间线,以防止干扰检查点程序的静态状态。直接在 read_local_xlog_page() 中执行相同的操作是诱人的。但是,根据导致 1148e22a 的讨论,用户可能会依赖于在恢复时读取 WAL 记录页面时 ThisTimeLineID 的更新,因此更改此回调可能会破坏某些当前正在工作的情况。添加了一个重现此问题的 TAP 测试,该测试依赖于 PITR 来精确触发仍跟踪预备事务的提升。经与 Heikki Linnakangas、Kyotaro Horiguchi、Fujii Masao 和我本人讨论。作者:Soumyadeep Chakraborty、Jimmy Yih、Kevin Yeap 讨论:https://postgr.es/m/CAE-ML+_EjH_fzfq1F3RJ1=XaaNG=-Jz-i3JqkNhXiLAsM3z-Ew@mail.gmail.com 向后移植到:10 https://git.postgresql.org/pg/commitdiff/595b9cba2ab0cdd057e02d3c23f34a8bcfd90a2d

  • 简化具有预期日志文件内容的 kerberos 的 TAP 测试。kerberos 的 TAP 测试依赖于后端生成的日志来检查各种连接场景。为了确保给定的测试不会与先前测试生成的日志内容重叠,测试套件依赖于具有日志收集器和日志文件轮换的逻辑,以确保使用等待阶段生成的日志的唯一性。通过 PostgresNode::issues_sql_like() 以更简单的方式解决了解析预期模式的日志内容的问题,其中日志文件在检查生成的内容之前被截断,后端将其输出发送到由 pg_ctl 给出的日志文件。此提交将 kerberos 测试套件切换为使用这种方法,删除了任何等待阶段并简化了整个逻辑,从而减少了代码。如果测试中发生故障,由于 like(),日志的内容仍然会在故障发生时显示给用户,因此这对调试功能没有影响。我是在审查旨在扩展 kerberos 测试套件以检查多个日志模式而不是一个的另一个补丁集时遇到此问题的。作者:Michael Paquier 审核人:Stephen Frost、Bharath Rupireddy 讨论:https://postgr.es/m/YFXcq2vBTDGQVBNC@paquier.xyz https://git.postgresql.org/pg/commitdiff/11e1577a576fec6307aa0bfcde7333e63f907fa7

  • 修复 Windows 上 2PC 事务和 PITR 的新 TAP 测试。595b9cb 添加的测试忘记了在 Windows 上需要使用特定条目设置 pg_hba.conf(请参阅 PostgresNode::set_replication_conf),否则基本备份将失败。任何需要支持复制的节点都只需要在初始化时传递 allows_streaming。这将更新测试以执行此操作。同时简化一下。每个构建场成员 fairywren。任何运行此测试的 Windows 主机都会失败,并且我也重现了该问题。向后移植到:10 https://git.postgresql.org/pg/commitdiff/992d353a190c551db39bcab2dec0ecf14fbc7a40

  • 修复 Windows 上 WAL 段回收的并发问题。此提交主要是对 aaa3aed 的还原,该提交切换了执行回收 WAL 段的内部重命名的例程,以便在 Windows 上使用 CreateHardLinkA() 加 unlink() 的组合而不是 rename()。正如 Postgres 13 的几位用户报告的那样,这在操作 WAL 段时会导致并发问题,主要表现为以下错误形式:LOG: could not rename file "pg_wal/000000XX000000YY000000ZZ": Permission denied 这会回退到使用单个 rename()(对于 Windows,则为 pgrename())的逻辑。事实证明,当我在测试时,这个问题很难被发现,只在一次存档命令无法完成其工作时遇到过,因此它对环境敏感。此问题的报告者已经能够确认,一旦我们切换回单个 rename(),情况就有所改善。为了检查情况,我向报告者提供了基于 13.2 并还原 aaa3aed 的已修补版本,以测试该错误是否消失,并提供了 13.2 的未修补版本,以测试该错误是否仍然出现(只是为了确保我没有搞砸我的构建过程)。特别感谢 Fujii Masao 指出似乎是罪魁祸首的提交,并感谢所有报告者花时间测试我发送给他们的内容。报告人:Andrus、Guy Burgess、Yaroslav Pashinsky、Thomas Trenz 审核人:Tom Lane、Andres Freund 讨论:https://postgr.es/m/3861ff1e-0923-7838-e826-094cc9bef737@hot.ee 讨论:https://postgr.es/m/16874-c3eecd319e36a2bf@postgresql.org 讨论:https://postgr.es/m/095ccf8d-7f58-d928-427c-b17ace23cae6@burgess.co.nz 讨论:https://postgr.es/m/16927-67c570d968c99567%40postgresql.org 讨论:https://postgr.es/m/YFBcRbnBiPdGZvfW@paquier.xyz 向后移植到:13 https://git.postgresql.org/pg/commitdiff/909b449e00fc2f71e1a38569bbddbb6457d28485

  • 在自动清理的详细日志中添加每个索引的统计信息。一旦完成关系的自动清理,如果达到 log_autovacuum_min_duration(或其关系选项)的阈值,则日志将包含有关此关系状态的更多信息,例如关系 VACUUM 操作的统计信息、WAL 和系统使用情况的内容。此提交添加了有关关系索引统计信息的更多信息,为每个索引生成一行日志。索引统计信息已经计算过了,但尚未在自动清理的上下文中打印。同时,进行了一些重构,以直接在 LVRelStats 中跟踪索引统计信息,从而简化了与并行 VACUUM 相关的一些例程。作者:Masahiko Sawada 审核人:Michael Paquier、Euler Taveira 讨论:https://postgr.es/m/CAD21AoAy6SxHiTivh5yAPJSUE4S=QRPpSZUdafOSz0R+fRcM6Q@mail.gmail.com https://git.postgresql.org/pg/commitdiff/5aed6a1fc214913de9ac69c1717dc64a2483e16d

  • 稍微修改了自动清理中为索引统计信息生成的日志的措辞。“remain”容易引起混淆,因为它暗示索引文件可以缩小。相反,使用“in total”。根据与 Peter Geoghegan 的讨论。讨论:https://postgr.es/m/CAH2-WzkYgHZzpGOwR14CScJsjaQpvJrEkEfkh_=wGhzLb=yVdQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/99dd75fb99baa9188971cf47779ed8d7a5e6eb29

  • 清理代码注释中的术语 "combo CID"。代码注释中,各处对组合 CID 使用了不同的术语,因此统一了术语,与某些 README 中当前使用的术语保持一致。作者:"侯志杰" 讨论:https://postgr.es/m/1d42865c91404f46af4562532fdbea31@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/a1999a01bb56c5f5451116abe61b892b2eec5e49

Noah Misch 推送了代码

藤井正雄推送了代码

  • pgbench: 改进 \sleep 命令中的错误处理。此提交改进了 pgbench \sleep 命令,使其能更正确地处理以下三种情况。(1) 当在 \sleep 命令中仅指定一个参数且该参数不是数字时,之前 pgbench 会报告类似“无法识别的时间单位,必须是 us、ms 或 s”的令人困惑的错误消息。此提交修复了此问题,使其报告更合适的错误消息,如“无效的睡眠时间,必须是整数”。(2) 当在 \sleep 命令中指定两个参数且第一个参数不是数字时,之前 pgbench 会将该参数视为睡眠时间 0。在这种情况下不会报告任何错误。此提交修复了此问题,使其在此情况下抛出错误。(3) 当将变量指定为 \sleep 命令中的第一个参数且该变量存储非数字值时,之前 pgbench 会将该参数视为睡眠时间 0。在这种情况下不会报告任何错误。此提交修复了此问题,使其在此情况下抛出错误。作者:Kota Miyake 审查人:Hayato Kuroda、Alvaro Herrera、藤井正雄 讨论:https://postgr.es/m/23b254daf20cec4332a2d9168505dbc9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8c6eda2d1c926be76baa79c28521275323bd26fd

  • pg_waldump: 修复每个记录统计中的错误。pg_waldump --stats=record 通过记录的 RmgrId 和 xl_info 字段的四个位的组合来标识记录。但是 XACT 记录使用这四个位的第一个位作为可选标志变量,使用随后的三个位作为操作码来标识记录。因此,之前相同类型的 XACT 记录可能具有不同的四位(三个位相同,但第一个位不同),这可能导致 pg_waldump --stats=record 为同一 XACT 记录显示两行每记录统计信息。这是一个错误。此提交更改了 pg_waldump --stats=record,使其仅对 XACT 记录进行不同的处理,即,从 xl_info 中过滤出操作码,并将 RmgrId 和这三个位的组合作为记录的标识符,仅用于 XACT 记录。对于其他记录,仍然使用 xl_info 字段的四个位。向后移植到所有受支持的分支。作者:Kyotaro Horiguchi 审查人:Shinya Kato、藤井正雄 讨论:https://postgr.es/m/2020100913412132258847@highgo.ca https://git.postgresql.org/pg/commitdiff/51893c8463501fc9a38e39cc097773dbdfb9db82

  • 将 WalReceiverWaitStart 等待事件的类型从 Client 更改为 IPC。之前此等待事件的类型为 Client。但是,在报告此等待事件时,walreceiver 进程正在等待启动进程设置流复制的初始数据。它不是在等待连接到用户应用程序或 walsender 的套接字上的任何活动。因此,此提交将 WalReceiverWaitStart 等待事件的类型更改为 IPC。作者:藤井正雄 审查人:Kyotaro Horiguchi 讨论:https://postgr.es/m/cdacc27c-37ff-f1a4-20e2-ce19933abfcc@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/1e3e8b51bda8ddd59984230f876f199c9ce3166a

  • 当 GetNewOidWithIndex() 多次未能找到未使用的 OID 时,进行日志记录。GetNewOidWithIndex() 逐个生成新的 OID,直到找到一个不在关系中的 OID。如果存在非常长的连续现有 OID,则 GetNewOidWithIndex() 需要在循环中迭代多次才能找到未使用的 OID。由于 TOAST 表可以有大量条目,并且可能存在此类长 OID 序列,因此存在需要多次迭代才能找到不在 TOAST 表中的新 OID 的情况。此外,如果所有 (即 2^32) OID 都已使用,则 GetNewOidWithIndex() 将进入类似忙循环的状态,并重复迭代,直到至少一个 OID 被标记为未使用。有一些报告的故障是由 GetNewOidWithIndex() 中大量的迭代引起的。例如,当向表中插入十亿条记录时,所有执行插入操作的后端在某个时刻都因 CPU 使用率 100% 而挂起。之前,没有简单的方法来检测 GetNewOidWithIndex() 多次未能找到未使用的 OID。因此,例如,需要获取挂起后端的 gdb 完整回溯,以便调查该问题。这很不方便,并且在某些生产环境中可能不可用。为了提供一种简便的方法,此提交使 GetNewOidWithIndex() 记录它迭代了超过 GETNEWOID_LOG_THRESHOLD 次数,但尚未在关系中找到未使用的 OID。此提交还使其以指数级增加的间隔重复日志记录,直到其迭代超过 GETNEWOID_LOG_MAX_INTERVAL,并使其最终每隔 GETNEWOID_LOG_MAX_INTERVAL 重复日志记录,除非找到未使用的 OID。使用这些宏变量是为了不使用类似的日志消息填充服务器日志。在 pgsql-hackers 的讨论中,还有另一个想法是通过等待事件报告 GetNewOidWithIndex() 中的大量迭代。但是,由于 GetNewOidWithIndex() 遍历索引以查找未使用的 OID,这将执行 I/O、获取锁等操作,这将覆盖等待事件并在完成后将其重置为空。因此该想法效果不佳,我们没有采用它。作者:Tomohiro Hiramitsu 审查人:Tatsuhito Kasahara、Kyotaro Horiguchi、Tom Lane、藤井正雄 讨论:https://postgr.es/m/16722-93043fb459a41073@postgresql.org https://git.postgresql.org/pg/commitdiff/7fbcee1b2d5f1012c67942126881bd492e95077e

  • 将等待事件 WalrcvExit 重命名为 WalReceiverExit。提交 de829ddf23 添加了等待事件 WalrcvExit。但其名称与其他等待事件(如 WalReceiverMain 或 WalReceiverWaitStart 等)不一致。因此,此提交将 WalrcvExit 重命名为 WalReceiverExit。作者:藤井正雄 审查人:Thomas Munro 讨论:https://postgr.es/m/cced9995-8fa2-7b22-9d91-3f22a2b8c23c@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/84007043fc1b1be68dad5d0a78269347c12094b6

  • 改进恢复期间的连接被拒绝错误消息。之前,当存档恢复或备用服务器启动并达到一致恢复状态但 hot_standby 配置为关闭时,客户端连接时的错误消息为“数据库系统正在启动”,这不必要的令人困惑,也不是很准确。此提交改进了恢复期间连接被拒绝的错误消息,如下所示,以便用户立即知道他们的服务器配置为拒绝这些连接。

  • 如果禁用 hot_standby,则当客户端在存档恢复或备用服务器运行时连接时,会输出错误消息“数据库系统不接受连接”和详细消息“热备用模式已禁用”。- 如果启用 hot_standby,则当客户端在达到一致恢复状态且 postmaster 开始接受只读连接之前连接时,会输出错误消息“数据库系统尚未接受连接”和详细消息“尚未达到一致的恢复状态”。此提交不会更改正常服务器启动和崩溃恢复期间“数据库系统正在启动”的连接被拒绝错误消息。因为它仍然适用于这些情况。作者:James Coleman 审查人:Alvaro Herrera、Andres Freund、David Zhang、Tom Lane、藤井正雄 讨论:https://postgr.es/m/CAAaqYe8h5ES_B=F_zDT+Nj9XU7YEwNhKhHA2RE4CFhAQ93hfig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/df9384492b89aac370ab9d12eb89375aeb38a1d4

  • 修复 WAL 重放 COMMIT_TS_SETTS 记录中的错误。之前,COMMIT_TS_SETTS 记录的 WAL 重放使用参数 write_xlog=true 调用 TransactionTreeSetCommitTsData(),这会生成并写入新的 COMMIT_TS_SETTS 记录。这是不可接受的,因为它是在恢复期间。此提交修复了 COMMIT_TS_SETTS 记录的 WAL 重放,使其使用 write_xlog=false 调用 TransactionTreeSetCommitTsData(),并且在恢复期间不生成新的 WAL。向后移植到所有受支持的分支。报告人:lx zou zoulx1982@163.com 作者:藤井正雄 审查人:Alvaro Herrera 讨论:https://postgr.es/m/16931-620d0f2fdc6108f1@postgresql.org https://git.postgresql.org/pg/commitdiff/438fc4a39c3905b7af88bb848bc5aeb1308a017d

Robert Haas 推送了代码

Tomáš Vondra 推送了

Bruce Momjian 推送了更改

Amit Kapila 推送了更改

Peter Eisentraut 推送了更改

Stephen Frost 推送了代码。

Michael Meskes 推送了代码。

Álvaro Herrera 推送了代码。

待处理的补丁

Kyotaro HORIGUCHI 发送了另一个补丁的修订版,以使异步副本等待重放的 lsn。

Bharath Rupireddy 发送了一个补丁,以删除 BloomInitPage、GinInitPage 和 SpGistInitPage 中额外的 memset 调用。

Hou Zhijie 发送了另一个补丁的修订版,以避免在 INSERT INTO 引用表时在 RI 触发器中出现 CommandCounterIncrement。

Amul Sul 发送了另一个补丁的修订版,以构建将支持 ALTER SYSTEM READ {ONLY | WRITE} 的基础设施。

Amit Langote 发送了另一个补丁的修订版,以修复 UPDATE ... RETURNING 和在分区之间移动元组之间的不协调。

Greg Nancarrow 发送了另一个补丁的修订版,以启用 INSERT INTO 的并行 INSERT 和/或 SELECT。

Tang 发送了另一个补丁的修订版,以支持 psql 中大写字符输入的查询结果的制表符补全。

Tom Lane 发送了另一个补丁的修订版,以允许根据 SQL 标准将别名直接附加到 JOIN ... USING。

David Oksman 发送了一个补丁来实现 ALTER TABLE ... RENAME COLUMN IF EXISTS。

Andrei Zubkov 发送了两个补丁的修订版,以将语句条目时间戳添加到 pg_stat_statements。

Thomas Munro 发送了另一个补丁的修订版,为 psql 的 \watch 命令添加 PSQL_WATCH_PAGER。

Thomas Munro 发送了另一个补丁的四个修订版,以检测运行查询时掉线的连接。

Fujii Masao 发送了一个补丁,旨在修复一个错误,该错误在关闭时以备用机上断言失败的形式表现出来,方法是使启动进程在退出时调用 ShutdownRecoveryTransactionEnvironment()。

Peter Eisentraut 发送了另一个补丁的修订版,以添加 result_format_auto_binary_types 设置。

Jan Wieck 发送了另一个补丁的三个修订版,以修复 pg_upgrade 以保留 datdba。

Bertrand Drouvot 发送了另一个补丁的四个修订版,以在备用机上实现最小逻辑解码。

Pavel Stěhule 发送了另一个补丁的两个修订版,以实现模式变量。

Marcus Wanner 发送了另一个补丁的两个修订版,以向输出插件的 filter_prepare 回调添加 xid 参数。

Amul Sul 发送了另一个补丁的两个修订版,以添加 RelationGetSmgr() 内联函数。

Peter Smith 和 Amit Kapila 交换了补丁,以添加两阶段事务的逻辑解码。

Euler Taveira de Oliveira 和 Peter Eisentraut 交换了补丁,以添加逻辑复制的行过滤。

Kyotaro HORIGUCHI 发送了另一个补丁的修订版,以将统计信息收集器的临时存储从文件更改为共享内存。

Masahiro Ikeda 和 Fujii Masao 交换了补丁,以使 WAL 接收器报告 WAL 统计信息。

Bruce Momjian 和 Julien Rouhaud 交换了补丁,以在 pg_stat_activity、log_line_prefix 和 verbose explain 中公开 queryid。

Atsushi Torikoshi 发送了另一个补丁的四个修订版,以添加一个函数 pg_get_backend_memory_contexts(),该函数的作用正如其标签所说。

Daniel Gustafsson 发送了另一个补丁的两个修订版,以支持 NSS 作为 libpq TLS 后端。

Michaël Paquier 和 Jeevan Chalke 交换了补丁,以从所有身份验证后端记录身份验证的身份。

Stephen Frost 发送了另一个补丁的修订版,以将 WaitLatch 用于 vacuum/autovacuum 休眠。

Stephen Frost 提交了关于为现已废弃的 recovery.conf 添加文档存根的补丁的另外三个修订版本。

Justin Pryzby 提交了关于向 CREATE TABLE ... LIKE 添加可选的 ACCESS METHOD 的补丁的另一个修订版本。

Takayuki Tsunakawa 提交了关于加速远程分区情况下 COPY FROM 的补丁的另外两个修订版本。

Amit Langote 提交了关于在分区表中创建外键触发器,并使用它在跨分区更新期间正确强制执行外键的补丁的另一个修订版本。

David Rowley 提交了关于添加结果缓存执行器节点的补丁的另外两个修订版本。

李佳品提交了关于实现 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION 的补丁的另一个修订版本。

Tomáš Vondra 提交了一个修复操作符类存储类型的补丁。

Fujii Masao 提交了一个关于将 WalrcvExit wait_event 重命名为 WalReceiverExit 的补丁的另一个修订版本。

Andrey V. Lepikhov 提交了关于实现全局快照的补丁的另一个修订版本。

Atsushi Torikoshi 提交了关于向 pg_stat_statements 添加计划类型的补丁的另外两个修订版本。

Denis Hirn 提交了一个允许在 WITH RECURSIVE 中进行多个递归自引用的补丁。

Masahiro Ikeda 和 Fujii Masao 交换了补丁,使 pgstat 避免在 SIGQUIT 上写入。

Kyotaro HORIGUCHI 提交了关于保护 syscache 免受负缓存条目膨胀的补丁的另一个修订版本。

Hou Zhijie 提交了关于为 eval_const_expressions 添加 nullif 情况的补丁的另一个修订版本。

Mark Dilger 和 Robert Haas 交换了补丁,以添加 pg_amcheck contrib 应用程序。

Daniel Gustafsson 提交了关于重构 SSL 测试工具以允许多个库的补丁的另一个修订版本。

Pavel Stěhule 提交了关于添加例程标签的补丁的另外两个修订版本。

Thomas Munro 提交了关于使所有 SLRU 缓冲区大小可配置的补丁的另外四个修订版本。

Peter Geoghegan 和 Masahiko Sawada 交换了补丁,以集中每个 VACUUM 的状态,将 lazy_scan_heap() 分解为函数,从 vacuumlazy.c 中删除 tupgone 特殊情况,并在某些情况下跳过索引清理。

Kyotaro HORIGUCHI 提交了关于实现就地表持久性更改并添加一个新命令 ALTER TABLE ALL IN TABLESPACE SET LOGGED/UNLOGGED 的补丁的另一个修订版本,以配合它。

Ashutosh Bapat 提交了关于修复使用 TOAST 解码推测性插入时的内存泄漏的补丁的另一个修订版本。

Ekaterina Sokolova 提交了关于为嵌套循环的 explain 添加额外统计信息的补丁的另一个修订版本。

Pavel Borisov 提交了关于实现覆盖 SP-GiST 索引的补丁的另外两个修订版本,即支持 INCLUDE 列。

Marcus Wanner 为输出插件添加了 concurrent_abort 回调。

Joel Jacobson 提交了关于添加视图 pg_permissions 和 pg_ownerships 的补丁的另一个修订版本。

Bharath Rupireddy 提交了关于使向发布中添加表时的错误消息更具信息性和一致性的补丁的另一个修订版本。

Kyotaro HORIGUCHI 提交了另一个修订版本,旨在修复一个表现为 Walsender 可能无法将 wal 发送到末尾的错误。

Jim Finnerty 提交了关于添加 64 位 GUC 功能、使用 XID_FMT 格式化 xids 以及使用 ClogPageNumber 代替 int 来保证类型安全的补丁的另一个修订版本。

Sven Klemm 提交了一个允许 CustomScan 节点指示它们是否支持投影的补丁。

Andrew Dunstan 和 Nikita Glukhov 交换了补丁,以实现 SQL/JSON 的 JSON_TABLE 部分。

Andrew Dunstan 和 Nikita Glukhov 交换了补丁,以实现 SQL/JSON 的函数部分。

Amit Langote 和 Tom Lane 交换了补丁,通过改进更新计算新元组的方式,并修改如何处理继承的更新/删除,使继承树中的更新更好地扩展。

David Steele 提交了关于记录备份标签可能需要在 Windows 上以二进制模式打开的事实的补丁的两个修订版本。

Cai Mengjuan 提交了一个补丁,以便在每次请求 xlog 流式传输时更新 walrcv->flushedUpto。

Andrew Dunstan 提交了关于允许匹配来自客户端证书的整个 DN 的补丁的另一个修订版本。

Masahiro Ikeda 提交了一个补丁,以提高报告 wal 统计信息的性能。

Tomáš Vondra 提交了一个补丁,以在 explain 中显示应用的扩展统计信息。

Noah Misch 提交了关于添加公共模式默认 ACL 的补丁的另一个修订版本。

Lætitia Avrot 提交了关于使使用 pg_dump 仅转储函数的补丁的两个修订版本。

Noah Misch 提交了关于接受稍有填充的页面,用于大于 fillfactor 的元组的补丁的另一个修订版本。

Álvaro Herrera 提交了关于向 libpq 添加跟踪功能的补丁的另外两个修订版本。

Kazutaka Onishi 提交了关于使外表上的 TRUNCATE 工作正常的补丁的另一个修订版本。

Andrew Dunstan 提交了关于实现全局临时表的补丁的另一个修订版本。

Yoan SULTAN 提交了一个补丁,使 pg_stat_statements 能够跟踪最近的语句。

David Rowley 提交了关于从 valgrind 泄漏跟踪获得更好结果的补丁的另一个修订版本。