PG19 外键批处理缺陷让约束被误标为已验证
Amit Langote 为 PostgreSQL 19 的外键快速路径批处理提交三个修订补丁,起因是 Noah Misch 批评此前把批处理限制在顶层事务。0001 移除该限制,改用子事务标记跟踪缓存条目。0002 修一处数据损坏:PL/pgSQL 的 EXCEPTION 块捕获外键检查错误后 firing_depth 未递减,同一事务里后续的 ALTER TABLE ... ADD FOREIGN KEY 会在有违规行时静默通过。
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
每日精选 PostgreSQL、数据库与云计算资讯
Amit Langote 为 PostgreSQL 19 的外键快速路径批处理提交三个修订补丁,起因是 Noah Misch 批评此前把批处理限制在顶层事务。0001 移除该限制,改用子事务标记跟踪缓存条目。0002 修一处数据损坏:PL/pgSQL 的 EXCEPTION 块捕获外键检查错误后 firing_depth 未递减,同一事务里后续的 ALTER TABLE ... ADD FOREIGN KEY 会在有违规行时静默通过。
全库 VACUUM 遇到并发删表的修复补丁走到 v8,关键是防止无特权用户对无权访问的关系申请 AccessExclusiveLock。缺少权限检查时,普通用户执行 VACUUM FULL 就能把强锁请求排进队列,阻塞所有新连接。Bharath Rupireddy 指出在 get_all_vacuum_rels() 的 ACL 检查里改用 _ext() 变体可以避开回归。Nathan Bossart 确认数日内提交。
Bryan Green 重整了补丁,把 pg_dump 的并行 worker 统一到线程实现。0001 与 0002 是 Windows 专属改动:fmtId() 的缓冲区改为 _Thread_local,进程内 channel 取代回环 socket。0003 到 0005 依赖 Thomas Munro 的 pg_threads.h 推广到其他平台,删掉 fork() 与 pgpipe(),64 个 worker 的上限也一并取消。
pg_buffercache 正在讨论新增 pg_buffercache_relations(),把按关系的缓冲区聚合放到 C 层完成。Khoa Nguyen 在 shared_buffers 为 400GB 的机器上测 v2 补丁,比 SQL 侧聚合快约 25 倍。v3 把 usagecount_avg 换成 usagecount_total,并加上 work_mem 上限控制。超限时报错还是只写进文档,目前仍有分歧。
Jacob Champion 和 Michael Paquier 一致认为把 OpenSSL 3.0 定为 PostgreSQL 20 的最低要求合理,这意味着放弃 1.1.1。Michael 指出 OpenSSL 3.0 自身将在 2026 年 9 月停止维护,但对 PG20 可以接受。Jacob 原以为 3.0 会像 1.0.2 那样被发行版长期保留,RHEL 中途升到 3.5 出乎意料。Tom Lane 认为动因是后量子密码学。
Zsolt Parragi 提议用结构化格式替换 pg_hba.conf、pg_ident.conf 这些配置文件,候选是 TOML 和 JSON5。Matthias van de Meent 反对 TOML,理由是依赖上下文的表语义不适合配置文件。Andrew Dunstan 认为在现有解析器里加 JSON5 改动很小,主要在词法分析器。Greg Sabino Mullane 要求先给出默认 pg_hba.conf 在新格式下的样子。
Neon 给自家 CLI 加了 neon api 命令,同时解决两个问题:面向人设计的 CLI 通常落后于底层 API 的完整能力,而让 AI agent 直接调用原始 API 又有泄露密钥的风险。新命令把 API 访问包成可预期的受控调用,保留完整能力的同时把凭证留在 CLI 一侧。作者 Anthony Giuliano 称它更适合 agent 驱动的自动化工作流。
AWS 在 7 月 8 日宣布 Amazon Aurora DSQL 的 change data capture 一般可用。分布式 SQL 数据库缺少稳定的变更捕获就很难接进真实的生产数据流,CDC 转入 GA 意味着 Aurora DSQL 开始补齐从 OLTP 到事件、分析和搜索系统的下游链路。在它与 Aurora PostgreSQL 之间选型时,可以把 CDC 是否生产可用一并纳入评估。
已合并的提交只建了冲突日志表骨架,真正写入冲突记录的补丁仍在审查。
vacuum 对持有中的槽直接跳过,最坏情况要等一个 checkpoint_timeout 才被清理。
Tom Lane 指出 fmgr_info_copy() 会重置 fn_extra,VARIADIC 的每个参数都要重填缓存。
pqDrainPending() 先更新 inEnd 再查错误返回,另修 LibreSSL 下缺 INT_MAX 的编译失败。
兄弟 NESTED PATH 的列会静默丢失,反解析丢括号,dump 丢掉 ERROR ON EMPTY 子句。
每条 WAL 记录多出三次唤醒调用处在热路径,拟按等待类型分层把内存屏障合并成一次。
压力来自创新节奏、负载增长和 AI 数据需求,问题被归到平台可扩展性而非关系模型。
列式数据库在日志与事件分析上的采用,会改变它与 PostgreSQL、Loki 等系统的边界。
边缘平台的竞争正从 CDN 与 Worker 延伸到全球状态、一致性和配置传播。
实现语言迁移会牵动安全、性能、贡献者生态和长期维护,不只是短期跑分问题。
企业内部 fork 的组件从此有一等的安全通告、私有修复协作和补丁传播流程。
PostgreSQL ODBC 驱动发布 REL-18_00_0002,修的多是安全问题:getPrecisionPart() 里的栈缓冲区溢出、SQLDisconnect 清理阶段的 double-free 堆损坏,以及多处越界读取,日志里也开始屏蔽敏感连接参数。功能上升级到 OpenSSL 3.5.5,修正了 SQLPrimaryKeys 误把 INCLUDE 列纳入结果,并拒绝非法游标名。用 ODBC 连 PostgreSQL 的应用值得尽快跟进。
有用户报告 PostgreSQL 17.6 反复 FATAL 崩溃,信息是 trying to drop stats entry already dropped。Bertrand Drouvot 用自定义扩展手动指定下一个 OID,复现了 OID 重用的场景。根因在备库:某后端持有该 pgstat 条目的本地引用,第一次 DROP 回放时它被标记为已删除却无法释放,第二次 DROP 又撞上同一个 OID,于是触发 FATAL。修复提交 850b9218c8e 已回合稳定分支。
在视图上同时用 FOR PORTION OF 更新和 INSTEAD OF 触发器,会让 PostgreSQL 19 解引用空指针。修法是禁掉这个组合,争的是该在哪一步拦:解析、重写还是执行。Paul Jungwirth 起初认为解析阶段够用,因为 relcache 失效会强制重新解析;Tom Lane 纠正说视图是以重写规则的形式存在磁盘上的,后续重写并不会触发重新解析。Paul 随后用测试验证了解析阶段拦截会让服务器崩溃,重写和执行阶段都能正确挡住。
分区裁剪通常只在按分区键过滤时才生效,按别的列查就得扫遍所有分区。Haki Benita 给出的办法是用检查约束把数据分布告诉优化器:给每个分区上一条形如 session_id BETWEEN 1 AND 4320 的约束,优化器就能靠约束排除法把不相干的分区剪掉。遇到离群值可以写成析取形式的约束,思路借自 PG14 的多区间 BRIN 操作符类;找连续区间用 gaps and islands 那套写法。前提是数据只追加、且过滤列与分区键强相关。
pglayers 把 53 个 PostgreSQL 扩展分别打成从 scratch 构建的最小 Docker 镜像层,用 COPY --from 就能叠到官方 PostgreSQL 镜像上,不必自己编译或装包,项目也提供包含全部扩展的预构建镜像。支持 PostgreSQL 17、18、19 与 amd64、arm64。对 18 及以上版本,它借 extension_control_path 做隔离布局,避免文件冲突,允许同一个库多版本共存。
实例起不来的时候,常规 SQL 工具都用不上。PDU 直接读数据文件和 WAL 归档,不修改原始数据目录,在离线状态下重建库、schema 和表的元数据,把单表、整个 schema 或整库导出成 CSV。对误删误改,它还能从 WAL 记录或归档里还原受影响的行,不依赖 VACUUM 之前残留的元组。支持 PostgreSQL 14 到 18。作者把它定位成应急恢复的辅助手段,不能替代常规备份或时间点恢复。
Barman 是 EDB 维护的 PostgreSQL 远程备份与灾难恢复工具,基于时间点恢复,让 DBA 在一处管理多台远端服务器的备份目录和恢复流程。3.19.0 与 3.19.1 分别发布于 5 月 20 日和 26 日,本次一并公告。3.19.0 的重点是云存储恢复:标准的 barman restore 命令现在可以直接用于云上备份;同时引入了备份的导出与导入命令,另有若干改进和缺陷修复。3.19.1 是在此基础上的修复版本。
Autobase 2.9.0 把重心放在部署之后的日常管理。认证从共用一个访问令牌改成按邮箱和密码的独立用户,操作日志随之记录每次变更由谁执行,审计链条补齐。PostgreSQL 参数、pg_hba.conf 和连接池配置现在都能直接在界面里改,专家模式还内置了带 diff 的 YAML 编辑器,应用前可以先看变更。Autobase 面向自托管环境,目标是在自有基础设施上提供接近 DBaaS 的 PostgreSQL 管理体验。
PgDog 用一篇文章解释为什么还要再写一个连接池:它想把连接池化、路由、分片和运维手感放在同一个代理层里解决,而不是让用户各拼一套。PostgreSQL 的规模化瓶颈常常不在某条 SQL,而在连接数、代理、拓扑和运维控制面。文章在 Hacker News 上热度不低,说明社区确实还想要一个比 PgBouncer 更贴合分片与云环境的 Postgres 原生代理。选型时仍要看清它与 PgBouncer、Odyssey、pgcat 在成熟度和运维经验上的差距。
外键原生支持之前用触发器实现参照完整性的老模块,清理补丁由 Nathan Bossart 提交。
新函数会报告已发起、同步执行、异步执行、自行完成与句柄等待等计数,开销尚有争议。
走 SSH 隧道或连接池时本地端口和真实端口不一致,用通配端口绕开又不安全。
争议在于活跃复制源数量该和哪个值比较,用户自建且被跟踪的源同样要算进去。
Peter Eisentraut 指出出错返回 -1 时仍被累加进 inEnd,格式串也会把 -1 打成巨大无符号数。
OpenSSL 1.1.1 仍是拦路石;若把几个老发行版移出统计,Python 3.9 有望成为下限。
Show HN 项目,把各实例类型的吞吐与单位成本放在一起对比。
ParadeDB 复盘自家基准的迭代过程,说明测法不同结论就会不同。
按 Purdue 模型分层部署,用超表和连续聚合关联 GPU 负载与供电制冷遥测。
作者把托管服务与自建机器放在同一组负载下测,重点落在成本与吞吐的比值。
本地优先工具和 agent 越来越多地用 SQLite,迁移能力是长期维护的门槛。
Heikki Linnakangas 已把一处存储层的错删修复推进 master。mdunlinkfiletag 本该按传入的 fork 与段号删文件,实际删掉的却是主 fork 的第 0 段。Thomas Munro 建议反过来做:不去泛化 register_unlink_segment(),而是拿掉它的 fork 与段参数,因为外部代码没有理由往 md.c 的队列里塞删除请求。Matthias van de Meent 确认那条分支只在主 fork 上才走到。
Ewan Young 报告 pg_restore_attribute_stats() 接收范围边界直方图时不做校验。compute_range_stats() 维持着两条不变式:直方图里不能有空 range,上下界都要升序排列。range 与 multirange 的选择率估算器依赖这两条,一旦被违反,轻则算出错误甚至为负的选择率,重则在带断言的构建里直接让进程崩溃。补丁改为导入时校验直方图,对不合法输入以 WARNING 拒绝,与其他统计信息的处理方式一致。
Peter Geoghegan 发出索引预取补丁的 V29,因为 V28 已经打不干净。这一版有两项微优化:索引访问方法可以在 amgetbatch 返回时直接设置 knownEndBackward 与 knownEndForward,让简单点查询只调一次 amgetbatch;索引元组计数改成每批计一次而不是每元组一次,语义与位图索引扫描一致。V29 还带了一个 EXPLAIN (ANALYZE, IO) 补丁,索引扫描做 IO 预取时可以看到读流的诊断信息。
来自 Databricks 的 Dhruv Aron 提议把共享缓冲区的查找表从 dynahash 换成专用哈希表:目录、段、桶链、空闲列表那几层结构,对这个固定大小的场景太重了。基准显示插入、查找和删除都明显变快。Heikki Linnakangas 确认目录这层间接对所有共享内存哈希表都多余,因为它们都不支持动态扩容,新表内存占用也小得多。他同时担心 InvalidateBuffer() 持自旋锁的时间变长,要求补上大量哈希冲突下的最坏情况基准。
AWS 的 Ramdas Gutlapalli 梳理了 PostgreSQL 18 在逻辑复制上的四项改动。新的发布参数 publish_generated_columns 让 STORED 生成列可以进入复制流;pg_stat_subscription_stats 增加七个冲突计数器,把笼统的错误数拆成按冲突类型统计;新订阅的 streaming 默认值改为 parallel;新增 idle_replication_slot_timeout,自动废弃长期闲置的复制槽。
Cybertec 的 Wellingtone Luvonga 演示了怎么用 CloudNativePG 的分布式拓扑在多个 Kubernetes 集群之间做跨区域容灾。方案拿 MinIO 当兼容 S3 的对象存储,主集群用 barman-cloud 插件持续归档 WAL,副本集群轮询同一份对象存储完成初始化并保持同步。两点要注意:复制延迟取决于对象存储吞吐而非直连流复制,主副集群还必须跑完全相同的 PostgreSQL 与 operator 版本。
Januscape 公开了一个 x86 KVM 影子 MMU 的 guest 到 host 逃逸问题,编号 CVE-2026-53359,影响范围从 2010 年 8 月的提交一直到 2026 年 6 月 16 日的修复提交。已公开的 PoC 足以让 guest 触发宿主内核 panic,作者称完整可控的逃逸利用存在但未发布。接收不可信 guest、又开了嵌套虚拟化的环境风险最高。跑 KVM 的团队应确认宿主内核是否包含提交 81ccda30b4e8,必要时先关掉嵌套虚拟化。
根页面上 so->curBlkno 没被设置,导致 gistkillitems() 在根页面的行为不安全。
测试覆盖了反复运行的异步测试与 SSL 下的大批量 COPY TO STDOUT,未见挂起或回归。
Michael Paquier 与 Christoph Berg 认为该换,且 on 并非默认值,只影响显式设过的人。
Amit Kapila 称那是 apply 循环最外层的 catch,插入失败时复制源点位不推进,不会发散。
概念验证内嵌 tomlc17 演示 pg_hosts;Tom Lane 质疑迁移动力不足,Andrew Dunstan 担心维护负担。
vacuum 只立即失效无人持有的槽,仍被持有的交给 checkpointer 常规扫描处理。
订阅过滤器触发 Lambda 把日志转成 CSV 按日期分区,90 天转低频,一年后归档。
统计过期、缺连接池、autovacuum 不足、内存参数失调与锁竞争,逐条给出排查方向。
sshd -G 输出大小写有变,seccomp 或 no_new_privs 失败改为致命错误,重协商也更严格。
公共证书可以走标准协议签发,自建的 ACME 胶水代码有机会减掉一部分。
pgJDBC 42.7.12 修复 CVE-2026-54291。连接参数写了 channelBinding=require 时,握手仍可能从带通道绑定的 SCRAM-SHA-256-PLUS 静默降级为普通 SCRAM-SHA-256,中间人防护就此失效。成因有两处:内置 SCRAM 客户端库无法为某些证书推导通道绑定哈希时返回空字节数组而不报错,pgJDBC 的认证器又没强制执行该要求。受影响的是 42.7.4 到 42.7.11。
pg_dump 的目录格式存在路径遍历风险:攻击者构造恶意的 toc.dat 或 blobs_*.toc 条目,就能把写入路径指到任意位置,例如让 blob_16388.dat 落到上级目录的 /etc/passwd。Dilip Kumar 提出直接匹配 . 和 .. 两个字符串,Daniel Gustafsson 指出这盖不住嵌在路径中间的 .. 序列,主张改用更精确的模式匹配,并补上恶意 TOC 文件的测试。
逻辑复制冲突日志历史表的预备补丁 a5918fd 刚进主干,Robert Haas 就提出两处设计问题。其一,在 try/catch 中途暂存错误再调用 AbortOutOfAnyTransaction(),若调用栈上还有未执行的 catch 块,行为不可预期。其二,往冲突日志表插入记录本身失败时,这张表会与被复制的表永久失去同步。他认为方案从根上就有缺陷,呼吁回退提交并重新设计。
Bertrand Drouvot 编写、Michael Paquier 于 6 月 30 日提交的这个特性,给 PostgreSQL 20 加上按后端统计的锁信息。新函数 pg_stat_get_backend_lock() 接收一个进程号,按锁类型每种返回一行,字段有 locktype、waits、wait_time 和 fastpath_exceeded。它与 pg_stat_activity 连接后就能看到某个连接实时的锁等待行为,补上了聚合视图看不到单连接的短板。
5 月 14 日发布的 PostgreSQL 14.23、15.18、16.14 带来一个复制死锁:备库或时间点恢复实例回放由 14.20、15.15、16.11 及更早版本产生的 WAL 时,startup 进程会在 MultiXactOffsetSLRU 锁上自死锁,pg_stat_activity 里表现为该锁的等待事件,恢复就此挂住。修复已在 5 月 27 日提交,下个小版本计划 8 月 13 日发布。在那之前可退回第一季度版本,或分两步升级。
CloudNativePG 1.30.0 新增 DatabaseRole CRD,用声明式、适合 GitOps 的方式管理 PostgreSQL 角色,并引入基于 Kubernetes Lease 的主节点选举以提升故障切换安全性。安全方面修掉两个漏洞:CVE-2026-55769 靠固定 search_path 防止权限提升,CVE-2026-55765 在建角色和改角色前把明文口令转成 SCRAM-SHA-256。
pg_ivm 提供可增量维护的物化视图 IMMV。IVM Development Group 发布的 1.15 最要紧的变化是支持 pg_dump 与 pg_upgrade 场景下的元数据恢复:还原数据库或大版本升级之后不必再手动删掉重建 IMMV,新增的 pg_ivm_dump_metadata 工具和 restore_immv() 函数会把元数据恢复回来。这一版还修掉外连接视图维护时的段错误。
pgBackRest、Barman 这类工具的增量链有个脆弱之处:链上任何一个备份损坏或被删掉,下游备份就全部作废,而这种事往往等到凌晨三点恢复时才发现。Hans-Jürgen Schönig 解释 pg_hardstorage 为何干脆不做增量链,改用内容寻址存储:每个数据块以 SHA-256 哈希为标识,不同备份共享相同的块,删掉任意一个都不影响其他备份。一套 487 GiB 的生产库按小时备份一周,去重率 87.5%。
Jeff Davis 确认这是重构提交 5a38104 带来的回归,相关修复已拆成四个补丁。
Gabriele Bartolini 的 CNPG 配方第 25 篇,演示新版角色 CRD 与证书认证怎么配。
6 月 16 至 18 日的免费线上会议,录像提供 16 种语言字幕,含 Postgres 19 黑客圆桌。
Tomas Vondra 归纳出四个待解问题,其中代价估算与分区表多消费者下推最棘手。
Heikki Linnakangas 建议把唤醒逻辑收进 ApplyWalRecord(),性能测试尚未做。
Tristan Partin 主张取 shared_data_len,因为部分内置统计项根本不上报 shared_size。
Fujii Masao 已在 15 到 18 各分支恢复 basebackup_progress_done(),外部备份工具可能仍在调用。
作者实测包装后的路径每字节 CPU 开销约为直接 io.Copy 的 3.4 倍。
PostgreSQL 19 为外键检查加了快速路径,批量操作下暴露出越界写入和漏掉约束检查的问题,提交 4113873 的做法是把批处理限制在顶层事务。Noah Misch 反对这个修法:用到 SAVEPOINT 时会带来约 1.6 倍的性能回退,也偏离了按子事务跟踪资源的惯例,代码并未变简单。他主张改成按子事务跟踪批处理来源,并指出 AfterTriggerEndSubXact() 没有重置 firing_depth,捕获触发器错误后外键校验可能被错误路由。
Radim Marek 拆解了堆页内部的清理过程。页面剪枝只在单个堆页里回收死元组占的字节并推进 pd_upper 做碎片整理,普通 SELECT 碰到 HOT 链时就会顺手做,VACUUM 的第一阶段也对每个页做一遍。有索引时行指针走 LP_NORMAL 到 LP_DEAD 再到 LP_UNUSED,无索引时一步到位;LP_DEAD 表示空间已回收但 TID 仍被索引引用。HOT 链的头指针会转成 LP_REDIRECT,索引顺着它找到当前版本,从而完全省掉索引更新。
PostGIS 团队发布 3.7.0alpha1,要求 PostgreSQL 14 到 19beta1、GEOS 3.10 以上、Proj 6.1 以上。这一版丢掉了对 PostgreSQL 12 与 13 的支持,把 address_standardizer 和 tiger_geocoder 移出主仓库;拓扑函数把容差 0 当作字面零,按精度取容差要改写 -1。新增 ST_CoverageEdges、ST_MinimumSpanningTree 等函数。
credcheck 在创建用户、改密码和改名时执行统一的凭据规则,涵盖复杂度、历史复用、最短有效期、认证失败次数与首次登录强制改密。HexaCluster 发布的 5.0 是大版本更新,新增 PostgreSQL 19 兼容性,并让密码历史机制具备复制感知能力;打开 credcheck.superuser_nocheck 后超级用户的建角色与改角色会跳过检查。升级后需要重启 PostgreSQL 才能重新加载该库。
burnside project 开源的 pg-cdc 读取 PostgreSQL 的 WAL,把变更以 Apache Iceberg 表的形式写入 AWS S3,并自动在 Glue Catalog 注册表,用 Lake Formation 的标签控制读取,消费方走 IAM 认证,不需要数据库账号密码。工具只有一个二进制,不依赖 JVM;数据流严格单向,架构上不存在回写生产库的路径。每次刷新生成一个 Iceberg 快照,可以对 CDC 历史做时间旅行查询。
Simon Willison 发布 sqlite-utils 4.0rc2,其中大量工作由 Claude Fable 辅助完成,他估算未计补贴的成本约 149.25 美元,又让 GPT-5.5 做交叉审查,找出两个与事务和 RETURNING 相关的问题。这是一份高水平开发者用强模型做真实开源发布的完整账目:产出确实有,但审查成本同样真实。对数据库工具而言可借鉴的是,价值不在于让模型一口气写完,而在于让不同模型、测试与人工复核专门盯住事务、副作用和文档承诺。
用 advisory lock 模拟 Oracle DBMS_LOCK 的扩展,该版本不再兼容 2.0 之前的 pg_background。
让 DML 出错后不回滚而是把错误记进日志表的扩展,本次为维护版本并修掉两个重要缺陷。
Tom Lane 认定是提交 27da1a796 漏掉的场景,Chao Li 的 v2 补丁已回合到 PostgreSQL 19。
基本的索引扫描已能跑通,但带虚拟生成列谓词的部分索引还走不了 Index Only Scan。
讨论集中在显式 SQL 加轻量映射是否比全功能 ORM 更可控,以及 Ecto、Dapper 这类中间形态。
7 月 2 日新增 US West(北加州)的两个物理可用区,多云托管数据库继续铺开。
Armin Ronacher 的实验里,嵌套 edits 结构常出现多余键与别名,严格工具调用能消除这类失败。
OOM killer 杀掉正在改共享内存的后端进程时,共享内存可能停在不一致状态,有损坏已存数据的风险;postmaster 随即终止所有后端,重启还要跑崩溃恢复。Ubicloud 的 Burak Yucesoy 说明他们把 vm.overcommit_memory 设为 2,用分配阶段的 ENOMEM 换掉这种又晚又暴烈的失败,vm.overcommit_kbytes 取总内存的 80% 加 2GB。代价是机器混跑别的负载时,数据库也会被牵连着拿到 ENOMEM。
提交 85b7efa1cdd 带来一处回归,psql 的 \d tablename 从索引扫描退化成顺序扫描,目录一大就明显变慢。Andres Freund 最先发现,Jelte Fennema-Nio 定位根因并给出恢复索引扫描的补丁。Tom Lane 审查后认为方向正确,但必须同时检查两个排序规则是否都是确定性的,只查一个不够。他还指出原提交说明有几处不准确:问题只影响精确匹配而不影响前缀匹配,正则表达式和 LIKE 模式都会中招。修订后的 v2 补丁已附在邮件里。
Dean Rasheed 发布全局临时表补丁的 v6,修掉了 Nico Williams 借助大模型辅助审查找出的一批问题。最要紧的一处会造成数据损坏:TRUNCATE 把会话级的冻结 XID 错误写进了共享的 pg_class。其余包括 vacuum.c 的未初始化变量、少拿 ProcArrayLock、事务结束时没重置的计数器。设计上 v6 把 pg_class 里全局临时表的冻结 XID 一律置零,只更新 pg_temp_class。
Parallel Append 让不同工作进程同时扫描不同的分区或 UNION ALL 分支,而不是全挤在同一个子节点上,是分区之间的粗粒度并行。Christophe Pettus 指出它还能混用可并行与不可并行的子节点,普通 Append 做不到,对只有非并行索引的分区表尤其有用。参数默认打开。小查询并行后反而变慢时,可以临时关掉确认是不是启动开销盖过收益,但正确的收尾是更新统计、调 parallel_workers 或代价阈值,再改回默认。
Sysdig 记录了一条名为 JADEPUFFER 的攻击链:入侵者利用 Langflow 的漏洞拿下实例,再自动化地对能触达的数据库实施勒索。这类 AI 与低代码工具往往被快速部署到公网,权限给得很大,硬化和补丁都跟不上,于是成了攻击者优先挑的软柿子。可行的对策是把 agent 与 flow 类服务默认放回内网、强制认证、限制出站访问,把数据库凭据与服务隔离开,并把它们纳入常规漏洞扫描,而不是当试验品放着不管。
Bertrand Drouvot 改用 SUBSCRIPTIONOID 查缓存,又确认 IF EXISTS 会忽略 missing_ok。
Noah Misch 发现提交 2f094e7 的文档与实现不符,并建议连带复查所有 RELKIND_VIEW 引用。
Show HN 项目,声称在多张表之间做假名化替换时仍能维持外键引用的一致。
文章复盘其内部推广 secret scanning、分流告警和跟进修复的做法。
数据校验和能发现存储层悄悄损坏的页,过去只能在初始化集簇时决定开关,事后转换要用 pg_checksums 停机离线跑,中断还无法续跑。PostgreSQL 18 已把校验和设为新集簇默认,19 再提供 pg_enable_data_checksums(),由后台工作进程在线遍历数据页完成转换,并像基于代价的 VACUUM 一样限速。data_checksums 参数会显示转换进度,关闭时不重写页面,几乎瞬时完成。
PostgreSQL 执行器一次只处理一行,扫描节点的每行开销在分析型查询里格外明显。Amit Langote 发出执行器批处理补丁第 8 版,相比上一版重新设计:批次直接内嵌在扫描槽里,新增两个 TableAM 回调,去掉 RowBatch 容器、executor_batch_rows 参数和 EXPLAIN BATCHES 输出,批次固定为堆表一页的可见元组。本轮只改造顺序扫描,count(*) 在全可见页上快 20–21%。
REPACK CONCURRENTLY 在含生成列的表上会失败,并发出现非 HOT UPDATE 时报出找不到列的生成表达式。Álvaro Herrera 已提交修复,把 catalog 行的复制限制在并发模式下。同一轮还改了 updatedCols 的构建,忽略已删除的列:它们不可能是索引键列,标记为已更新在语义上就是错的。Ewan Young 用注入点测试验证了两处修复,后一处只轻微影响 btree 索引提示。
把 effective_io_concurrency 设到 64 或更高之后,对带 TOAST 数据的临时表做顺序扫描,ReadStream 的预读会把全部本地缓冲区 pin 住,TOAST 索引查找随即报出没有空闲本地缓冲区。Induja Sreekanthan 给出复现步骤和补丁,把 max_pinned_buffers 限制为本地缓冲区的 75%。根因与另一个已知缺陷相同,PostgreSQL 19 已把预读预算削到四分之一,是否回合 18 待定。
嵌套循环是唯一能配合任意连接条件的方式,不等值连接和交叉连接都只能靠它,所以 enable_nestloop 默认打开。Christophe Pettus 在 GUC 逐项解读系列里写道,它出问题的典型形态是规划器以为外侧只返回五行,实际来了几十万行,本来便宜的索引查找被执行几十万次,查询从几毫秒拖成几分钟。临时关掉可以确认病灶,但病根是基数估算偏差,该去 ANALYZE、调统计目标或建扩展统计。
工作流引擎通常自带存储,与业务数据分处两地,一致性只能靠补偿逻辑维持。DBOS 的这篇文章主张把 workflow 状态与应用数据放进同一个 Postgres,用一次数据库事务解决其中一部分分布式系统复杂性,durable execution 和 agent 工作流因此重新向数据库靠拢。文章原发于 6 月 15 日,7 月初重新热起来。真这么用,先撞上的通常是运维边界:队列表膨胀、VACUUM 压力和长事务持锁。
Fujii Masao 提交后 buildfarm 因 verbose 日志插入 SQLSTATE 而失败,修复已推送。
并发 ALTER SUBSCRIPTION 会因过期快照踩到断言,pg_subscription 两个新列的文档也已补上。
Michael Paquier 应用 v3,把两个缓冲区描述符取值函数的参数统一改为有符号整数。
Michael Paquier 与 Fujii Masao 反对 on 的含义随编译选项变化,需要 lz4 就显式指定。
这个 PostgreSQL 贡献者培养计划的第三次线下聚会,总结了议题、已提交补丁与下一步方向。
这个基于 mmap 的极简键值库是许多底层系统的长期依赖,1.0 让它重回选型对比表。
AWS 给出的案例把重点放在预生产镜像、复制延迟、切换窗口与回滚条件,而不是功能可用性。
官网已把 6.0.0 标为最新稳定版,升级前需核对 Buildah、Skopeo、Netavark 版本与本地数据迁移。
企业管理用户可经流式端点或 REST API 取会话记录,并接入审计日志与 Microsoft Purview。