冲突日志表的概念验证补丁已提交
Dilip Kumar 提议改 ACL 检查,让冲突表只允许 DELETE 与 TRUNCATE,挡住手工插入和更新。
保留原始来源与发布日期的新闻、博客和活动。
Dilip Kumar 提议改 ACL 检查,让冲突表只允许 DELETE 与 TRUNCATE,挡住手工插入和更新。
Tomas Vondra 写清了 PostgreSQL 提交者的产生方式。约三十位提交者都参与:二月到三月在提交者私有邮件列表上提名,随后讨论评估,五月中旬定案并联系候选人,最后在 hackers 列表公布。核心组正式发出提交权限,也保留否决权,但很少推翻提交者的意见。看的是多年持续的实质贡献、是否负责维护某块代码、是否评审并帮助其他贡献者、代码质量是否不需要反复返工。落选者会收到反馈。
Tiger Data 的 Matty Stratton 说明只追加的表为什么也一直被 autovacuum 收费。来源有三处:中止的事务会留下要清理的死元组;首次读取时改写提示位会弄脏页面;插入量大会触发防回绕的冻结。常规调参只是把这些工作挪到别的时间,并没有消掉工作本身。他把这归为 MVCC 存储模型与不需要并发行修改的负载之间的错配,并称 Hypercore 这类专用存储模型可以完全去掉这些条件。
扩展 pg_sorted_heap 发布 0.13.0。它提供按主键让行物理有序的表访问方法 sorted_heap,并用每页 zone map 裁剪堆块;配套的 sorted_hnsw 是与规划器集成的 HNSW 索引访问方法,面向内置向量类型;svec 与 hsvec 提供 float32 与 float16 向量类型;另有一组面向事实的 GraphRAG 辅助函数。作者是 Sergey Kuznetsov。
CYBERTEC 列出了自己进入 PostgreSQL 19 的贡献。分量最重的是 Antonin Houska 的 REPACK CONCURRENTLY,用新建表加逻辑复制再整体替换的方式做在线重组;同出他手的还有 eager aggregation,让规划器把聚合下推到连接之前。Laurenz Albe 修好了 vacuumdb 对分区表的处理,并把 log_lock_waits 默认改成开启。
在线开关校验和的功能又找出两个缺陷。Satyanarayana 发现 pg_enable_data_checksums() 的两个成本限制参数因全局变量没同步而失效,同时对 unlogged 关系做了多余的 WAL 记录。Daniel Gustafsson 确认并备好补丁。Ayush Tiwari 指出 unlogged 关系的 init fork 在恢复期间仍需写 WAL 才能保持备库一致,测试证实这会导致故障转移后校验和验证失败。
REPACK CONCURRENTLY 用的按数据库划分快照被发现有根本性正确性问题。Antonin Houska 说明,处理运行事务记录时对按库记录提前返回却没调整 xmin,于是 XID 低于 oldestRunningXid 的事务会被当成仍在运行,根子是 COMMIT 记录不保证按创建顺序跟在运行事务记录之后。压力测试因此报唯一索引重复键和除零错误。他可能放弃该特性,Alvaro Herrera 建议回退相关提交。
Daniil Davydov 同意先作为 0003 提交,评审定案后再并回 0001 和 0002,以免 cfbot 报错。
Nathan Bossart 要删已被移除的实现引用,Tom Lane 同意清死代码但主张保留 HAS_TEST_AND_SET。
Peter Eisentraut 要求改局部变量名并补锁,担心并发 DROP LABEL,同时反对顺手加 OidIsValid。
Tom Lane 指出 load_hosts() 的返回类型声明不一致,并嫌函数名太泛,Daniel Gustafsson 认可修法。
Vibhor Kumar 借 pgBackRest 被原作者 David Steele 归档一事,把开源许可证和运营可持续性分开来谈。项目做了十三年,用的是 MIT 许可证,法律和结构上完全开放,谁都可以分支,但归档意味着它已无人维护。他的看法是一个项目可以在法律上开放、在运营上脆弱。给企业的建议是别只查许可证合规,还要问治理:有没有共享的维护权、透明的决策和可持续的资金。
Christophe Pettus 拆解了 PgQue 的做法:消费时完全不改事件表。事件写进轮转的表,事务 ID 作列默认值;一个 ticker 每秒抓一次 pg_snapshot,相邻两个快照之间就是一个批次,消费端据此判断可见性;三张表靠 TRUNCATE 轮转,不做垃圾回收。算法出自 Marko Kreen 2007 年前后的设计。代价是事件要等下一个 tick 才可见,端到端一到两秒。
Richard Yen 讲清了拿 Postgres 做任务队列会撞上什么。高并发下大量工作进程用 SELECT FOR UPDATE SKIP LOCKED,多个事务会短暂引用同一行,产生的 MultiXact ID 堆进固定大小的 SLRU 缓冲区,后端排队在 LWLock:MultiXactSLRU 上,吞吐随之塌陷。任务行反复更新删除,死元组产生得比 autovacuum 回收快,几兆有效数据的队列表能涨到几十 GB。
Christophe Pettus 回顾故障转移复制槽的两年。PostgreSQL 17 引入三件套:订阅的 failover 选项、备库的 sync_replication_slots、主库的 synchronized_standby_slots;18 只修缺陷;19 增加动态 wal_level 与 slotsync_skip_reason 列。它保证提升后新主库的槽位不会跑到订阅者前面。但槽位复制是异步的,提升前必须手动核对位置。
逻辑复制的冲突日志历史表卡在权限上:非超级用户的订阅所有者访问不了 pg_conflict 模式里的冲突日志表,原因是查询分析阶段过早做了 ACL 检查。Dilip Kumar 试过绕开模式检查和干脆取消限制,都不合适;Shveta Malik 提议单给订阅所有者授 USAGE,但订阅所有者本身没有授权的权限。最后 Amit Kapila 提议把该模式的使用权授给 pg_create_subscription 角色,表级操作仍限本人。
Grigory Smolkin 提交第 5 版补丁,处理流复制与 WAL 归档之间的交互,问题出在管着数千个集群的生产环境里。v5 的主要改动是只传时间线 ID 和段号而不是完整 WAL 文件名,把一部分工作挪到归档进程,并为 walreceiver 与归档进程加共享内存协调。四个设计问题待定:备库要不要更新 pg_stat_archiver、两类 ready 文件怎么处理、切换点计算能否简化、强制归档是否全收进归档进程。
REPACK 的并发执行仍有正确性问题。Mihail Nikalayeu 报告说即使打上针对 SNAPBUILD_CONSISTENT 的最新修复,压力测试照样失败:唯一索引创建时报重复键,pgbench 侧出现除零错误。008 号并发测试被那个修复治好了,007 号仍稳定复现;把 need_shared_catalogs 置为 true 能绕过,说明当前方案有根本缺陷。Antonin Houska 承认要查旧问题。
Tomas Vondra 给刚进主干的在线切换数据校验和写了一套 TAP 测试,用大约 80 个注入点检查状态变更与 checkpointer 之间的竞态。状态分散在四处,各由不同的锁保护。测试发现崩溃恢复后的最终状态会在 on 和 off 之间摇摆,取决于启动器写 XLOG2_CHECKSUMS 记录与 checkpointer 读共享内存做 REDO 的先后。他质疑 DELAY_CHKPT_START 是否真能挡住这类竞态。