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

由 PWN 于 2021-03-01 发布
PWN

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

Database Lab 2.2.1 发布,该工具用于快速克隆大型 PostgreSQL 数据库以构建非生产环境: https://gitlab.com/postgres-ai/database-lab/-/releases

dbMigration .NET v13.4 发布,一款数据库迁移和同步工具。 https://fishcodelib.com/DBMigration.htm

Joe 0.9.0 发布,一个 Slack 聊天机器人,可以帮助后端开发人员和 DBA 解决和优化 PostgreSQL 查询。 https://gitlab.com/postgres-ai/joe/-/releases#0.9.0

pgAdmin4 5.0 发布,一个用于 PostgreSQL 的 Web 和本机 GUI 控制中心。 https://www.pgadmin.org/docs/pgadmin4/5.0/release_notes_5_0.html

pgagroal 1.2.0 发布,一个用于 PostgreSQL 的高性能协议原生连接池。 https://agroal.github.io/pgagroal/release/announcement/2021/02/23/pgagroal-1.2.0.html

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

PostgreSQL 产品新闻

2月份的 PostgreSQL 工作

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

PostgreSQL 新闻

PostgreSQL 星球: https://planet.postgresql.org/

本周 PostgreSQL 每周新闻由 David Fetter 为您带来

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

已应用的补丁

Tom Lane 推送了

  • 修复 trgm_regexp.c 中的无效数组访问。08c0d6ad6 中的一个低级错误:我漏了一个需要防止 RAINBOW 弧颜色的地方。值得注意的是,除了 buildfarm 成员 thorntail 之外,没有任何人注意到无效的数组访问。感谢 Noah Misch 在追踪此问题上的帮助。 https://git.postgresql.org/pg/commitdiff/6ee479abfc27a18c37fe77140d16d3ac31f4ac31

  • 稍微简化正则表达式 DFA 的内存管理。Coverity 抱怨 regexec.c 中的函数可能会泄漏 DFA 存储。这是错误的,但是此逻辑足够令人困惑,以至于 Coverity 无法理解它也不足为奇。重写以使其对人类和机器都更易读。 https://git.postgresql.org/pg/commitdiff/190c79884aae540c92f017701726ed69265e2dab

  • 抑制新正则表达式匹配所有检测代码中的编译器警告。gcc 10 足够聪明,可以注意到控制可以使用深度 < 0 到达此 "hasmatch[depth]" 赋值,但不够聪明地知道这需要一个严重损坏的 NFA 图。将 assert() 更改为普通的运行时测试以使其静音。根据 Andres Freund 的报告。讨论: https://postgr.es/m/20210223173437.b3ywijygsy6q42gq@alap3.anarazel.de https://git.postgresql.org/pg/commitdiff/3db05e76f92846d4b54d7de251b0875cf1e23aa4

  • 允许在正则表达式括号内使用补码字符类转义符。现在允许在括号表达式中使用补码类转义符 \D、\S、\W。这样做没有任何语义上的困难,但是先前在此处使用的相当简陋的基于宏展开的实现无法处理。此外,发明“word”作为允许的字符类名称,因此“\w”现在等效于括号外的“\[[:word:]]”,或括号内的“[:word:]”。POSIX 允许这种特定于实现的扩展,并且 bash 等也使用相同的名称。这引发的一个令人惊讶的兼容性问题是,现在不允许使用诸如 `"[\\w-_]"` 之类的构造,因为我们的文档始终表示应该如此:字符类不能是范围的端点。以前,由于 \w 只是 `[:alnum:]_` 的宏,因此将这样的构造读取为 `[[:alnum:]_-_]`,因此只要“-”之后的字符在数值上大于或等于 `"_"`,就可以接受。在此过程中进行了一些实现清理:* 删除 lexnest() 破解,并因此清理 wordchrs() 以不与词法分析器交互。* 修复 colorcomplement() 以使其不随所涉及颜色的数量呈 O(N^2) 的增长。* 去除对 brackpart() 中单字符字符元素名称的 element() 的无用调用。element() 始终将它们映射到字符本身,如果它不这样做,事情会变得非常糟糕 --- "[a]" 是否应该匹配与 "a" 不同的东西?此外,brackpart() 中的快捷方式路径无论如何都没有这样做,这使得它更加不一致。讨论: https://postgr.es/m/2845172.1613674385@sss.pgh.pa.us 讨论: https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/2a0af7fe460eb46f9af996075972bf7c2e3f211d

  • 更改正则表达式 \D 和 \W 简写以始终匹配换行符。换行符肯定不是数字或单词字符,因此它应该匹配这些补码字符类是合理的。以前,\D 和 \W 默认情况下是这样工作的,但是在换行符敏感模式('n' 或 'p' 标志)下,它们不匹配换行符。以前之所以强制使用此行为,是因为显式的补码字符类在换行符敏感模式下不匹配换行符;但是,从上一次提交开始,该实现约束不再存在。更改此行为似乎很有用,因为换行符敏感模式的主要实际用途似乎是匹配其他正则表达式引擎(例如 Perl 和 Javascript)的默认行为...并且它们的默认行为是这些匹配换行符。可以通过编写显式的补码字符类来保留旧的行为,即 [^[:digit:]] 或 [^[:word:]]。 (这意味着 \D 和 \W 与这些字符串并不完全等效,但它们无论如何都不是。)讨论: https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/7dc13a0f0805a353cea0455ed95701322b39d4dd

  • 文档:删除 src/backend/regex/re_syntax.n。我们没有将此文件作为文档发布,并且它的维护比 func.sgml 中的真实文档更加随意,因此我们将其删除。我认为我将它包含在提交 7bcc6d98f 中的唯一原因是伯克利时代的消息来源在此目录中有一个手册页。讨论: https://postgr.es/m/4099447.1614186542@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/301ed8812e3f8b102b85e1f5a59e95990ed9a868

  • 修复 WITH RECURSIVE 处理中的列表操作错误。makeDependencyGraphWalker 和 checkWellFormedRecursionWalker 认为他们可以在列表被递归调用修改时保持指向列表的第一个 cons 单元的指针。当 cons 单元实际上被单独 palloc 时,这是可以的……但是自从提交 1cff1b95a 以来,它非常不安全,会导致核心转储或错误的 WITH 嵌套错误投诉。在现场,这至少需要一个七层深的 WITH 嵌套才会导致问题,但是启用 DEBUG_LIST_MEMORY_USAGE 可以通过较小的嵌套深度看到该错误。根据 Alexander Lakhin 的错误 #16801。向后移植到 v13。Michael Paquier 和 Tom Lane 讨论: https://postgr.es/m/16801-393c7922143eaa4d@postgresql.org https://git.postgresql.org/pg/commitdiff/80ca8464fe02296c8efefd53746e6d6a3f456d1e

  • 改进正则表达式编译器中的内存管理。此处的先前逻辑为每个状态创建单独的弧池,以便每个状态的出弧都物理存储在其中。也许此选择的驱动因素是试图不在每个弧中包含“from”指针;但是 Spencer 早已放弃了这个想法,现在很难看到它的价值是什么。事实证明,该方法在内存消耗方面是相当灾难性的。首先,此引擎构建的 NFA 平均似乎每个状态有大约 4 个弧,并且大多数状态只有一到两个出弧。因此,为每个状态预分配 10 个出弧已经导致两倍或更多的膨胀。更糟糕的是,NFA 优化阶段会随意移动弧。在一个大型 NFA 中,某些状态将具有数百个出弧,因此在优化阶段的后期,我们有大量状态的弧池有空间容纳数百个弧,即使仅使用了其中的少数弧。我们已经看到真实世界的正则表达式,在这种情况下,此效果将内存需求膨胀了 25 倍甚至更多。因此,为了支持整个 NFA 的单个弧池,而不是总是每次请求 10 个弧,而采用可变大小的分配批处理,从而摆脱了每个状态的弧池。同时,让我们批量分配状态结构,以进一步减少 malloc 流量。这偶然允许以类似于 moveins() 的方式优化 moveouts():在将弧移动到另一个状态时,现在可以仅将同一弧结构重新链接到不同的 outchain 中,而在以前,代码不变性要求我们创建一个物理上新的弧,然后释放旧的弧。这些更改将正则表达式编译器对于平均大小的正则表达式的典型空间消耗减少了大约两倍,对于大型或复杂的正则表达式则减少更多。在一个由真实世界的正则表达式组成的大型测试集中,我们以前有六个案例由于超过 REG_MAX_COMPILE_SPACE 限制(大约 150MB)而导致“正则表达式过于复杂”失败;我们必须将该限制提高到接近 400MB 才能使其使用旧代码工作。现在,这些案例都不需要超过 13MB 即可编译。此外,由于 malloc 流量减少,测试集整体速度快了大约 10%。讨论: https://postgr.es/m/168861.1614298592@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/0fc1af174cf7113445e116feb2813405b838a47d

  • 文档:进一步澄清 libpq 对连接字符串 URI 的描述。将摘要分解为命名部分,以使其不那么令人困惑。在应用 SGML 标记方面付出更多努力。对附近的文本进行一些编辑。摘要修订由 Alvaro Herrera 和 Paul Förster 完成,其余是我的错。向后移植到出现多主机连接字符串的 v10。讨论: https://postgr.es/m/6E752D6B-487C-463E-B6E2-C32E7FB007EA@gmail.com https://git.postgresql.org/pg/commitdiff/4e90052c46c7751779ed83627676ed5e74ebe6d4

Thomas Munro 推送了

Michaël Paquier 推送了

Peter Eisentraut 推送了

藤井正雄推送了

Magnus Hagander 推送了

  • 修复网站样式的文档构建。使用 STYLE=website 构建文档引用了网站上不再存在的样式表,因为我们已将其更改为使用版本化的引用。为了减少这种情况再次发生的可能性,请指向网站上的单个样式表,该样式表又将导入所需的样式表。这样,该过程完全在网站存储库的范围内,因此下次切换版本时,只需更改该位置,从而减少被遗漏的可能性。根据与 Peter Geoghegan 和 Jonathan Katz 的(非公开)讨论。https://git.postgresql.org/pg/commitdiff/d22d0fa937616a3112f69ebd6a6ed4f039162441

Álvaro Herrera 推送了

Amit Kapila 推送

Peter Geoghegan 推送

  • 在删除的 nbtree 页面中使用完整的 64 位 XID。否则,我们可能会通过使删除的页面无限期地不可回收而“泄漏”它们。提交 6655a729 对 GiST 索引中删除的页面做了同样的事情。这项工作被用作这里的起点。停止在 nbtree 元页面中存储指示所有已删除但未回收页面中最旧的 bpto.xact 的 XID。不再需要关心该条件/最旧的 XID。只有在环绕是 _bt_vacuum_needs_cleanup() 必须考虑的事情时,它才有意义。btm_oldest_btpo_xact 元页面字段已被重新利用和重命名。它现在是 btm_last_cleanup_num_delpages,用于记住上次 VACUUM 剩余的未回收删除页面数量(实际上,它的值通常是在上次设置该字段的特定 VACUUM 操作期间 _新删除的_ 页面数量的确切值)。存储 btm_last_cleanup_num_delpages 的总体思路是使用它来在 _bt_vacuum_needs_cleanup() 中对未回收的删除页面进行 _一些_ 考虑——尽管永远不会太多。我们只需要避免永远在未回收状态下留下过多的删除页面。我们这样做只是为了涵盖某些狭窄的情况,在这些情况下,没有其他因素使 VACUUM 执行完整扫描,但索引仍然在增长(因此实际上错过了回收现有删除页面的机会)。这些元页面更改导致了明显的用户可见的好处:我们不再仅仅由于来自非常大的索引中只有 1 或 2 个已知的删除(但未回收)块的存在,而在 VACUUM 操作期间触发完整的索引扫描。现在重要的是随着时间的推移保持成本和收益之间的平衡。修复了自提交 857f9c36 以来一直存在的问题,该提交添加了“跳过索引的完整扫描”机制(即 _bt_vacuum_needs_cleanup() 逻辑)。btm_last_cleanup_num_heap_tuples 的准确性意外地取决于源值存储的时间。我们现在始终在 btvacuumcleanup() 中存储 btm_last_cleanup_num_heap_tuples。这修复了该问题,因为 IndexVacuumInfo.num_heap_tuples(源字段)应该准确地指示表在 btvacuumcleanup() 中 VACUUM 完成的状态。无法轻易从此提交中提取可回溯的修复程序。该问题的有针对性的修复程序将在稍后的提交中进行,但这不会在今天发生。我(pgeoghegan)已选择在 vacuum_cleanup_index_scale_factor GUC/param 的文档中删除任何有关删除页面的提及,因为删除(但未回收)页面的存在不再是用户关心的问题。文档中关于 vacuum_cleanup_index_scale_factor 的描述现在似乎无论如何都相当不清楚,并且应该在不久的将来重写。也许届时会重新添加一些关于页面删除的简单提及。由于 nbtree WAL 记录现在使用完整的 XID,因此增加 XLOG_PAGE_MAGIC。作者:Peter Geoghegan pg@bowt.ie 审核人:Masahiko Sawada <sawada.mshk@gmail.com> 讨论:https://postgr.es/m/CAH2-WznpdHvujGUwYZ8sihX=d5u-tRYhi-F4wnV2uN2zHpMUXw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/e5d8a999030418a1b9e53d5f15ccaca7ed674877

  • VACUUM VERBOSE:计算“新删除的”索引页面。教导 VACUUM VERBOSE 报告由当前 VACUUM 操作删除的页面——这些是新删除的页面。VACUUM VERBOSE 继续报告整个索引中删除的页面总数(此处没有更改)。前者是后者的子集。只有在索引 AM 支持页面删除并且出于性能原因与页面回收分离的情况下,才会出现每种删除索引页面类别之间的区别。这是对提交 e5d8a999 的后续工作,该提交使 nbtree 在删除页面时在页面中存储 64 位 XID(而不是 32 位 XID)。请注意,该提交添加的 btm_last_cleanup_num_delpages 元页面字段通常设置为 pages_newly_deleted。例外情况(它们不相等的情况)似乎都是页面删除和回收的一般实现中的棘手情况。作者:Peter Geoghegan pg@bowt.ie 讨论:https://postgr.es/m/CAH2-WznpdHvujGUwYZ8sihX%3Dd5u-tRYhi-F4wnV2uN2zHpMUXw%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/2376361839091b0dcdcc0b77f938b809b5f21646

David Rowley 推送

Noah Misch 推送

待处理的补丁

Justin Pryzby 发送了另一个补丁修订版,使 INSERT SELECT 使用 BulkInsertState 和 multi_insert,检查易失默认值以确保不会丢失对它们的任何依赖关系,使 COPY 根据元组的累积大小而不是行长度来刷新 multi-insert 缓冲区,并在计算何时刷新缓冲区时检查元组大小以获得更准确的块大小度量。

侯志杰发送了另一个补丁修订版,以添加一个 GUC 和一个按表选项,都名为 enable_parallel_dml,以控制 DML 是否包含并行执行的选项。

Bharath Rupireddy 发送了另一个补丁修订版,以在 FDW 级别和外部服务器级别添加名为 keep_connections 的 GUC。

Masahiko Sawada 发送了一个补丁,以添加一个检查,根据是否 1% 的所有堆页面具有 LP_DEAD 行指针来确定是否进行索引清理(和堆清理)。

Shenhao Wang 发送了一个补丁,使 --enable-coverage 在没有找到 lcov 的情况下也能成功,因为实际的覆盖率测试可以在没有它的情况下运行。

Jim Mlodgenski 发送了一个补丁,以添加解析器钩子。

Mats Kindahl 发送了一个补丁,用于 TableAccessMethod 的回调,该回调在应该安排表取消链接时调用,并实现堆访问方法的方法。

Justin Pryzby 发送了三个补丁修订版,以便在 typinput 中的错误期间报告文本参数,并在使用二进制参数的错误中执行参数输出。

Daniel Gustafsson 发送了两个补丁的修订版本,使其可以使用 NSS 作为 libpq 的 TLS 后端。

Jan Wieck 发送了另一个补丁的修订版本,使线路协议可插拔,并使用相同的方式通过 telnet 进行响应。

Justin Pryzby 发送了另一个补丁的修订版本,以润色即将发布的版本的文档。

Iwata Aya 和 Álvaro Herrera 交换了补丁,以改进 libpq 的跟踪功能。

Amit Kapila 发送了一个补丁,以更新预准备事务解码的文档和注释,以匹配当前的行为。

Daniel Gustafsson 发送了另一个补丁的修订版本,以检查 pg_upgrade 中目标集群二进制文件的版本。

Mark Rofail 发送了另一个补丁的修订版本,以实现外键数组。

Matthias van de Meent 发送了另一个补丁的修订版本,为 COPY 进度报告添加了进度报告组件,包括一个新的视图 pg_stat_progress_copy,添加了指向进度报告文档的反向链接,并为相同的内容添加了回归测试。

Dilip Kumar 发送了三个补丁的修订版本,以提供一个新的接口来获取恢复暂停状态,pg_get_wal_replay_pause_state,该接口返回恢复暂停的实际状态,即如果未请求暂停则返回“not paused”,如果请求了暂停但恢复尚未暂停则返回“pause requested”,如果恢复实际已暂停则返回“paused”。

KaiGai Kohei 发送了一个补丁,为 contrib/cube 添加二进制输入/输出处理程序。

Georgios Kokolatos 发送了另一个补丁的修订版本,以使 dbsize 更加一致。

Mark Dilger 发送了另一个补丁的修订版本,以添加 pg_amcheck,这是一个命令行界面,用于针对表和索引运行 amcheck 的验证。

John Naylor 发送了两个补丁的修订版本,使其可以使用 SIMD 指令验证 utf-8。

Hayato Kuroda 发送了三个补丁的修订版本,以重构 ECPGconnect 并允许 IPv6 连接。

Amit Langote、Greg Nancarrow 和 Amit Kapila 交换了补丁,使其可以使用多个 worker 执行 INSERT (INTO ... SELECT ...)。

Julien Rouhaud 发送了另一个补丁的修订版本,为 REINDEX 添加一个新的 COLLATION 选项。

John Naylor 发送了两个补丁的修订版本,允许将元组插入到几乎为空的页面中。

Paul Martinez 发送了两个补丁的修订版本,以记录 max_replication_slots 对订阅者端的影响。

Ajin Cherian 和 Amit Kapila 交换了补丁,以避免在重启后重复解码预准备事务,并添加一个选项以在 pg_create_logical_replication_slot 中启用两阶段提交。

Peter Eisentraut 发送了另一个补丁的修订版本,以修复游标灵敏度术语的使用,使其与 SQL 标准中的术语匹配,删除了支持灵敏游标的声明,并为游标添加了一个新的选项 ASENSITIVE,这是默认行为。

Benoit Lobréau 发送了一个补丁,更详细地记录了 archive_command 如何根据发送的信号失败,以及它是否在 pg_stat_archiver 中报告。

Peter Eisentraut 发送了另一个补丁的修订版本,以设置来自客户端的 SSL 连接的 SNI,这允许支持 SNI 的代理路由连接。

Peter Smith 发送了三个补丁的修订版本,以实现两阶段事务的逻辑解码。

Amit Kapila 发送了另一个补丁的修订版本,以更新逻辑复制的文档,包括最近添加的逻辑复制配置设置,并提及表同步工作进程现在使用复制源来跟踪进度。

Thomas Munro 发送了另一个补丁的修订版本,以用条件变量替换缓冲区 I/O 锁。

Amit Langote 发送了另一个补丁的修订版本,通过确保在分区表上创建外键触发器来修复分区行移动的错误行为,并使用相同的方式在跨分区更新期间正确强制执行外键。

Thomas Munro 发送了另一个补丁的修订版本,以防止锁存器向当前未休眠的进程发送信号,对锁存器使用 SIGURG 而不是 SIGUSR1,对 epoll 锁存器使用 signalfd,这通过等待 signalfd 而不是信号处理程序和自管道来减少系统调用和其他开销,并对 kqueue 锁存器使用 EVFILT_SIGNAL。

Michaël Paquier 发送了一个补丁,为 reindexdb 添加一个 --tablespace 选项,以匹配最近为 REINDEX 添加的功能。

Kota Miyake 发送了一个补丁,修复了当同时设置 PGUSER 和 PGPORT 时 pgbench 在错误中报告数据库名称的问题。

Amul Sul 发送了另一个补丁的修订版本,以使用全局屏障实现 wal 禁止状态,在 WAL 写入的 START_CRIT_SECTION 之前出现错误或 Assert,并记录相同的内容。

Justin Pryzby 发送了另一个补丁的修订版本,使其可以在分区表上使用 CREATE INDEX CONCURRENTLY。

Jacob Champion 发送了另一个补丁的修订版本,以保存用户用于日志记录的原始身份验证身份。

Daniel Gustafsson 发送了另一个补丁的修订版本,通过忽略会启用 SSL 压缩的选项来禁止 SSL 压缩。稍后的补丁将完全删除该选项,因为它已被弃用。

Daniel Gustafsson 发送了一个补丁,从 libpq 的 authtype 参数中删除默认值,因为它已被弃用。

Álvaro Herrera 发送了另一个补丁的修订版本,以实现 ALTER TABLE .. DETACH PARTITION CONCURRENTLY。

Dilip Kumar 发送了两个补丁的修订版本,使其可以为表设置压缩类型。

Euler Taveira de Oliveira 发送了另一个补丁的修订版本,以使用 PUBLICATION 的 DDL 中的可选 WHERE 子句来实现逻辑复制的行过滤。

Thomas Munro 发送了另一个补丁的修订版本,为 FeBeWaitSet 位置引入符号名称,并对 walsender.c 使用 FeBeWaitSet。

Thomas Munro 发送了另一个补丁的修订版本,将条件变量用于 ProcSignalBarriers,允许在中断代码中使用条件变量,并使用全局屏障通过强制所有后端关闭该平台上的所有 fd 来修复 Windows 上的 DROP TABLESPACE。

Andrey Borodin 发送了一个补丁,为 FPI 使用不同的压缩方法。

Julien Rouhaud 发送了一个补丁,将 pg_prewarm 和 pg_stat_statements 中显式对齐的使用更改为 CACHELINEALIGN,并将 hash_estimate_size() 中的对齐更新为基于 CACHELINEALIGN 的 ShmemInitHash 实际将消耗的估计值。

Thomas Munro 发送了一个补丁,以删除 Linux < 2.6.27 的 latch.c 解决方法。

Peter Eisentraut 发送了另一个 psql 的补丁的修订版本,该补丁使其默认显示所有查询结果。

Jeff Janes 发送了一个补丁,通过在用户密码不匹配时在 DETAIL 消息中报告,使 SCRAM 的行为与 MD5 的行为相匹配。

Joel Jacobson 发送了一个补丁,以实现 regexp_positions() 函数。

Paul Förster 发送了一个补丁,在 psql 的 --help 输出中提及数据库 URI。

Justin Pryzby 发送了一个补丁,以 ATExec{En,Dis}ableRowSecurity 的风格重构 ATExecForceNoForceRowSecurity,并进行一些进一步的重构。

Justin Pryzby 发送了一个补丁,以实现 ALTER TABLE SET TABLE ACCESS METHOD。