產品上線就沒有規劃表的數據歸檔、比如落成文件、保存到歷史計劃,所以清理大表的部分數據是最kuB事情。
限制的條件
\d+ 查看錶的大小,15G左右。
上線配置放開了歸檔日誌。(刪除部分數據的時候,歸檔有可能撐爆你的文件系統)、
實時有交易往這個表裏寫數據,交易一分鐘就超時
首先刪除數據,
- 生產保留30天的數據,一天一天刪、一年、60天以前、最後時間上算30天最快。
- 因爲有數據一直在往裏邊寫數據。而回收空間耗時問題,耗時長會一直insert wait。
做了幾種方案的測試。
1)最簡單直接的 備份 刪除 回收
\copy 數據出來
delete 按條件刪除數據
vacuum full 表
2)rename表,回導30天數據到新表
alter table rename 舊錶 新表名
create table 舊錶名
create index 重建索引
\copy from 回導新表名錶30天數據
最後選擇了第一種方案:凌晨三點多操作,交易最少,影響最小。
另外清理方法,提供了兩個工具,pg_repack pgcompacttable
https://www.timbotetsu.com/blog/postgresql-bloatbusters/
select * from pg_stat_user_tables where relname ='t3' 可以統計是否需要做操作
n_dead_tup未回收的空間
n_live_tup當前表的數據量
即觸發 分析和清理時 表的數據可以維持一個動態平衡。
https://blog.csdn.net/wzyzzu/article/details/50426692
https://my.oschina.net/lcc1990/blog/1934262
這個是創建測試數據的鏈接,用了一個比較投機的方法,通過物理id移動數據到數據開頭。