天天看點

Mysql 如何 删除大表

【問題隐患】

    由于業務需求不斷變化,可能在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/