使用 pg_repack 移除膨胀
您可以使用 pg_repack 扩展程序以最少的数据库锁定来移除表和索引膨胀。您可以在数据库实例中创建此扩展程序,然后从 Amazon Elastic Compute Cloud(Amazon EC2)或可以连接到您的数据库的计算机上运行 pg_repack 客户端(客户端版本与扩展版本相匹配的位置)。
与 VACUUM FULL 不同的是,pg_repack 不需要停机时间或维护窗口,也不会阻止其他会话。
pg_repack 在 VACUUM FULL、CLUSTER、或 REINDEX 可能不起作用的情况下起到帮助作用。它会创建一个包含膨胀表数据的新表,跟踪原始表中的更改,然后用新表替换原始表。在构建新表时,它不会锁定原始表来防止读取或写入操作。
您可以将 pg_repack 用于完整表或索引。要查看任务列表,请参阅 pg_repack 文档
限制:
-
要运行
pg_repack,您的表必须具有主键或唯一索引。 -
pg_repack不适用于临时表。 -
pg_repack不适用于具有全局索引的表。 -
当
pg_repack正在进行时,您不能对表执行 DDL 操作。
下表介绍了 pg_repack 与 VACUUM FULL 之间的区别。
|
|
内置命令 |
您从 Amazon EC2 或本地计算机中运行的扩展程序 |
对表格执行操作时需要 |
仅在短时间内需要 |
适用于所有表 |
适用于仅具有主键和唯一键的表 |
所需存储空间是表和索引所消耗空间的两倍 |
所需存储空间是表和索引所消耗空间的两倍 |
要在表上运行 pg_repack,请使用以下命令:
pg_repack -h <host> -d <dbname> --table <tablename> -k
要在索引上运行 pg_repack,请使用以下命令:
pg_repack -h <host> -d <dbname> --index <index name>
有关更多信息,请参阅 AWS 博客文章使用 pg_repack 移除 Amazon Aurora 和 RDS for PostgreSQL 中的膨胀
注意事项
pg_repack 中的 error-on-invalid-index 错误通常意味着表中的一个或多个索引已损坏或无效。pg_repack 无法安全地对具有无效索引的表进行操作,因为它在重新打包过程中依赖索引来保持数据一致性。
此错误发生在以下情况下:
索引被标记为无效(例如,由于
CREATE INDEX CONCURRENTLY语句失败)。索引损坏(可能是由于硬件问题或突然关闭所致)。
使用以下查询来识别无效的索引,并在找到无效索引时先将其删除。
SELECT indexrelid::regclass, indisvalid FROM pg_index WHERE indrelid = 'orders'::regclass AND NOT indisvalid; Drop the invalid index: DROP INDEX index_name;