Postgres清理大表

  產品上線就沒有規劃表的數據歸檔、比如落成文件、保存到歷史計劃,所以清理大表的部分數據是最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當前表的數據量

Postgres清理大表
  
Postgres清理大表
即觸發 分析和清理時 表的數據可以維持一個動態平衡。
https://blog.csdn.net/wzyzzu/article/details/50426692
https://my.oschina.net/lcc1990/blog/1934262
這個是創建測試數據的鏈接,用了一個比較投機的方法,通過物理id移動數據到數據開頭。
Postgres清理大表
Postgres清理大表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章