清理表空間(pg_repack)
更新時間 2024-05-31 18:52:35
最近更新時間: 2024-05-31 18:52:35
分享文章
本小節主要介紹RDS-PostgreSQL的pg_repack插件使用方法。
操作場景
RDS-PostgreSQL支持通過 pg_repack 插件在線清理表空間,有效解決因對全表大量更新等操作引起的表膨脹問題。pg_repack無需獲取排它鎖,相比CLUSTER或VACUUM FULL更加輕量化。
前提條件
- 請確保您的實例內核大版本滿足,本插件所支持的內核版本,請參考支持的版本插件列表。
注意事項
pg_repack需要額外的存儲空間。全表repack時,剩余存儲空間大小需要至少是待repack表大小的2倍。- pg_repack無法操作臨時表。
- pg_repack無法操作GiST索引。
- 重建表和索引時會占用較多的磁盤IO,使用時請提前評估是否影響業務。
- 在pg_repack運行期間,目標表上不能執行除vacuum和analyze之外的任何DDL指令。
插件使用
- 安裝插件
CREATE EXTENSION IF NOT EXISTS pg_repack;
- 卸載插件
DROP EXTENSION IF EXISTSpg_repack;
使用示例
使用 pg_repack插件清理表。
-
創建測試表
create table pg_repack_test(id bigint primary key, name varchar); insert into pg_repack_test select i , to_char(random()*100000, 'FM000000') from generate_series(1, 1000000) i; delete from pg_repack_test where id in (select i ?from generate_series(1, 600000, 2) i); select pg_size_pretty(pg_relation_size('pg_repack_test')); -
清理測試表
cd <RDS_INSTALL_PATH> . setenv.sh cd bin ./pg_repack --host=<RDS_ADDRESS> --port=<DB_PORT> --dbname=<DB_NAME> --username=root --no-superuser-check --no-kill-backend -t pg_repack_test
- <RDS_INSTALL_PATH>:RDS-PostgreSQL實例的安裝目錄
- <RDS_ADDRESS>:RDS-PostgreSQL實例的IP地址。
- <DB_PORT>:RDS-PostgreSQL實例的端口。
- <DB_NAME>:表pg_repack_test所在的數據庫。
- 查看清理后的表大小
select pg_size_pretty(pg_relation_size('pg_repack_test'));
常見問題
Q1:報錯:“pg_repack failed with error: You must be a superuser to use pg_repack”。
A1:執行pg_repack時加上--no-superuser-check,跳過超級用戶檢查。
Q2:報錯:“Waiting for 1 transactions to finish. First PID: ***"。
A2:清理過程中有長事務,pg_repack會等待事務執行完成。