2025年9月25日: PostgreSQL 18 发布!

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

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

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

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

PostgreSQL 产品新闻

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

pgAdmin4 5.1,一个基于 Web 和原生 GUI 的 PostgreSQL 控制中心,已发布。 https://www.pgadmin.org/docs/pgadmin4/5.1/release_notes_5_1.html

三月 PostgreSQL 工作职位

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

PostgreSQL 相关新闻

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

本周 PostgreSQL 周报由 David Fetter 提供。

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

已应用补丁

Andrew Dunstan 推送

Tom Lane 提交

  • 使 compression.sql 回归测试独立于默认设置。此测试在 "make installcheck" 时会失败,如果安装的 default_toast_compression 设置不是 'pglz'。使其能够应对这种情况。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 上最近的构建失败所证明的那样;这本应在配置时被捕获。模型对此问题的修复类似于 configure 的 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> 的 configure 探测。这似乎只是从其他头文件检查中复制粘贴的。但是我们的 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 在执行其最终的 smgrimmedsync 之前,未能确保目标关系在 smgr 级别已打开。在普通情况下这不成问题,因为它之前在重写过程中已打开。但是,通过启用 CLOBBER_ALWAYS 来重新聚类一个空表,可以重现崩溃。尽管在 v13 中确切的场景不会崩溃,但我认为这可能是其他规划器更改的偶然结果,并且问题很可能仍然可以通过其他测试用例触及。这个失败的真正直接原因是提交 c6b92041d,它用对 smgrimmedsync 的直接调用替换了对 heap_sync(它小心地打开 smgr)的调用。因此,回填到 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:处理有 bug 的 opclasses。教会 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 提交

  • 修复 checkpoint 时 2PC 事务的时间线分配。在 checkpoint 时发现仍处于准备状态的任何事务,其状态数据将从 PREPARE TRANSACTION 生成的 WAL 记录中读取,然后再移动到 pg_twophase/ 中的新位置。读取这些记录时,WAL 读取器使用回调 read_local_xlog_page() 读取一个页面,该页面在系统各处共享。自 1148e22a 以来,此回调在恢复期间读取记录时会更新 ThisTimeLineID,这在级联 WAL 发送器的上下文中可能很有用。此 ThisTimeLineID 更新与检查点程序发生不良交互,如果在读取某些 2PC 数据时发生提升,则通过更改 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。此更新会这样做。在此期间简化了事情。根据 buildfarm 成员 fairywren。任何运行此测试的 Windows 主机都会失败,我也重现了这个问题。回填至:10 https://git.postgresql.org/pg/commitdiff/992d353a190c551db39bcab2dec0ecf14fbc7a40

  • 修复 Windows 上 WAL 段回收的并发问题。此提交主要撤销了 aaa3aed,该提交曾切换例程以在 Windows 上使用 CreateHardLinkA() 加上 unlink() 而非 rename() 来重命名回收的 WAL 段。正如许多 Postgres 13 用户报告的那样,这导致了操纵 WAL 段时的并发问题,主要表现为以下错误:LOG:无法重命名文件 "pg_wal/000000XX000000YY000000ZZ":Permission denied。这回退到使用单一 rename()(在 Windows 上是 pgrename())的逻辑。我测试时发现这个问题很难复现,只碰到一次,那是因为 archive_command 未能完成其工作,所以它对环境很敏感。此问题的报告者已确认,当我们切换回单一 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

  • 在 autovacuum 的详细日志中添加每个索引的统计信息。一旦一个关系(relation)的 autovacuum 完成,如果达到 log_autovacuum_min_duration(或其关系选项)的阈值,日志将包含有关该关系状态的更多信息,例如有关关系、WAL 和系统使用的 VACUUM 操作的统计信息。此提交添加了有关关系索引的统计信息的更多内容,每行日志对应一个索引。索引统计信息已经计算出来,但尚未在 autovacuum 上下文中打印。在此期间,进行了一些重构,以便直接在 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

  • 稍微改写 autovacuum 中生成的索引统计日志。使用“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”一词。Combo CIDs 在代码注释中被引用时,在代码的不同地方使用了不同的术语,因此稍微统一一下术语,使其与 README 中使用的术语保持一致。作者:"Hou, Zhijie" 讨论:https://postgr.es/m/1d42865c91404f46af4562532fdbea31@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/a1999a01bb56c5f5451116abe61b892b2eec5e49

Noah Misch 推送

Fujii Masao 提交

  • pgbench:改进 \sleep 命令的错误处理。此提交改进了 pgbench 的 \sleep 命令,使其能够更正确地处理以下三种情况。(1)当 \sleep 命令只指定了一个参数且它不是数字时,之前 pgbench 会报告一个令人困惑的错误消息,如 "unrecognized time unit, must be us, ms or s"。此提交修复了这一点,从而报告了一个更正确的错误消息,如 "invalid sleep time, must be an integer"。(2)当 \sleep 命令指定了两个参数且第一个参数不是数字时,之前 pgbench 将该参数视为 sleep 时间 0。在这种情况下没有报告错误。此提交修复了这一点,从而在此情况下抛出错误。(3)当一个变量被指定为 \sleep 命令的第一个参数且变量存储了非数字值时,之前 pgbench 将该参数视为 sleep 时间 0。在这种情况下没有报告错误。此提交修复了这一点,从而在此情况下抛出错误。作者:Kota Miyake 审阅者:Hayato Kuroda、Alvaro Herrera、Fujii Masao 讨论:https://postgr.es/m/23b254daf20cec4332a2d9168505dbc9@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/8c6eda2d1c926be76baa79c28521275323bd26fd

  • pg_waldump:修复每条记录统计的 bug。pg_waldump --stats=record 通过 RmgrId 和记录的 xl_info 字段的四个比特位组合来标识一条记录。但是 XACT 记录使用这四个比特位中的第一个比特位作为可选标志变量,以及接下来的三个比特位作为操作码来标识一条记录。因此,之前同一类型的 XACT 记录可能具有不同的四个比特位(三个比特位相同,但第一个比特位不同),这可能导致 pg_waldump --stats=record 显示相同 XACT 记录的两次每条记录统计。这是一个 bug。此提交更改了 pg_waldump --stats=record,使其仅以不同的方式处理 XACT 记录,即过滤掉 xl_info 中的操作码,并仅将 RmgrId 和这三个比特位的组合用作 XACT 记录的标识符。对于其他记录,仍然使用 xl_info 字段的四个比特位。回填到所有支持的分支。作者:Kyotaro Horiguchi 审阅者:Shinya Kato、Fujii Masao 讨论:https://postgr.es/m/2020100913412132258847@highgo.ca https://git.postgresql.org/pg/commitdiff/51893c8463501fc9a38e39cc097773dbdfb9db82

  • 将 WalReceiverWaitStart 等待事件的类型从 Client 更改为 IPC。以前此等待事件的类型是 Client。但是,当报告此等待事件时,walreceiver 进程正在等待 startup 进程设置流复制的初始数据。它没有等待连接到用户应用程序或 walsender 的套接字上的任何活动。因此,此提交将 WalReceiverWaitStart 等待事件的类型更改为 IPC。作者:Fujii Masao 审阅者: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 的过程中,需要进行很多次迭代。此外,如果所有 OID(即 2^32)都已被使用,GetNewOidWithIndex() 将进入类似忙循环的状态,并重复迭代,直到至少有一个 OID 被标记为未使用。曾报告过 GetNewOidWithIndex() 中大量迭代引起的一些问题。例如,在向表中插入十亿条记录时,所有执行此插入操作的后端都在某个时刻以 100% 的 CPU 使用率挂起。以前,没有简单的方法来检测 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、Fujii Masao 讨论:https://postgr.es/m/16722-93043fb459a41073@postgresql.org https://git.postgresql.org/pg/commitdiff/7fbcee1b2d5f1012c67942126881bd492e95077e

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

  • 改进恢复期间的连接拒绝错误消息。以前,当归档恢复或 standby 启动并达到一致的恢复状态但 hot_standby 配置为 off 时,当客户端连接时,错误消息是 "the database system is starting up"(数据库系统正在启动),这令人不必要地困惑,而且也不太准确。此提交改进了恢复期间的连接拒绝错误消息,如下所示,以便用户立即知道其服务器配置为拒绝这些连接。

  • 如果 hot_standby 被禁用,当客户端在归档恢复或 standby 运行时连接,会输出错误消息 "the database system is not accepting connections"(数据库系统不接受连接)和详细消息 "Hot standby mode is disabled."(热 standby 模式已禁用)。* 如果 hot_standby 被启用,在达到一致的恢复状态并 postmaster 开始接受只读连接之前,当客户端连接时,会输出错误消息 "the database system is not yet accepting connections"(数据库系统尚未接受连接)和详细消息 "Consistent recovery state has not been yet reached."(尚未达到一致的恢复状态)。此提交不会更改正常服务器启动和崩溃恢复期间的连接拒绝错误消息 "the database system is starting up"(数据库系统正在启动)。因为它仍然适用于这些情况。作者:James Coleman 审阅者:Alvaro Herrera、Andres Freund、David Zhang、Tom Lane、Fujii Masao 讨论:https://postgr.es/m/CAAaqYe8h5ES_B=F_zDT+Nj9XU7YEwNhKhHA2RE4CFhAQ93hfig@mail.gmail.com https://git.postgresql.org/pg/commitdiff/df9384492b89aac370ab9d12eb89375aeb38a1d4

  • 修复 WAL 回放 COMMIT_TS_SETTS 记录中的 bug。以前,COMMIT_TS_SETTS 记录的 WAL 回放调用 TransactionTreeSetCommitTsData() 时参数 write_xlog=true,这会生成并写入新的 COMMIT_TS_SETTS 记录。这在恢复期间是不允许的。此提交修复了 COMMIT_TS_SETTS 记录的 WAL 回放,使其调用 TransactionTreeSetCommitTsData() 时参数为 write_xlog=false,并且在恢复期间不生成新的 WAL。回填到所有支持的分支。报告者:lx zou zoulx1982@163.com 作者:Fujii Masao 审阅者: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 提交了一个旨在修复 standby 在关闭时出现 Failed assertion 错误的补丁,方法是让 startup 进程在退出时调用 ShutdownRecoveryTransactionEnvironment()。

Peter Eisentraut 提交了另一个补丁修订版,添加了 result_format_auto_binary_types 设置。

Jan Wieck 提交了三个补丁修订版,用于修复 pg_upgrade 以保留 datdba。

Bertrand Drouvot 提交了四个补丁修订版,实现了在 standby 上的最小化逻辑解码。

Pavel Stěhule 发送了两个额外版本的补丁,用于实现模式变量。

Marcus Wanner 提交了两个补丁修订版,向 output 插件的 filter_prepare 回调添加了一个 xid 参数。

Amul Sul 提交了两个补丁修订版,添加了一个内联函数 RelationGetSmgr()。

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

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

Kyotaro HORIGUCHI 提交了另一个补丁修订版,将 stats collector 的临时存储从文件更改为共享内存。

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

Bruce Momjian 和 Julien Rouhaud 交换了补丁,将 queryid 暴露在 pg_stat_activity、log_line_prefix 和 verbose explain 中。

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 提交了另外两版补丁,用于添加一个 Result Cache 执行器节点。

Li Japin 提交了另一版补丁,用于实现 ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION。

Tomáš Vondra 提交了一版补丁,用于修复 opclass 存储类型。

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 特殊情况,并在某些情况下跳过索引 vacuuming。

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

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

Ekaterina Sokolova 提交了另一版补丁,为 Nested Loop 的 explain 添加了额外的统计信息。

Pavel Borisov 提交了另外两版补丁,用于实现覆盖式 SP-GiST 索引,即支持 INCLUDE 列。

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

Joel Jacobson 提交了另一版补丁,用于添加 pg_permissions 和 pg_ownerships 视图。

Bharath Rupireddy 提交了另一版补丁,使在将表添加到发布时的错误消息更加翔实和一致。

Kyotaro HORIGUCHI 提交了另一版意图修复 Walsender 可能无法发送 wal 到末尾的 bug 的补丁。

Jim Finnerty 提交了另一版补丁,用于添加 64 位 GUC 的功能,使用 XID_FMT 来格式化 xid,并使用 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 提交了一版补丁,用于提高 reporting wal stats 的性能。

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 内存泄漏跟踪结果。