pgEdge 开源 MM-Ready 检查多主复制可行性
把现成的库改成多主复制往往先要动 schema:UPDATE 与 DELETE 的复制依赖主键,外键级联会制造冲突,一些序列类型和扩展也不兼容。pgEdge 产品经理 Antony Pegg 把这套评估做成了命令行工具 MM-Ready,围绕 schema、复制配置、扩展、序列、触发器和 SQL 写法执行 56 项检查,结果按严重程度分成四级。工具有连库扫描、只读结构文件、审计已部署的 Spock 和长期观察四种模式。
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
每日精选 PostgreSQL、数据库与云计算资讯
把现成的库改成多主复制往往先要动 schema:UPDATE 与 DELETE 的复制依赖主键,外键级联会制造冲突,一些序列类型和扩展也不兼容。pgEdge 产品经理 Antony Pegg 把这套评估做成了命令行工具 MM-Ready,围绕 schema、复制配置、扩展、序列、触发器和 SQL 写法执行 56 项检查,结果按严重程度分成四级。工具有连库扫描、只读结构文件、审计已部署的 Spock 和长期观察四种模式。
Richard Yen 整理了 EXPLAIN 里容易被忽略的五个选项。BUFFERS 区分 shared hit 与 shared read,用来判断是缓存没命中还是内存吃紧;MEMORY 单独报告规划阶段用掉和申请的内存;WAL 给出记录数、整页写和字节数,适合看批量导入与复制压力;SETTINGS 列出影响规划的参数;VERBOSE 展开列引用与模式限定名,能看清视图展开和规则重写。他建议组合使用,并把同样的开关配进 auto_explain。
社区已形成共识,Tomas Vondra 准备提交;分区表查询上 JIT 的编译成本常常压过收益。
Nathan Bossart 的补丁按死元组与 XID 年龄打分,评分参数保持全局,另计划补一个系统视图。
Álvaro Herrera 用元组槽替代 HeapTuple 省掉反复的形式化开销,审阅指出索引下标与数组越界问题。
Greg Sabino Mullane 主张沿用现有角色体系,Jelte Fennema-Nio 认为派生只读角色的门槛过高。
Robert Haas 在 3 月 12 日提交了 contrib 模块 pg_plan_advice,它把连接顺序、连接方式、扫描方式和并行策略等规划器决策写成一段文本建议,用来固定已经验证过的执行计划。用法是 SET pg_plan_advice.advice 指定建议,再用 EXPLAIN (plan_advice) 查看规划器给出的建议文本。depesz 提醒这是把双刃剑:建议一旦写死就长期生效,数据分布变了很容易把查询锁死在糟糕的计划上。
PostgreSQL 规划器不看 pg_class.relpages,而是量磁盘文件大小再缩放行数估计,所以把生产统计灌进小测试库仍复现不出生产计划。Radim Marek 的 pg_regresql 挂在 get_relation_info_hook 上,等规划器读完物理指标,再把已 ANALYZE 表的页数与行数换回目录中的值,未分析的表保持原样。扩展不需要配置、后台进程或共享内存,LOAD 一次即生效,支持 13 到 18。
Deepak Mahto 在 Oracle 迁移中发现,ora2pg 用 ALTER SEQUENCE … START WITH 重置序列并不生效,直到对账出现差额才暴露。序列的计数器在 last_value 上,START WITH 只改 start_value。真正的重置要用 RESTART WITH n 或 setval(seq, n, false),两者都让下次取值等于 n。迁移流水线更适合后者,它能被逻辑复制传播。
连接销毁后 PgFdwScanState->conn 仍指向已释放内存,Etsuro Fujita 改为推迟到事务中止清理阶段再释放 PGconn。
Andres Freund 建议把 indexscan API 改动与批处理接口拆成独立补丁,并把预取决策上移到规划器。
Melanie Plageman 已推送前两个补丁,其余十个不变;空页清理不再单独走 log_newpage_buffer()。
zstd 压缩下解压管道没有收尾导致找不到 WAL,POSIX 的填充规则又让测试失败,Tom Lane 连出两轮补丁。
会议 8 月 20 至 21 日举行,含培训与英文技术演讲,征稿 4 月 12 日截止,注册四月中旬开放。
把 jit 的默认值从 on 改成 off,在邮件列表上获得了一致支持。理由有两条:JIT 刚引入时分区表还不普遍,如今分区用得多了,被误伤的查询也多了;LLVM 自身的编译性能这些年在退步,默认开启的收益越来越薄。Jelte Fennema-Nio 已把提案标记为可供提交者处理,Tomas Vondra 表示若无人反对就在几天内提交,Tom Lane 也表态支持。时机上大家倾向于现在就动手而不是等到测试版中期,好让负面反馈尽早暴露。
问题出在事务状态检查上:SELECT 期间 pgfdw_reject_incomplete_xact_state_change() 会销毁连接并把缓存条目置空,但扫描状态里那份指针仍指向已释放的内存,随后执行 close c1 之类的命令就会访问野指针而崩溃。Etsuro Fujita 的补丁把 PGconn 的释放推迟到事务回滚清理时进行,复测确认崩溃消失。该缺陷影响 14 及以后版本,需要回迁到各稳定分支。
Matty Stratton 算了一笔账:MVCC 让读写互不阻塞,代价是每行都带 23 字节的事务可见性头部,算上对齐填充是 28 到 30 字节。IoT 管道、金融流水、可观测性这类只追加的负载并不修改已写入的行,却照样承担全部成本:高频写入下写放大到 3 至 5 倍,autovacuum 为设置提示位和冻结事务号持续运转,WAL 也随之膨胀。解法是让存储形态匹配负载,例如用列式存储把行批量打包,摊薄 MVCC 的固定开销。
Shaun Thomas 的 Patroni 高可用系列走到第三篇,前两篇搭起 etcd 与 Patroni 本体,这篇补上入口。HAProxy 以裸 TCP 转发连接,用 HTTP 检查打 Patroni 的 REST 接口判断角色:6543 端口只连主库,根路径返回 200 者为主;6544 端口连只读副本,用 /replica?lag=1MB 排除延迟过大的节点。三节点同在一个后端池,默认三次检查失败即摘除,并断开其上会话防脑裂。
pg_clickhouse 是把 PostgreSQL 接到 ClickHouse 的扩展,由 ClickHouse 赞助开发。David E. Wheeler 发布的 0.1.5 是一次维护更新,修掉了渗透测试和一份社区安全报告中发现的崩溃与漏洞,文章没有展开具体的技术细节。安装渠道有三条:PGXN 包仓库、GitHub 的发行页和 Docker 镜像。作者说明自己近期主要精力在公司内部项目上,这个版本是针对已报告问题的响应。
v67 修好文档措辞与失效处理后由 Amit Kapila 提交,历时数周的语法之争暂告段落。
Andrew Dunstan 已提交,修掉位置参数会让 --path 失效的问题,临时目录改为按需创建。
部分备库槽不可用时逻辑复制仍可推进,按 FIRST N 或 ALL 语义判断,源于客户的实际诉求。
Tomas Vondra 追问是否该扩展到单个后端做负载均衡,以及消息是否携带断连截止时间。
含量词边界、栈深度保护与中断检查,并试验单槽 PREV/NEXT 以消除改写计划缓存的隐患。
Álvaro Herrera 在 3 月 10 日提交了 Antonin Houska 的补丁:PostgreSQL 19 新增 REPACK 命令,把 VACUUM FULL 与 CLUSTER 合并成一套接口。不带索引就是去膨胀,带 USING INDEX 则按索引重排并标记为聚簇索引。进度可从 pg_stat_progress_repack 视图看,原有两条命令保留但不再主推。并发版本没有进来,作者称这只是第一步。
PGConf.dev 2026 将于 5 月 19 至 22 日在加拿大温哥华举行,由 Slonik Events Canada 承办,面向用户、开发者与社区组织者,主题是 PostgreSQL 的开发与社区建设。主办方宣布日程已经发布:今年在周二新增了由社区主导的专题环节,并围绕 PostgreSQL 项目三十周年安排了一系列特别活动与演讲。会上可以见到贡献者本人,也能了解正在开发中的新特性,各日程页面已在官网开放查阅。
Ilya Kosmodemiansky 把大版本升级的三条路摆在一起比:pg_dump 加 pg_restore 停机以小时计、要两倍空间,只适合小库;pg_upgrade 的 link 模式停机以分钟计、几乎不占额外空间,是多数生产场景的选择;逻辑复制只在切换瞬间停机,代价是完整复制一份集群。他建议提前几天用 --check 试跑,并用 PgBouncer 排空连接。坑位包括复制槽失效需重建、扩展版本要核对、配置文件不会自动搬过去。
零信任环境里 SSH 往往被收紧,可故障切换偏偏要在操作系统层面执行。Vibhor Kumar 把 efm_extension 开源出来,用 SQL 函数暴露 EDB Failover Manager 的操作,涵盖集群状态查询、计划内切换、故障转移和节点启停,DBA 在连接里就能完成。实现上靠一份收得很紧的 sudoers 配置,只允许 PostgreSQL 服务账号执行特定的 EFM 命令。代码按 PostgreSQL 许可证发布。
Jake Hertz 指出开发者常把传感器读数当作普通业务数据:规范化建模、关系式组织,设备一多、采样一密、历史一长就撑不住。问题出在认知上,传感器数据长得像行,实际行为却是按时间排好的流,价值随时间衰减。面向行的做法很难同时应付持续的写入尖峰、按时间范围的查询和乱序到达的数据。他给出的方向是把这类数据当作只追加的日志来对待:写入路径按日志优化,按时间分区组织,按生命周期分层存储,并让不同负载各用各的角色。
Tom Lane 称在慢机器上让构建农场多跑 10% 太浪费,Robert Haas 以两天内查出三个缺陷为据坚持。
child->max 未随 min 递增导致服务器崩溃,改为溢出到无穷大时跳过合并以保语义正确。
v43 避免反复组装与拆解 HeapTuple,并合入此前崩溃的修复;并发能力仍未进 19 版。
Amit Kapila 在 3 月 4 日提交了 vignesh C 等人的补丁:PostgreSQL 19 的 FOR ALL TABLES 发布可以排除若干张表,写作 FOR ALL TABLES EXCEPT TABLE (public.t5, s1.t1),被排除表的数据不再发往订阅端。分区表按根表排除,现有和将来的分区一并生效。限制也明确:已有的 FOR ALL TABLES 发布不能事后增删排除项,硬来会报错。
起因是想给 AI 工作流一个安全入口。Andrei Lepikhov 提出用 pg_readonly 扩展解决,反问是否真要改内核。Bruce Momjian 认为随着 MCP 越用越多,只读应当是数据库自带的能力。Peter Eisentraut 坚持只读是事务属性,不是访问控制。Andres Freund 举出计划内切换和优雅关闭的场景,认为临时只读本身有价值。悬而未决的是做成会话级还是集群级,以及要不要连 vacuum 一起挡住。
Specific 是一家 Y Combinator 公司,做编码代理的云平台,每个编码任务配一个独立数据库,避免代理之间互相干扰。这套东西建在 Neon 上:用分支功能从快照秒建副本,新任务一来数据库立刻可用,规模上到数千个库。联合创始人 Iman Radjavi 说,选 Neon 看中的正是即时创建与分支这两点,正好对上代理式基础设施随建随弃的用法。这类场景里单个库都很小,但数量极多、生命周期很短,和传统实例规划的思路不同。
Ibrar Ahmed 数了常见 RAG 栈的几处毛病:检索无状态,同一个问题两次问出不同答案;多个代理并发写入时操作只完成一半,向量与原文脱节;记忆如何演变没有记录,事后无法复盘或审计;外部向量库的最终一致性还会在并发写时返回旧数据。他主张把 PostgreSQL 当作事务型记忆引擎,让向量、元数据和会话状态在一个事务里提交:pgvector 提供 HNSW 与 IVF 索引,外键杜绝孤立向量,行级安全隔离租户,WAL 记下每次变更。
Takton 的 Sense Manufacturing 给中小制造商监控机器功率与振动,设备每几秒往 Tiger Cloud 送一次数据。团队在写生产代码之前就定下了数据平台:起初考虑 InfluxDB,最后选 Tiger Data,理由是数千台设备的高频写入更扛得住,整条链路能统一在 SQL 上,托管服务也省掉运维。从第一次提交到设备进客户现场只用了两个月。平台保留全分辨率时序数据做异常检测,按厂商口径已提前数天发现过设备故障。
Daniel Gustafsson 在多平台与多版本 OpenSSL 上验证后提交,两处构建农场失败已随 OpenSSL 升级解决。
David Steele 的补丁避免备份中途拷到损坏的控制文件,19 版拟只做基础备份协议那一半。
Masahiko Sawada 改用函数重载保留旧签名,避免 18 及更早版本的订阅端失效。
重打包关系号在解码起点确定之后才设置,导致无关变更混入重排序缓冲区触发断言。
SQL NULL 与 JSON null 都序列化成同一形式,重新导入后无法还原,往返保真成为难点。
PostgreSQL 18 在 password_encryption 设为 md5 且创建或修改口令时会发出警告,提示 MD5 已弃用、将来会移除,新参数 md5_password_warnings 可关掉这条提示。迁移路径是改用 scram-sha-256,它更安全且早已是默认值。要注意 MD5 口令无法直接转成 SCRAM,必须逐个重设所有用户的口令,确认客户端库支持 SCRAM,并改掉 pg_hba.conf 里的认证方式。
Andrew Dunstan 在 2 月底推送:pg_dumpall 不再只能输出纯 SQL 脚本,还支持 custom、directory 与 tar。非文本格式产出一个目录:toc.glo 存放角色与表空间等全局对象,map.dat 记录库 OID 与名字的对应,databases 下按 OID 存放各库归档。pg_restore 随之扩展,先恢复全局对象再逐库恢复,新增 --globals-only,也能从整集群备份挑单库恢复。
pgNow 是 Redgate 出的轻量 PostgreSQL 诊断工具,不装代理,连上去就能看当前状态。它读 pg_stat_activity 与 pg_stat_statements,汇总查询负载与会话、索引使用和 vacuum 活动等指标。使用前要启用 pg_stat_statements,并建一个对相关系统视图有 SELECT 权限的监控用户。Linux 下解压后以非 root 运行,Windows 有安装包,目前免费。
Xata 把自家的产品分析仓库直接建在原生 PostgreSQL 上,理由是中小规模的分析负载用不着专门的 OLAP 系统。他们把认证、用量、计费和行为事件四套数据汇到一处:PostHog 走自带管道每日同步,数据库快照用 Kubernetes 定时任务拉取,计费数据用自写的批量上传程序。落地后用物化视图把 JSONB 事件属性摊平,用 pg_cron 定时刷新,用数据库分支安全地改表结构;分析压力上来再上 pg_duckdb。
工业现场的统一命名空间架构通常把时序数据和设备层级上下文放在两套系统里,问一个有意义的问题就得先做集成。Damaso Sanoja 的做法是两边都放进 PostgreSQL:uns_namespace 表存 ISA-95 层级映射,tag_history 表存带时间戳的传感器读数,用外键在数据库层面保证质量,一条 SQL 连接即可完成上下文化。这样既能回答「多个厂区里哪台设备表现最好」,也让 AI 代理经由 MCP 直接理解工厂结构。
Alexandre Felipe 的方案针对前导列 IN、次列 ORDER BY 的查询,小 limit 下从 3409 毫秒降到 13 毫秒。
新增合并取 LSN 与解锁的函数,避免 pgbench 只读回归,作者称如今略快于主线。
Tom Lane 判断根源是 PostgreSQL 15 在信号处理函数里启动子进程,该做法违反 POSIX,16 版已修。
Álvaro Herrera 提议与插入接口对齐,动因是 REPACK CONCURRENTLY 需要传更多选项。
Pavel Luzanov 盘点 2026 年 1 月 CommitFest 进入 PostgreSQL 19 的改动。分区表可以合并与拆分,pg_dump 开始支持扩展统计信息。逻辑复制方面,打开 WAL 逻辑解码不再需要重启,槽同步延迟也可以监控。监控侧新增 pg_get_multixact_stats,vacuum 与 analyze 的进度信息更细,另有 vacuumdb 演练模式和 LISTEN/NOTIFY 的性能改进。
pg_gather 是 Percona 的 Jobin Augustine 维护的免安装 PostgreSQL 诊断工具,采集一次即可生成体检报告。33 版重做了等待事件部分:分类着色、汇总图表、悬停查文档,并按版本处理 16 与 17 之间改过的事件名。巡检项新增孤儿文件检测、pg_hba.conf 规则求值与 IP 计算、两个超时参数的检查,以及同步提交与备库名单的一致性判断,同时补上 PostgreSQL 18 的持续采集支持。
Dave Page 介绍了 pgAdmin 4 的 AI Insights:EXPLAIN 结果里多出一个页签,由大模型给出性能小结、按严重程度标出瓶颈,并给出可直接执行的修改建议。模型可以接 Anthropic、OpenAI 这类云端服务,也可以用 Ollama 或本地容器跑,在偏好设置里配置。前端会把 JSON 格式的执行计划连同原始 SQL 发给后端再组装提示词,接云端模型时要考虑这两样内容外发。官方提醒建议须自行验证。
数据库对象上的 COMMENT 长期被当作可有可无的文档。Bruce Momjian 指出,MCP 客户端要理解库里有什么才能干活,而它们能依据的只有表结构、对象命名和约束;有了注释,模型才更容易把用户的说法对上具体的表和列,生成的 SQL 也更靠谱。他给出两条路:一是让使用者手写注释,为 AI 客户端补上业务语境;二是反过来用生成式 AI 读取实际数据,自动产出合适的注释。文章只谈思路,没有给出具体写法。
TigerData 一次性放出 Tiger Cloud 的多项更新。TimescaleDB 升到 2.25,新增 ColumnarIndexScan 执行路径并改进连续聚合,厂商称压缩数据上的查询最高快 289 倍。平台默认版本换成 PostgreSQL 18,带来异步 I/O 相关的改进。此外新增 Azure Marketplace 自助注册、Azure 分层存储和 AWS 欧洲区域,控制台加了浮动 SQL 编辑器与作业时间线。
提交 c456e391138 后特定连接查询会崩溃,David Rowley 查出属性缓存偏移的起点算错并推送修复。
现有实现要求 REPLICATION 权限,Álvaro Herrera 提议用新 GUC 划出默认 3 个槽的专用池。
Greg Burd 放弃了争议较大的更新列改法,v36 转为把列判定逻辑下移到执行器。
新参数 max_parallel_workers_per_autovacuum_worker 取代全局上限,省掉预留与释放逻辑。
Tomas Vondra 的补丁显示预读距离与 I/O 停顿次数,是否该像 BUFFERS 一样默认开启仍在议。
Robert Haas 坚持非对称写法,要求指明哪张表做哈希内侧;共享内存收集的开销也被质疑。
Heikki Linnakangas 提出在 _PG_init() 注册结构与哈希表,取代 ShmemInitStruct 与两个钩子。
新版补丁补上证书颁发机构替换、吊销列表和初始化互斥的测试,作者称几日内提交。