PostgreSQL 博览
每日精选 PostgreSQL、数据库与云计算资讯
Andres FreundPostgreSQL hackers
PostgreSQL 19 的 SQL/PGQ 属性图在目录层面还很粗糙。Andres Freund 指出属性图不该有 pg_attribute 条目,pg_dump 的依赖追踪也不完整,遗漏属性类型依赖会导致恢复顺序出错,属性图被塞进 dumpTableSchema() 而没有独立处理函数。AI 辅助审查还发现 CASCADE 删除后残留孤立元数据、performDeletion() 缺少缓存失效、图与物化视图的循环依赖无法恢复。
Christophe Pettusthebuild.com
local_preload_libraries 在建立连接时把共享库加载进后端,与 session_preload_libraries 类似但更严:后者只有超级用户能设,前者任何角色都能设,代价是只许从 $libdir/plugins 加载。这个目录就是它全部的安全模型,PostgreSQL 从不往里放东西,得由管理员自己决定放什么。Christophe Pettus 建议 DBA 优先用 ALTER ROLE 配 session_preload_libraries。
AWSAWS 博客
AWS Glue 6.0 已在所有可用区域正式发布,API 不变,用 --glue-version 选择。运行时底座换成 Spark 4.1、Python 3.12 和 Scala 2.13,并支持 Iceberg 1.11.0 的完整 v3 规范:VARIANT 与 shredding 让 JSON、日志和事件数据不必预先展平,另有 Geometry、纳秒时间戳和 Arrow 原生的 Python UDF。AWS 称价格比前版低 30%,该口径不含存储与网络。
Linalina.sh
e164.arpa 把电话号码映射到 SIP 和 VoIP 路由,作者扫描时发现三个国家码区仍指向失效的 nameserver。以约 5 欧元买下过期的 enum.org.uk 之后,作者成为 +290、+246、+247 的兜底权威服务器,并记录到大量 ENUM 查询元数据。原文强调这套公开系统整体已极少使用,可确认的结论是被遗忘的委派会长期泄露路由元数据。原文发表于 7 月 30 日,本期只是重新传播。
NanoHertz CommunicationsTigerData 博客
EXPLAIN ANALYZE 同时给出 Planning Time 和 Execution Time,工程师却往往只看后者。在一张按天分了 500 个分区的表上,规划一条简单聚合查询的耗时可能是执行的 9 倍,因为规划器必须逐个加载并评估分区才能剪枝,继续加索引只会让候选路径更多。执行侧的特征完全不同:溢写临时文件、大量缓冲区读取、过滤条件丢掉大批数据。有函数依赖的列可以用 CREATE STATISTICS 改善估算。
Shaun ThomaspgEdge 博客
随机的 UUIDv4 会把 B-tree 索引搅得七零八落:插入位置不可预测,页面在随机处反复分裂,留下一堆半空页。Shaun Thomas 在 100 万行上量了三种主键:随机 UUID 索引 38 MB,叶页填充率 71.53%,碎片率 49.89%;UUIDv7 把毫秒时间戳放在高位,索引 30 MB,填充率 89.98%,零碎片;Snowflake 式 BIGINT 只要 21 MB。单机系统仍该用序列。
Christophe Pettusthebuild.com
lock_timeout 限定一条语句等待某个重量级锁的时长,超时报 55P03,默认 0 即不限制。它与 statement_timeout 的区别在于只管等待,锁一旦拿到就可以一直持有;deadlock_timeout 默认一秒后才记录锁等待,把 lock_timeout 设得更低,语句会在留下日志之前就失败。Christophe Pettus 建议只给迁移角色和工具设 1 到 3 秒并配重试,注意每次取锁各算一次超时。
Mikhail Shytskoseedfa.st
用 INSERT 显式指定 id 时,serial 或 GENERATED AS IDENTITY 的默认值根本不会求值,序列停在原地,表却一直在长。于是导入全程成功,应用发出的第一条插入却撞上主键冲突。Mikhail Shytsko 给出的修法是 setval 配合 pg_get_serial_sequence(),而不是硬写序列名;空表要用三参数形式避免静默失败,标识列则直接 ALTER TABLE ... RESTART WITH。
Alexey Evlampiev个人博客
Alexey Evlampiev 主张校验、鉴权和状态迁移本来就该在一个事务里完成,事务性 API 的边界应当从应用层移进 PostgreSQL。他把带类型契约、鉴权策略、隔离级别声明和测试的具名数据库函数当作设计单元,HTTP 路由、OpenAPI 与 MCP 工具都只是这些操作的绑定。路由目录做成可查询的表,版本差异写成谓词而非分叉代码,鉴权交给行级安全。流媒体与编排仍留在外层。
BunBun 博客
这一版把运行时主体从 Zig 重写为 Rust,同时加入无头浏览器、图像、Markdown、cron 与 XML 等内置能力,支持 Windows ARM64 和并行的 bun test。对连 PostgreSQL 的团队更要紧的是两处行为变化:Bun.sql 开始遵守 PGSSLMODE,环境为 require 而服务端没有 TLS 时连接直接失败,不再静默明文回退;infinity 被映射为 JavaScript 的正负无穷。
Rust Security Response TeamRust 博客
恶意行为发生在依赖的构建脚本里,工程即使从不调用库 API,一次构建也可能触发远程载荷。Rust 安全响应团队确认 proc-macro1 的构建脚本会下载并执行恶意载荷,而 arrayref、internment 和 append-only-vec 被重新发布并加上了对它的依赖,暴露窗口分别约 86、90 和 107 分钟。团队已删除恶意版本、恢复被恶意撤回的版本并锁定发布账号。
GitHubGitHub 博客
GitHub 已是代码、CI、议题、发布和智能体入口的共享故障域,这份复盘给出的是完整因果链。事故持续 7 小时 47 分钟,Central US 的关键组件没能随流量峰值扩容,压力扩散到认证和多项服务,Copilot 客户端的重试循环又在恢复期放大了流量。官方称月提交数已从 4 月的 14 亿增至 29 亿,后续动作包括统一重试上限与预算、可变超时和面向大仓库的线性读扩容。
Bharath RupireddyPostgreSQL hackers
PL/pgSQL、PL/Perl 等语言的异常块捕获错误时,SQL 可调用的复制槽函数不会释放已获取的槽,因为异常处理跑在内部子事务里,绕过了顶层错误处理路径。修法是新增 AtEOSubXact_ReplicationSlot(),在子事务结束时释放。Bharath Rupireddy 在 v13 里处理了大部分审查意见,并提议回移到 PG14:这个缺陷用简单 SQL 就能复现,可能导致崩溃、槽泄漏和 vacuum 受阻。
Palak ChaturvediPostgreSQL hackers
shared_buffers 在线调整补丁集被审出不少问题。Palak Chaturvedi 发现 TAP 测试有约五分之一概率因 SIGHUP 投递时序而失败。Yuhang Qiu 的问题更深:持有全部分区锁期间不检查中断、madvise(MADV_REMOVE) 的范围盖住了 PROT_NONE 区域引发 EACCES 崩溃、EvictExtraBuffers() 用错缓冲区标志,而且大页对齐让测试其实没触发到 madvise。
LibreDBPostgreSQL 新闻
LibreDB Studio 是 MIT 许可的自托管 PostgreSQL SQL IDE,在浏览器里使用,以容器、Helm Chart 或 npm 包部署在它所管理的数据库旁,而不是装在每个开发者机器上。连接走连接池,用显式的 BEGIN/COMMIT/ROLLBACK 配合自动回滚超时,靠记录的后端 PID 取消查询。模式内省为上百张表的库做了分轮加载,监控读 pg_stat_* 视图,权限不足时降级显示而不是直接失败。
Ken ZhangAWS 数据库博客
Ken Zhang 梳理了多语言全文检索从 SQL Server 迁到 Aurora PostgreSQL 或 RDS 时的结果差异。SQL Server 用列语言、停用词表和重音敏感设置统一管理排序规则与检索,PostgreSQL 则把排序规则和文本搜索配置分开。文章覆盖八种语言的分词,用 unaccent 与 ICU 做不区分重音的检索,用 pg_bigm 给中日韩文本建二元组索引。托管环境装不了自定义词典是主要限制。
Bertrand Drouvot个人博客
Bertrand Drouvot 发布调试工具 pg_shmemviz:它不附着到运行中的服务器,而是对共享内存做一次顺序无锁复制存成离线快照,再用浏览器交互查看。四个视图分别是分配布局图、借 DWARF 信息展开结构体字段与填充的检查器、按字段分类的原始字节面板,以及可选的 pg_buffercache 摘要,还能比对两次快照。需要带调试符号的构建,作者明确不要在生产实例上跑。
Andrei LepikhovpgEdge 博客
PostgreSQL 目前的并行聚合走部分聚合加最终聚合,数据压不下去时,重新分组的最终阶段会吃掉大部分执行时间。Andrei Lepikhov 试了让所有 worker 直接更新一张共享哈希表:48 核机器上八个 worker,分布均匀时快 4.82 倍,2% 倾斜时 4.49 倍,但 80-20 分布已经打平,热点占到 95% 时只剩 0.04 倍。他的结论是进程模型为共享可变状态付出的代价远高于线程模型,不如按分组哈希做分区。
Jimmy Angelakos个人博客
Jimmy Angelakos 发布 pg_statviz 1.2。这个扩展与命令行工具的组合做内部统计的时序分析与可视化,全部在库内完成,不需要外部代理或常驻连接。新版支持 PostgreSQL 19 的新 WAL 指标与配置项,覆盖 13 到 19 beta3;新增阻塞锁分析模块,用 pg_blocking_pids() 按锁类型追踪阻塞方;AI 集成新增 OpenAI 及兼容服务。
Christoph BergPostgreSQL 新闻
Christoph Berg 宣布 apt.postgresql.org 增加龙芯 loong64 架构,构建主机跑在社区提供的龙芯 3B6000 主板上。软件包的引导构建已于 8 月初完成,现在可以直接从官方源安装。只有 GIS 相关的一组包例外,postgis、pgrouting、mobilitydb 和 pgsql-ogr-fdw 仍要等下一个 postgis 版本。国产平台用官方源部署 PostgreSQL 的路径由此打通。
LinearLinear 工程博客
Linear 的同步动作已超过 20TB,旧读路径要在越来越大的 ID 区间上做权限和订阅数组的重叠筛选,尾延迟持续上升。新路径通过 PostgreSQL 的发布把已提交动作的紧凑元数据复制到 Turbopuffer 的倒排表,只用它返回候选 ID,完整负载最后仍回 PostgreSQL 取。官方称索引复制 p50 约 1 秒、p95 数秒,并用不可用回退和影子模式对账来兜住延迟与错误。
Melanie PlagemanPostgreSQL hackers
Melanie Plageman 发出检查点写合并补丁系列的 v16。最大的变化是放弃针对 COPY FROM 的 ring-sweep 方案,改为完全依赖基于邻居的积极刷写,因为实验表明没有异步 I/O 时 ring-sweep 没有可测量的收益,只用于调试的 GUC 也一并移除。Andrey Borodin 指出的中间提交冗余和模块边界模糊都已处理。Haibo Yan 追问接口是否适配 AIO,Plageman 承认后续仍需重构。
Vibhor Kumar个人博客
Vibhor Kumar 把智能体产生的数据分成三类:可丢弃的临时工作状态、需要明确同步规则的持久状态,以及必须受治理的权威企业数据。他指出 PostgreSQL 正在同时扮演两种角色,PGlite 跑在智能体沙箱里,中心实例提供共享状态与控制面。他的警告是:本地自治不等于企业权威,不加控制地同步多个实例,只会把不完整或错误的数据扩散出去,同时削弱治理。
Christophe Pettusthebuild.com
join_collapse_limit 决定显式 JOIN 是否被摊平成可由规划器自由调序的表列表,自底向上摊平,一旦超过这个数就停手。默认 8,与 from_collapse_limit 刻意一致;geqo_threshold 默认 12,调过 12 就会切到遗传算法,用随机采样换掉穷举。Christophe Pettus 建议配置文件里别动,只在确知比统计信息更懂时用 SET LOCAL 设成 1。
Jelte Fennema-NioPostgreSQL hackers
Jelte Fennema-Nio 提交了新版 Python/pytest 测试框架方案。他此前借助大模型把约一半 Perl 测试转成 Python,据此发现的不足在这一版得到修订。补丁集共 12 个,涵盖 meson 与 CI 集成、约 55 个方法的服务器管理框架、类型注解、后台 SQL 支持,以及与 Perl 框架共存的端口锁定机制。Andres Freund 反对增加 CI 日志量,要求转换前先做覆盖率对比。
Amit LangotePostgreSQL hackers
Amit Langote 发出针对 PG19 外键批量检查快速路径的 v2 补丁。先前的修复把批处理限制在顶层事务,Noah Misch 批评这在用 savepoint 时会掉性能,也不符合按子事务追踪资源的惯例。新版改为新增 AtEOSubXact_RI(),在每个缓存条目上记录子事务号。随后又发现缓存只以约束 OID 为键,导致同一约束的嵌套检查复用了外层条目,v2 把键改成约束 OID 加查询深度。
Jeremy Schneiderardentperf.com
Kubernetes 靠 container_memory_working_set_bytes 决定驱逐哪个 Pod,这个值只扣掉不活跃的页缓存 inactive_file。Jeremy Schneider 用六组测试说明:Postgres 的 shared buffers 以 shmem 形式存在,内核回收不了,而活跃页缓存明明可回收却被算了进去,指标给不出有用的预警。他建议改用当前用量减去全部页缓存,并把 shmem 与 anon 分开采集。
Christopher WinslettCrunchy Data 博客
Christopher Winslett 复盘 Crunchy Data 过去写下的建议在 19 里的变化。异步 I/O 让后端可以排队多个读请求,云盘上最高快 3 倍,BRIN 与并行顺序扫描的取舍需要重新测。JIT 从 12 以来一直默认开启,19 因可靠性问题改为默认关闭,分析型负载要自己打开并复核计划。TOAST 默认压缩由 pglz 换成 LZ4,只影响新写入的值。
Steve DilleAWS 数据库博客
Steve Dille 介绍 pgvector 的 HNSW 二值量化:binary_quantize() 把 float32 每维压成一比特,索引体积最多缩小 32 倍,普通实例的缓冲池就能装下完整索引,查询时再对候选做全精度重排补回召回率。在 LAION 100M、OpenAI 5M 和 Cohere 10M 上,向量分布均匀时建索引速度和查询吞吐都优于磁盘型 ANN。分布集中的嵌入模型量化后掉得厉害,上线前须用真实数据验证召回。
Joshua DrakeCommand Prompt 博客
Command Prompt 发布列式表访问方法 PgColumnar 的 1.0 Alpha2。这一版新增只读的 Apache Iceberg 表支持和 S3 兼容对象存储上的 Parquet、Iceberg 读取,带来自动维护守护进程,并根据对抗性审计修掉六处内存安全问题。性能方面,参数化谓词现在能驱动块组跳过,删除向量改走索引而非顺序扫描。项目提醒接口在 1.0 之前仍可能变动。
Dimitri Fontainetapoueh.org
Dimitri Fontaine 放出免费教程 YeSQL:24 节短课,每节一个概念配一条可运行的查询,不需要注册。内容分 SQL 基础、窗口函数、聚合、连接、性能、模式设计六个方向,涵盖 NULL 语义、运行总计、LATERAL 连接和 EXPLAIN 阅读。查询用 PGlite 在浏览器里直接执行,数据是 F1 赛事等真实数据集。每节都链到《The Art of PostgreSQL》的对应章节。
DuckDB 团队DuckDB 博客
DuckDB 公布 2.0 预览,计划秋季发布。列出的能力包括稳定版 Quack、远程 CONNECT、触发器、VARIANT 类型、异步 I/O、新的 SQL 解析器和新的默认存储格式。Quack 与远程连接改变了 DuckDB 一直以来只做嵌入式的部署假设,而解析器、存储格式和 C API 的变动意味着升级要当作一次真正的大版本迁移来对待,需要提前建立文件格式、扩展、各语言客户端和并发写入的兼容矩阵。
WizWiz 博客
Wiz 称其 Red Agent 在 snowflake-connector-net 中发现工作流脚本注入:构造特定的 issue 标题就能让未认证用户在 runner 上执行任意命令。Wiz 称 6 月 23 日通报、当日修复并轮换凭据,随后修正措辞,只确认 Copilot 审查没有标出风险。把 issue 标题、分支名这类不可信元数据直接拼进 shell 的老问题依然存在,有 AI 辅助审查的流程同样会漏掉。
Alexander Ioffeexobench.ai
Alexander Ioffe 实测 PostgreSQL 19 的 SQL/PGQ:GRAPH_TABLE 不是图存储引擎,而是把属性图元数据改写成关系连接。跳数固定的模式与手写连接编译出一样的计划,四跳类型链在 60 万到 240 万行上都在 0.29 毫秒内完成。变长量词则被 beta 直接拒绝,可达性查询只能退回递归 CTE,用时 59 至 2189 毫秒,Apache AGE 还要慢 1.4 至 2.1 倍。
Christophe Pettusthebuild.com
Christophe Pettus 解释 max_locks_per_transaction 与快速路径的关系:17 及更早版本的快速路径固定 16 槽,一条查询要拿的关系锁超过这个数就会溢出到共享锁表,几百个后端同时撞上 LWLock:LockManager 等待。18 起快速路径按参数以 16 为单位分组,默认 64。出路有三条:用预备语句只锁真正用到的索引、升到 18、删掉热表上零使用的索引。
Ashutosh BapatPostgreSQL hackers
Ashutosh Bapat 为免重启调整缓冲池大小的补丁系列加了成套压力测试,覆盖调整与 CHECKPOINT、pg_prewarm、pg_buffercache 之间的同步。测试暴露出多个缺陷:BufferSync() 需要修正、缓冲区扫描循环里的 CFI 调用位置要挪、pg_prewarm 误以为 NBuffers 恒定。Palak Chaturvedi 的增量修复改成逐个缓冲区处理,非 NUMA 路径快约 25%。
Zhijie HouPostgreSQL hackers
行过滤器可能把 UPDATE 转成 INSERT,于是不属于 replica identity 的未修改 toasted 列值被静默丢掉。社区在 DDL、UPDATE、解码和应用四个时机之间权衡修法,目前倾向:回归分支采用应用端报错,可用 ALTER SUBSCRIPTION SKIP 恢复,master 再加一层按行的检查。Matthias van de Meent 反对把逻辑复制的限制转嫁给普通 DML 用户。
Surya PoondlaPostgreSQL hackers
Surya Poondla 审查 WAL 记录压缩补丁时发现违反 WAL-before-data 规则的问题:补丁为纯提示位变更写紧凑记录时没有更新页面 LSN,而 FlushBuffer() 完全靠页面 LSN 保证顺序,跳过 PageSetLSN() 会让 XLogFlush() 变成空操作,页面可能先于对应的 WAL 记录落盘。一旦崩溃,页面上已有的提示位无法通过 WAL 恢复。
Alexander Ioffeexobench.ai
Alexander Ioffe 在 200 万行订单表上比较了无二级索引、单列索引和带 INCLUDE 的覆盖索引。覆盖索引会让被包含列的更新失去 HOT 优化,插入比单列索引慢 28%、比无索引慢 88%,更新分别慢约 25% 和 30%,占用 112 MB 而单列索引只要 18 MB,换来的是读取快 1.26 倍。他的结论是:只有当每个分析查询对应的写入低于每分钟约 4300 次时,覆盖索引才划算。
Christophe Pettusthebuild.com
jit_above_cost 默认 100000 触发编译,jit_inline_above_cost 与 jit_optimize_above_cost 默认 500000,分别再加内联和 LLVM 优化。Christophe Pettus 指出根本矛盾:计划代价衡量的是取页数和行数,JIT 的收益却取决于表达式执行多少次、有多复杂,分区扫描加 sum(id) 会白白编译。他建议 OLTP 库直接关掉 JIT。
Gabriele Bartolini个人博客
Gabriele Bartolini 演示把 Linux 基金会的 Vault 分支 OpenBao 部署在 Kubernetes 上,用三副本 CNPG 集群作 postgresql 存储驱动的后端:客户端证书由 DatabaseRole 签发,配合 pg_hba.conf 实现免密码双向 TLS,openbao-rw 角色只对两张表有读写权限。要注意 OpenBao 只在启动时打开连接池,证书 90 天轮换后必须滚动重启 Pod。
PoWA 团队PostgreSQL 新闻
PoWA 团队发布核心扩展 powa-archivist 5.3.0。PoWA 是 PostgreSQL 负载分析工具,通过一组覆盖各子系统的扩展从多个实例采集并聚合指标,提供实时图表,还能给出全局或按查询的索引建议。这一版只有一处改动:适配 pg19beta2 中 pg_stat_lock.wait_time 的数据类型变更,修复由 Julien Rouhaud 提交。已在跟 19 beta 做兼容性验证的用户需要同步升级。
Peter GeogheganPostgreSQL hackers
Peter Geoghegan 指出 gistkillitems() 在 rescan 时可能把 LP_DEAD 标记打到错误的元组上,问题很可能由提交 9c9ddf109 引入,只影响 master,但各版本在 rescan 时都没有正确重置状态。Michael Paquier 和 Andrey Borodin 确认,即便开着 wal_consistency_checking,buildfarm 也没能抓到,因为现有测试没进主回归套件。
Alexandre FelipePostgreSQL hackers
Heikki Linnakangas 指出新的 BufTableDelete() 让 InvalidateBuffer() 持缓冲区头部自旋锁的时间过长。Alexandre Felipe 认为问题不在持锁时长,而在自旋锁下操作的安全性难以论证,提出两步删除:取锁前完成查找,持锁期间只断开链表。他在 Dhruv Aron 的补丁上实现了这一方案,并加了按 Buffer 删除的变体,比按 BufferTag 删除快约 30%。
Tom LanePostgreSQL hackers
Tom Lane 修掉 PL/Perl 的两个缺陷:hstore_plperl 的空指针解引用,以及处理 Perl tied 对象时的无限循环,两者都不算安全漏洞,未进上一轮安全补丁。修复后取到的却是 SQL NULL,Andrey Rachitskiy 解释 tied hash 不把值放在 HeVAL() 里,必须经 hv_iterval() 加 SvGETMAGIC() 才触发 FETCH,随后提交了覆盖所有转换路径的补丁和回归测试。
Dinesh KumarCortex Ridge 博客
Dinesh Kumar 用 Go 写了 MIT 许可的 pgsonify,把数据库健康状况变成实时音效。它默认每 5 秒采样 pg_stat_activity、pg_locks、pg_stat_database 和检查点视图,不需要扩展或超级用户权限,据此算出 0 到 1 的压力分,驱动背景轰鸣的音高与节奏,分 CALM、ALERT、PANIC 三档。作者定位于开发、测试和教学,不替代生产监控。
Christophe Pettusthebuild.com
两个参数都默认开启,前者把 WHERE 子句、目标列表和聚合状态转换编译成机器码,后者生成专用的元组解构代码。Christophe Pettus 提醒两者并不对称:解构代码只在编译消费它的表达式时才产生,关掉 jit_expressions 整个 JIT 块就消失了。它们归在开发者选项下,只适合排查时用来判断是不是表达式编译器出错;要控制 JIT 开销应该调代价阈值或整体关闭。