之前的文章裏已經寫了使用TokuDB進行數據壓縮,準確的說,但 TokuDB並非是歸檔,而是對數據進行壓縮,使得數據庫在保存大量數據時有更好的表現,這節就是描述一個數據庫歸檔方案。
經過調研,發現一個比較好的工具: pt-archiver。
1、原理
通過給定的–where條件,查詢出表中需要刪除或者歸檔記錄的主鍵信息,然後通過強制主鍵索引的方式,小批量(最小可以做到1行)的方式刪除或者歸檔,最大化的減小歸檔或者刪除操作對DB性能的影響。
2、能做什麼
1、清理線上過期數據;
2、導出線上數據,到線下數據作處理;
3、清理過期數據,並把數據歸檔到本地歸檔表中,或者遠端歸檔服務器。
3、操作示例
1、全表歸檔,不刪除原表數據,非批量插入
pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --statistics --no-delete
2、全表歸檔,不刪除原表數據,批量插入
pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --statistics --no-delete
3、全表歸檔,刪除原表數據,非批量插入,非批量刪除
pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --statistics --purge
4、全表歸檔,刪除原表數據,批量插入,批量刪除
pt-archiver \
--source h=10.73.129.187,P=3306,u=backup_user,p='xxx',,D=test123,t=c1 \
--dest h=10.73.129.188,P=3306,u=backup_user,p='xxx',D=test123,t=c1 \
--charset=UTF8 --where '1=1' --progress 10000 --limit=10000 --txn-size 10000 --bulk-insert --bulk-delete --statistics --purge
4、參數解釋
常用參數 | 解釋 |
---|---|
--where ‘id<3000’ | 設置操作條件 |
--limit 10000 | 每次取1000行數據給pt-archive處理 |
--txn-size 1000 | 設置1000行爲一個事務提交一次 |
--progress 5000 | 每處理5000行輸出一次處理信息 |
--statistics | 結束的時候給出統計信息:開始的時間點,結束的時間點,查詢的行數,歸檔的行數,刪除的行數,以及各個階段消耗的總的時間和比例,便於以此進行優化。只要不加上–quiet,默認情況下pt-archive都會輸出執行過程的 |
--charset=UTF8 | 指定字符集爲UTF8 |
--no-delete | 表示不刪除原來的數據,注意:如果不指定此參數,所有處理完成後,都會清理原表中的數據 |
--bulk-delete | 批量刪除source上的舊數據 |
--bulk-insert | 批量插入數據到dest主機 (看dest的general log發現它是通過在dest主機上LOAD DATA LOCAL INFILE插入數據的) |
--purge | 刪除source數據庫的相關匹配記錄 |
--local | 不把optimize或analyze操作寫入到binlog裏面(防止造成主從延遲巨大) |
--analyze=ds | 操作結束後,優化表空間(d表示dest,s表示source)。默認情況下,pt-archiver操作結束後,不會對source、dest表執行analyze或optimize操作,因爲這種操作費時間,並且需要你提前預估有足夠的磁盤空間用於拷貝表。一般建議也是pt-archiver操作結束後,在業務低谷手動執行analyze table用以回收表空間 |