清理8組nodes中表的歷史數據,平均每個node中的表有1.5億條記錄 清理8組nodes中表的歷史數據,平均每個node中的表有1.5億條記錄,需要根據date_created字段清理8000W數據記錄,這個字段沒有索引。 環境介紹 線上磁盤空間不足,truncate了許多能動的表,磁盤空間還是占據了87%,我們的nagios報警閥值是80%。所以不斷的還會收到email以及短信報警。需要根據時間字段date_created清理,但是在設計之初由於當初的開發人員考慮不足所以date_created字段沒有建立索引。另外這些數據可以不用備份,直接刪除掉。 問題來了,這麼大記錄量的表,根據date_created字段刪除記錄,而且還沒有索引,難度肯定非常大。enl.ibd文件大小29G大小,磁盤剩余空間32G,兩者差距比較小。
[mysql@xxxx-xxx ide]$ ll -h enl.ibd -rw-rw---- 1 mysql mysql 29G Aug 30 07:21 enl.ibd
方案策劃中,大概准備采用shell命令。 雖然date_created 沒有索引,但是我們做過實驗
mysql> select * from enl where date_created < "2013-01-01 00:00:00" limit 1000; ...... 1000 rows in set (0.00 sec)
看來執行效果還不錯,那再試下delete效果
mysql> delete from enl where date_created < "2013-01-01 00:00:00" limit 1000; Query OK, 1000 row affected (2.00 sec)
看起來可以每次刪除1000條,寫腳本delete吧
for ((i=0;i<1000000;i++));do mysql -uroot -e 'use iden;delete from enl where date_created < "2013-01-01 00:00:00" limit 1000;';done
等delete操作完成之後,找業務低峰期執行 alter table enl engine=innodb;來釋放磁盤空間。