PostgreSQL 19 新增 REPACK 命令,整合 VACUUM FULL 与 CLUSTER,其 CONCURRENTLY 模式可在线重写表,无需扩展,托管服务可用。实测比 pg_repack、pg_squeeze 更快、WAL 更少、失败后无残留。但运行期间会阻碍 VACUUM 清理死元组,末尾换表需短暂 ACCESS EXCLUSIVE 锁,更新删除超约 1.05 亿行会内存耗尽失败,旧快照可能读到空表。
PostgreSQL 19 brings REPACK CONCURRENTLY, a native alternative to pg_repack that rewrites tables without crippling locks.
PostgreSQL 19引入了REPACK的CONCURRENTLY选项,允许在不获取独占锁的情况下重组表。该功能通过共享更新锁创建初始副本,并利用并发后台工作者进行逻辑解码。尽管存在复制槽资源稀缺和死锁风险等问题,但设计和代码已基本完成,预计将在后续更新中解决。测试结果显示,重组后表大小显著减少,插入性能略有下降,但整体影响不大。
完成下面两步后,将自动完成登录并继续当前操作。