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/
https://archives.postgresql.org/pgsql-jobs/2021-02/
Planet PostgreSQL:https://planet.postgresql.org/
本周 PostgreSQL 周报由 David Fetter 提供。
请在太平洋标准时间(PST8PDT)周日晚上3:00之前将新闻和公告发送至 david@fetter.org。
Tom Lane 提交
修复 trgm_regexp.c 中的无效数组访问。08c0d6ad6 中的一个“纸上谈兵”的 bug:我遗漏了一个需要防御 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 足够智能,能够注意到控制流可能到达这个 "hasmatch[depth]" 赋值,其中 depth < 0,但它不够智能,无法知道这需要一个严重损坏的 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" 在方括号外现在等同于 "[[:alnum:]_]",在方括号内等同于 "[:word:]"。POSIX 允许此类实现特定的扩展,并且在 bash 等中也使用相同的名称。这引发了一个令人惊讶的兼容性问题:像 "[\w-_]" 这样的构造现在不再被允许,因为我们的文档一直说它们应该是:字符类不能是范围的端点。以前,因为 \w 只是 "[:alnum:]_" 的宏,所以这样的构造被读取为 "[[:alnum:]_-_]",因此只要 "-" 后面的字符在数值上大于或等于 "_",它就会被接受。在此过程中进行了一些实现清理:* 移除 lexnest() hack,并因此清理 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 的简写改为始终匹配换行符。Newline 肯定不是数字,也不是单词字符,所以它应该匹配这些取反的字符类是合乎情理的。以前,\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 中的唯一原因是因为 Berkeley 时代的源代码在该目录中有一个 man page。讨论:https://postgr.es/m/4099447.1614186542@sss.pgh.pa.us https://git.postgresql.org/pg/commitdiff/301ed8812e3f8b102b85e1f5a59e95990ed9a868
修复 WITH RECURSIVE 处理中的列表操作 bug。makeDependencyGraphWalker 和 checkWellFormedRecursionWalker 认为它们可以在列表被递归调用修改时,持有指向列表第一个 cons 单元的指针。当 cons 单元实际被单独 palloc() 时,这是可以的……但自从 commit 1cff1b95a 以来,这非常不安全,会导致核心转储或关于 WITH 嵌套错误的错误报告。在实际应用中,这至少需要一个七层深的 WITH 嵌套才能引起问题,但启用 DEBUG_LIST_MEMORY_USAGE 可以使 bug 在嵌套深度较浅时出现。根据 Alexander Lakhin 的 bug #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 的流量。这偶然地允许 moveouts() 以与 moveins() 类似的方式进行优化:当将弧移动到另一个状态时,现在可以将相同的弧结构体重新链接到不同的出链中,而在之前,代码不变量要求我们创建一个物理上的新弧然后释放旧的。这些更改将正则表达式编译器对平均大小正则表达式的典型空间消耗减少了大约一半,对于大型或复杂的正则表达式则减少得多。在一个大型的实际正则表达式测试集中,我们以前有大约六个案例因超过 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 推送
移除过时的 RAID 盘片引用。提交 b09ff536 在 GUC "effective_io_concurrency" 的 long_desc 字段中留下了过时的建议。移除它。回溯到 13。报告者:Andrew Gierth andrew@tao11.riddles.org.uk 审阅者:Julien Rouhaud rjuju123@gmail.com 讨论:https://postgr.es/m/CA%2BhUKGJyyWqFBxL9gEj-qtjBThGjhAOBE8GBnF8MUJOJ3vrfag%40mail.gmail.com https://git.postgresql.org/pg/commitdiff/db8374d804f2dd35a0f934984d1d3686cc71f545
隐藏 pg_collation_actual_version(<bad OID>) 的内部错误。返回 NULL 而不是显示一个不美观的内部“缓存查找失败”消息,这符合其他类似情况的约定。报告者:Justin Pryzby pryzby@telsasoft.com 审阅者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/0fb0a0503bfc125764c8dba4f515058145dc7f8b
pg_collation_actual_version() -> pg_collation_current_version()。新名称似乎更自然一些。讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/9cf184cc0599b6e65e7e5ecd9d91cd42e278bcd8
重构 get_collation_current_version()。三个不同操作系统代码路径以三种不同的方式排除了 C[.xxx] 和 POSIX 的考虑。将它们合并。审阅者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/beb4480c853a60ec43bd3f1a71252890dd234f10
Tab 补全 CREATE COLLATION。审阅者:Michael Paquier michael@paquier.xyz 讨论:https://postgr.es/m/20210117215940.GE8560%40telsasoft.com https://git.postgresql.org/pg/commitdiff/5bc09a74719dfeb6c4cebb311b81385c508459a8
撤销“pg_collation_actual_version() -> pg_collation_current_version()”。此提交撤销了 commit 9cf184cc0599b6e65e7e5ecd9d91cd42e278bcd8。名称更改的接受度不如预期。讨论:https://postgr.es/m/afcfb97e-88a1-a540-db95-6c573b93bc2b%40eisentraut.org https://git.postgresql.org/pg/commitdiff/8556267b2b1b8e1c26037c4c25cf390ee5afb5d9
Michaël Paquier 提交
尽可能使用 pgstat_progress_update_multi_param()。此提交将 REINDEX INDEX 和 CREATE INDEX CONCURRENTLY 的一个代码路径更改为使用 pgstat_progress_update_multi_param() 而不是多次调用 pgstat_progress_update_param() 来报告每个操作的进度。这使得进度报告对最终用户更加一致,而不会影响提供的信息量。作者:Bharath Rupireddy 讨论:https://postgr.es/m/CALj2ACV5zW7GxD8D_tyO==bcj6ZktQchEKWKPBOAGKiLhAQo=w@mail.gmail.com https://git.postgresql.org/pg/commitdiff/92942642788c9d73e4c090ee0a77603f7afbc1d7
文档:改进 wal_receiver_status_interval 的描述。该参数的描述之前很混乱,称值为 0 完全禁用状态更新。这不是真的,因为在某些情况下,即使忽略此参数值也会发送更新。文档已改进,以概述计划状态消息和强制发送状态消息之间的处理差异。报告者:Dmitriy Kuzmin 作者:Michael Paquier 审阅者:Euler Taveira 讨论:https://postgr.es/m/161346024420.3455.1345266601055047937@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/c82d59d64e127a5e743f9cf16537f4c7c120ce7b
修复文档和注释中的一些拼写、语法和风格错误。修复文档的部分已根据需要回溯。作者:Justin Pryzby 讨论:https://postgr.es/m/20210210235557.GQ20012@telsasoft.com 回溯至:9.6 https://git.postgresql.org/pg/commitdiff/bcf2667bf62d72faced64cb60ffbd2e599a0ebe8
文档:提及 pgbench 支持 PGDATABASE。PGHOST、PGPORT 和 PGUSER 已被提及,但 PGDATABASE 没有。与 5aaa584 类似,回溯至
报告者:Christophe Courtois 讨论:https://postgr.es/m/161399398648.21711.15387267201764682579@wrigleys.postgresql.org 回溯至:12 https://git.postgresql.org/pg/commitdiff/a6f8dc47a0582e37c234c8e916377b46d2b03817
文档:改进压缩日志的 {archive,restore}_command。文档中提到的使用 gzip 和 gunzip 的命令没有在归档文件前加上 ".gz" 并且使用了不一致的归档文件路径,这可能会引起混淆。报告者:Philipp Gramzow 审阅者:Fujii Masao 讨论:https://postgr.es/m/161397938841.15451.13129264141285167267@wrigleys.postgresql.org https://git.postgresql.org/pg/commitdiff/329784e11849ff691f0157f3b27c50f652bce76a
pgbench:移除已失效的 CState->ecnt。ecnt 的最后一次使用是在 12788ae。它在后端错误发生后被递增,但之后就没有什么用途了,所以我们将其移除。作者:Kota Miyake 审阅者:Álvaro Herrera 讨论:https://postgr.es/m/786c3d9fbe067763d899e78c296f9f0f@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/943eb478803cc2ed6f0b1f5df6f1b20c9ad6245d
Peter Eisentraut 提交
改进哈希分区边界检查错误消息。对于错误消息“每个哈希分区的模数都必须是下一个较大模数的因子”,添加一个详细消息,显示特定的数字和现有的分区。还对代码进行了更多注释。审阅者:Amit Langote <amitlangote09@gmail.com> 审阅者:Heikki Linnakangas <hlinnaka@iki.fi> 讨论:https://postgresql.ac.cn/message-id/flat/bb9d60b4-aadb-607a-1a9d-fdc3434dddcd%40enterprisedb.com https://git.postgresql.org/pg/commitdiff/efbfb642414b61db1567a7a902ace3f307d7564a
简化 LSN 的打印。添加一个宏 LSN_FORMAT_ARGS,用于 printf 风格的 LSN 打印。将所有适用的代码转换为使用它。审阅者:Ashutosh Bapat <ashutosh.bapat@enterprisedb.com> 审阅者:Kyotaro Horiguchi <horikyota.ntt@gmail.com> 审阅者:Michael Paquier michael@paquier.xyz 讨论:https://postgresql.ac.cn/message-id/flat/CAExHW5ub5NaTELZ3hJUCE6amuvqAtsSxc7O+uK7y4t9Rrk23cw@mail.gmail.com https://git.postgresql.org/pg/commitdiff/6f6f284c7ee44264eb3e128e2bf54d9276711d11
消息风格修复。不要引用类型名称占位符。https://git.postgresql.org/pg/commitdiff/8ec8fe0f31712c62b761da9ef6d32214e08340d1
稍微扩展一个测试用例。这可能会通过确保通知消息是不同的来帮助后续补丁,从而可以清楚地知道它们是否按正确的顺序输出。作者:Fabien COELHO coelho@cri.ensmp.fr 讨论:https://postgresql.ac.cn/message-id/alpine.DEB.2.21.1904240654120.3407%40lancre https://git.postgresql.org/pg/commitdiff/b3a9e9897ec702d56602b26a8cdc0950f23b29dc
增强循环标记值。根据 SQL:202x 草案,在递归查询的 CYCLE 子句中,cycle mark 值可以是布尔类型,也可以省略,在这种情况下,默认值为 TRUE 和 FALSE。审阅者:Vik Fearing vik@postgresfriends.org 讨论:https://postgresql.ac.cn/message-id/flat/db80ceee-6f97-9b4a-8ee8-3ba0c58e5be2@2ndquadrant.com https://git.postgresql.org/pg/commitdiff/f4adc41c4f92cc91d507b19e397140c35bb9fd71
Fujii Masao 提交
在 postmaster 启动时初始化 PGPROC 中的原子变量 waitStart。Commit 46d6e5f567 在 PGPROC 结构中添加了原子变量 "waitStart",用于存储等待锁获取开始的时间。以前,每次后端启动时都会初始化此变量。相反,此提交让 postmaster 在启动时初始化它,以确保在任何使用之前都已初始化该变量。此提交还将 prepare transaction 的 "waitStart" 变量初始化代码从 TwoPhaseGetDummyProc() 移动到 MarkAsPreparingGuts()。因为 MarkAsPreparingGuts() 是初始化其他 PGPROC 变量的更合适的位置。作者:Fujii Masao 审阅者:Atsushi Torikoshi 讨论:https://postgr.es/m/1df88660-6f08-cc6e-b7e2-f85296a2bdab@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/f05ed5a5cfa55878baa77a1e39d68cb09793b477
改进 TRUNCATE 的 Tab 补全。作者:Kota Miyake 审阅者:Muhammad Usama 讨论:https://postgr.es/m/f5d30053d00dcafda3280c9e267ecb0f@oss.nttdata.com https://git.postgresql.org/pg/commitdiff/6b40d9bdbdc9f873868b0ddecacd9a307fc8ee26
Magnus Hagander 已推送
Álvaro Herrera 提交
修复拼写错误。https://git.postgresql.org/pg/commitdiff/6a03369a71d4a7dc5b8d928aab775ddd28b72494
移除无用的 HeapTupleHeaderIndicatesMovedPartitions 调用。Pavan Deolasee 最近指出,提交 5db6df0c0117 添加的一些 HeapTupleHeaderIndicatesMovedPartitions 调用是无用的,因为它们是在比较 t_self 与 t_ctid 之后进行的。但是,由于 t_self 永远不会被设置为表示元组移动分区的魔术值,因此这永远不会成功:如果第一个测试失败(因此我们知道 t_self 等于 t_ctid),则第二个测试也必然会失败。所以可以移除这些检查,不会造成损害。这里没有 bug,只是一个代码可读性问题。报告者:Pavan Deolasee pavan.deolasee@gmail.com 讨论:https://postgr.es/m/20200929164411.GA15497@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/0f5505a8815aa4eb03ca61245a5a51ff9adda2f4
VACUUM:忽略 CONCURRENTLY 的索引操作。正如 commit c98763bf51bf 所设想的,VACUUM 有可能在计算 Xmin 时忽略某些正在执行 CREATE INDEX CONCURRENTLY 和 REINDEX CONCURRENTLY 的事务;这是因为我们知道这些事务不会检查其他表,也不会在同一事务中执行任何其他操作。(只有对“安全”索引的操作可以被忽略:对既不是部分索引也不是表达式索引的索引。)这在 CIC/RC 可能运行很长时间的情况下非常有用,因为以前这对于其他表的并发 vacuum 是一个主要的头痛问题。审阅者:Matthias van de Meent boekewurm+postgres@gmail.com 审阅者:Masahiko Sawada sawada.mshk@gmail.com 讨论:https://postgr.es/m/20210115133858.GA18931@alvherre.pgsql https://git.postgresql.org/pg/commitdiff/d9d076222f5b94a85e0e318339cfc44b8f26022d
恢复 HEAP_XMAX_LOCK_ONLY|HEAP_KEYS_UPDATED 为允许。Commit 866e24d47db1 添加了一个断言,即 HEAP_XMAX_LOCK_ONLY 和 HEAP_KEYS_UPDATED 不能同时出现,这是基于一个错误的假设,即后者必然指代更新而不是元组锁;但这是错误的,因为 SELECT FOR UPDATE 可以精确地使用这种组合,正如此处添加的 amcheck 测试用例所证明的。移除 Assert(),并修补 amcheck 的 verify_heapam.c,使其在发现该组合时不会抱怨。此外,为了过度谨慎,更新(跨所有分支)README.tuplock,使其更明确地说明这一点。作者:Julien Rouhaud rjuju123@gmail.com 审阅者:Mahendra Singh Thalor mahi6run@gmail.com 审阅者:Dilip Kumar dilipbalaut@gmail.com 讨论:https://postgr.es/m/20210124061758.GA11756@nol https://git.postgresql.org/pg/commitdiff/8deb6b38dc4c7a7fd4719ee45e4b00d62b27dffe
修复 generate_gather_paths 注释中的混淆。d2d8a229bc58 引入了一个新函数 generate_useful_gather_paths 来替换 generate_gather_paths,但忘记更新几个引用旧函数的地方。这可能不是 100% 完整(参见 create_ordered_paths),但比什么都不做要好。作者:“Hou, Zhijie” houzj.fnst@cn.fujitsu.com 审阅者:Tomas Vondra tomas.vondra@enterprisedb.com 讨论:https://postgr.es/m/4ce1d5116fe746a699a6d29858c6a39a@G08CNEXMBPEKD05.g08.fujitsu.local https://git.postgresql.org/pg/commitdiff/5a65eacfdc69ee8c9d3ed92d838bc53628fbb7c6
修复 AfterTriggersTableData.storeslot 的使用后释放 bug。AfterTriggerSaveEvent() 错误地在执行期内存上下文中分配槽,而正确的做法是在事务期内存上下文中分配,因为那是封闭的 AfterTriggersTableData 实例所属的上下文。回溯到 12(测试回溯到 11,那里在没有代码更改的情况下工作良好,并且有它来确认之前的情况得到了很好的支持);此 bug 似乎由 commit ff11e7f4b9ae 引入。报告者:Bertrand Drouvot bdrouvot@amazon.com 作者:Amit Langote amitlangote09@gmail.com 讨论:https://postgr.es/m/39a71864-b120-5a5c-8cc5-c632b6f16761@amazon.com https://git.postgresql.org/pg/commitdiff/25936fd46c97039aad042ae8d46917d38d132fe4
Amit Kapila 提交
更改逻辑复制认证失败的错误消息。认证失败的错误消息没有区分是物理复制还是逻辑复制连接失败,并且在逻辑复制连接失败的情况下提供了不完整的信息。作者:Paul Martinez 和 Amit Kapila 审阅者:Euler Taveira 和 Amit Kapila 讨论:https://postgr.es/m/CACqFVBYahrAi2OPdJfUA3YCvn3QMzzxZdw0ibSJ8wouWeDtiyQ@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bc617a7b1cada2ec5f8b9d45a4312e49fc1766ad
修复 ReorderBufferFinishPrepared 中的一个疏漏。ReorderBufferTXN 不存在时,我们没有什么可解码的事务。因此,不要在这里创建一个新的 ReorderBufferTXN。这是 commit a271a1b5 中的一个疏漏。报告者:Markus Wanner 讨论:https://postgr.es/m/dbec82e2-dbd7-95a2-c6b6-e488cbbdf853@bluegap.ch https://git.postgresql.org/pg/commitdiff/ade89ba5f408e6034db7cc8a2c9b7858f5a214c4
修复 ce0fdbfe97 引入的 relcache 引用泄漏。作者:Sawada Masahiko 审阅者:Amit Kapila 讨论:https://postgr.es/m/CAD21AoA7ZEfsOXQ9HQqMv3QYGsEm2H5Wk5ic5S=mvzDf-3a3SA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/8a4f9522d0c7d197c7eaa62cc72fb1bf9b90f05b
Peter Geoghegan 提交
在已删除的 nbtree 页中使用完整的 64 位 XID。否则,我们可能会因使已删除页面无限期不可回收而“泄漏”它们。Commit 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 操作期间的完全索引扫描。现在唯一重要的是随着时间的推移平衡成本和收益。修复自 commit 857f9c36 以来一直存在的问题,该提交添加了“跳过索引全扫描”机制(即 _bt_vacuum_needs_cleanup() 逻辑)。btm_last_cleanup_num_heap_tuples 的准确性意外地依赖于源值存储的*时间*。我们现在总是在 btvacuumcleanup() 中存储 btm_last_cleanup_num_heap_tuples。这可以修复问题,因为 IndexVacuumInfo.num_heap_tuples(源字段)预计会准确地指示 VACUUM 在 btvacuumcleanup() 中完成后的表状态。此提交无法轻松提取可回溯的修复程序。该问题的针对性修复将在后续提交中进行,但今天不会发生。我(pgeoghegan)选择从 vacuum_cleanup_index_scale_factor GUC/参数的文档中删除对已删除页面的任何提及,因为用户不再太关心已删除(但未回收)页面的存在。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 中出现。这是 commit e5d8a999 的后续工作,该提交将 nbtree 中删除页面的 XID 存储为 64 位(而不是 32 位)。请注意,该提交添加的 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 提交
添加 TID 范围扫描以支持高效扫描 TID 范围。这添加了一个名为 TID Range Scan 的新执行器节点。当在基表上发现有关表 ctid 列的搜索范围的限定条件时,查询规划器将生成 TID Range Scan 的路径。这些范围可以在任一端开放。例如,WHERE ctid >= '(10,0)'; 将返回第 10 页及以上的全部元组。为了支持这一点,已向表 AM 添加了两个新的可选回调函数。scan_set_tidrange 用于将扫描范围设置为给定的 TID 范围。scan_getnextslot_tidrange 在给定范围内获取下一个元组。对于 TID 范围扫描没有意义的 AM,这些函数可以在 TableAmRoutine 中设置为 NULL。在这种情况下,查询规划器不会生成 TID Range Scan 路径。作者:Edmund Horner, David Rowley 审阅者:David Rowley, Tomas Vondra, Tom Lane, Andres Freund, Zhihong Yu 讨论:https://postgr.es/m/CAMyN-kB-nFTkF=VA_JPwFNo08S0d-Yk0F741S2B7LDmYAi8eyA@mail.gmail.com https://git.postgresql.org/pg/commitdiff/bb437f995d47405ecd92cf66df71f7f7e40ed460
添加缺失的 TidRangeScan readfunc。bb437f995 中错误地忘记了。https://git.postgresql.org/pg/commitdiff/977b2c08535f2a82ba7c310c88420cbbca1772e8
Noah Misch 推送
Justin Pryzby 发送了一个补丁的另一个修订版,该补丁使 INSERT SELECT 使用 BulkInsertState 和 multi_insert,检查易失性默认值以确保不丢失对它们的任何依赖,使 COPY 根据累积的元组大小而不是行长度刷新 multi-insert 缓冲区,并检查元组大小以更准确地测量块大小,以计算何时刷新缓冲区。
Hou Zhijie 发送了一个补丁的另一个修订版,该补丁添加了一个 GUC 和一个每表选项,都命名为 enable_parallel_dml,以控制 DML 是否包括并行执行的选项。
Bharath Rupireddy 发送了一个补丁的另一个修订版,该补丁在 FDW 级别和外部服务器级别都添加了名为 keep_connections 的 GUC。
Masahiko Sawada 发送了一个补丁,用于检查是否应该进行索引 vacuum(和 heap vacuum),基于是否有 1% 的所有 heap 页具有 LP_DEAD 行指针。
Shenhao Wang 发送了一个补丁,使 --enable-coverage 在找不到 lcov 的情况下也能成功,因为实际的覆盖率测试可以在没有它的情况下运行。
Jim Mlodgenski 发送了一个解析器钩子的补丁。
Mats Kindahl 发送了一个 TableAccessMethod 的回调补丁,当表应被安排解除链接时调用,并为 heap 访问方法实现了该方法。
Justin Pryzby 发送了另外三个修订版的补丁,用于在 typinput 中出错时报告文本参数,并用二进制参数测试错误时的参数输出。
Daniel Gustafsson 发送了另外两个修订版的补丁,使 libpq 的 TLS 后端可以使用 NSS。
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,该接口返回实际的恢复暂停状态,即如果未请求暂停则为“未暂停”,如果请求了暂停但恢复尚未暂停则为“请求暂停”,如果恢复实际上已暂停则为“已暂停”。
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 交换了补丁,使 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 发送了另一个补丁的修订版,用于防止 latches 将信号发送给当前未休眠的进程,使用 SIGURG 而不是 SIGUSR1 进行 latches,使用 signalfd 进行 epoll latches,通过等待 signalfd 而不是信号处理程序和 self-pipe 来减少系统调用和其他开销,并为 kqueue latches 使用 EVFILT_SIGNAL。
Michaël Paquier 发送了一个补丁,为 reindexdb 添加了一个 --tablespace 选项,匹配 REINDEX 最近添加的功能。
Kota Miyake 发送了一个补丁,用于修复 pgbench 在同时设置 PGUSER 和 PGPORT 时报告数据库名称的错误。
Amul Sul 发送了另一个补丁的修订版,用于使用全局屏障实现 wal 禁止状态,在 START_CRIT_SECTION 之前进行 WAL 写入的错误或断言,并记录相同内容。
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,允许在中断代码中使用条件变量,并使用全局屏障来修复 Windows 上的 DROP TABLESPACE,方法是强制所有后端在该平台上关闭所有文件描述符。
Andrey Borodin 发送了一个补丁,用于 FPI 使用不同的压缩方法。
Julien Rouhaud 发送了一个补丁,用于将 pg_prewarm 和 pg_stat_statements 中的显式对齐使用更改为 CACHELINEALIGN,并更新 hash_estimate_size() 中的对齐,使其估计 ShmemInitHash 将实际消耗的量(基于 CACHELINEALIGN)。
Thomas Munro 发送了一个补丁,用于移除 Linux < 2.6.27 的 latch.c 变通方法。
Peter Eisentraut 发送了另一个补丁的修订版,用于 psql,该补丁使 psql 默认显示所有查询结果。
Jeff Janes 发送了一个补丁,用于使 SCRAM 的行为与 MD5 匹配,在密码不匹配用户时报告一个 DETAIL 消息。
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 的补丁。