DBAtlas · 数据库运维图谱

在不长时间加锁的情况下重组膨胀的表(pg_repack)

PostgreSQL维护

命令

-- Once per target database (the pg_repack package must be installed on the server)
CREATE EXTENSION pg_repack;

# Dry run: show what would be done
pg_repack -h localhost -U postgres -d mydb --table=public.orders --dry-run

# Rewrite the table and its indexes: 2 parallel index builds, wait at most 60 s for locks
pg_repack -h localhost -U postgres -d mydb --table=public.orders --jobs=2 --wait-timeout=60 --no-kill-backend

# Rebuild indexes only
pg_repack -h localhost -U postgres -d mydb --table=public.orders --only-indexes

作用

在后台构建表的紧凑副本,通过触发器将并发变更记录到日志表中,最后在短暂的 ACCESS EXCLUSIVE 锁下交换表;与 VACUUM FULL 不同,它不会在整个过程中阻塞读写。

适用场景

当必须在在线系统上回收 VACUUM 无法归还的严重膨胀(已用 pgstattuple 验证)时。

注意

表必须有 PRIMARY KEY 或在 NOT NULL 列上的 UNIQUE 索引。它临时需要与表及其索引大小相等的额外磁盘空间,并产生大量 WAL(副本延迟、归档量)。开始和结束时需要 ACCESS EXCLUSIVE 锁;--wait-timeout 到期时,默认会取消冲突的查询,必要时终止其会话,而 --no-kill-backend 则会跳过该表。运行期间不要在目标表上执行 DDL。客户端和扩展版本必须一致。如果被中断,请用 DROP EXTENSION pg_repack CASCADE; CREATE EXTENSION pg_repack; 清理残留。

在 DBAtlas 中打开 →

相关内容