【問題隐患】
由于業務需求不斷變化,可能在DB中存在超大表占用空間或影響性能;對這些表的處理操作,容易造成mysql性能急劇下降,IO性能占用嚴重等。先前有在生産庫drop table造成服務不可用;rm 大檔案造成io跑滿,引發應用容災;對大表的操作越輕柔越好。
【解決辦法】
1.通過硬連結減少mysql DDL時間,加快鎖釋放
2.通過truncate分段删除檔案,避免IO hang
【生産案例】
某對mysql主備,主庫寫入較大時發現空間不足,需要緊急清理廢棄大表,但不能影響應用通路響應:
$ll /u01/mysql/data/test/tmp_large.ibd
-rw-r-– 1 mysql dba 289591525376 Mar 30 2012 tmp_large.ibd
270GB的大表删除變更過程如下:
#(備庫先做灰階)
ln tmp_large.ibd /u01/bak/tmp_tbl.ibd #建立硬連結
-rw-r-– 2 mysql dba 289591525376 Mar 30 2012 tmp_large.ibd
set session sql_log_bin=0;
#不計入bin log節省性能,并且防止主備不一緻
desc test.tmp_large;
drop table test.tmp_large;
Query OK, 0 rows affected (10.46 sec) mysql -uroot -e “start slave;”
cd /u01/bak;screen -S weixi_drop_table for i in `seq 270 -1 1 ` ;
do sleep 2;truncate -s ${i}G tmp_tbl.ibd;done
rm -rf tmp_tbl.ibd
【性能比較】
中間ctrl-C一次,可以看到truncate前後io的對比情況,基本上影響不大
檔案大小也成功更新
【工具介紹】
truncate – shrink or extend the size of a file to the specified size
#來自coreutils工具集
tar -zxvf coreutils-8.9.tar.gz
cd coreutils-8.9 ./configure
make
sudo cp src/truncate /usr/bin/