mysql在線無性能影響刪除7G大表 如何在mysql數據庫裡刪除7G(或更大)大表,使其又不影響服務器的io,導致性能下降影響業務。先不說其是mysql表,就是普通文件,如果直接rm刪除,也會使服務器的io性能急劇下降;換個思路如果用化整為零的方式,分多次大大文件一點一點刪除,就可以避免因刪除文件占用太多服務器io資源 例子: www.2cto.com 版本: mysql> select version(); +------------+ | version() | +------------+ | 5.1.67-log | +------------+ 1 row in set (0.05 sec) 數據表大小: www.2cto.com mysql> select count(1) from user4; +----------+ | count(1) | +----------+ | 36700160 | +----------+ 1 row in set (1 min 35.66 sec) [root@racdb2 test]# ll user_bak* -rw-rw---- 1 mysql dba 10466 Mar 1 13:50 user4_bak.frm -rw-rw---- 2 mysql dba 7734296576 Mar 1 14:28 user4_bak.ibd [root@racdb2 test]# 創建一個中間表,來見減少對業務影響 mysql> create table user4_tmp engine=innodb select * from user4 where 1=2; Query OK, 0 rows affected (0.18 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | a | | b | | user | | user1 | | user2 | | user3 | | user4 | | user4_tmp | | utf8 | +----------------+ 9 rows in set (0.01 sec) 把原始表user4重命名 mysql> rename table user4 to user4_bak; Query OK, 0 rows affected (0.03 sec) 把中間表重命名為原始表user4,如果需要數據,可以導入部分數據 mysql> rename table user4_tmp to user4; Query OK, 0 rows affected (0.01 sec) 通過文件的硬鏈接方式刪除文件 [root@racdb2 test]# ln user4_bak.ibd user4_bak.ibd.hdlk [root@racdb2 test]# ll user_bak* -rw-rw---- 1 mysql dba 10466 Mar 1 13:50 user4_bak.frm -rw-rw---- 2 mysql dba 7734296576 Mar 1 14:28 user4_bak.ibd -rw-rw---- 2 mysql dba 7734296576 Mar 1 14:28 user4_bak.ibd.hdlk [root@racdb2 test]# 注意: 硬連接的作用是允許一個文件擁有多個有效路徑名,即文件的索引節點有一個以上的連接。只刪除一個連接並不影響索引節點本身和其它的連接,只有當最後一個連接被刪除後,文件的數據塊及文件的連接才會被釋放。也就是說,文件真正刪除的條件是與之相關的所有硬連接文件均被刪除。 發現刪除7G的文件巨快 mysql> drop table user4_bak; Query OK, 0 rows affected (0.60 sec) 這個時候在mysql數據庫裡已經刪除了表user4_bak,但系統的存儲空間還沒有釋放,如下所示: [root@racdb2 test]# ll user_bak* -rw-rw---- 2 mysql dba 7734296576 Mar 1 14:28 user4_bak.ibd.hdlk 只有我們把文件user4_bak.ibd.hdlk刪除,磁盤空間才會被釋放,那如何盡量少占用系統資源,最小化影響業務來釋放這個空間呢?前面已經分析通過化整為零的方式,通過coreutils工具集中的truncate對大文件進行shrink來逐漸釋放空間. 腳本如下: [root@racdb2 test]# more /home/mysql/rm_bigfile.sh #!/bin/bash #author:skate #time:2013/02/28 #function:rm huge file TRUNCATE=/usr/local/bin/truncate for i in `seq 7384 -100 10 `; #從7384開始每次遞減100 ,輸出結果見下面 do sleep 1 echo "$TRUNCATE -s ${i}M /tmp/user4_bak.ibd.hdlk " $TRUNCATE -s ${i}M /mysqldata/data/test/user_bak.ibd.hdlk done 執行腳本,然後同時開另一個session,用iostat查看系統io的壓力 [root@racdb2 test]# sh /home/mysql/rm_bigfile.sh 發現每1s刪除100M的文件,服務器基本沒有壓力 [root@racdb2 coreutils-8.9]# iostat -mx 2 | grep "sda2" sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 10.45 0.00 1.00 0.00 0.04 92.00 0.00 0.50 0.50 0.05 sda2 0.00 2.99 0.00 9.95 0.00 0.05 10.40 0.03 3.20 0.25 0.25 sda2 0.00 9.50 0.00 1.00 0.00 0.04 84.00 0.00 1.50 1.50 0.15 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 9.50 0.00 1.00 0.00 0.04 84.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 14.50 0.00 1.00 0.00 0.06 124.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 9.00 0.00 1.00 0.00 0.04 80.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 9.50 0.00 1.00 0.00 0.04 84.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 9.00 0.00 1.00 0.00 0.04 80.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 10.55 0.50 10.05 0.00 0.08 16.00 0.04 3.95 1.43 1.51 sda2 0.00 0.00 2.01 0.00 0.01 0.00 8.00 0.02 8.00 8.00 1.61 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 7.54 0.00 1.01 0.00 0.03 68.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 9.50 0.00 1.00 0.00 0.04 84.00 0.00 0.50 0.50 0.05 sda2 0.00 2.99 0.00 1.00 0.00 0.02 32.00 0.00 0.50 0.50 0.05 sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda2 0.00 3.02 0.50 1.01 0.00 0.02 24.00 0.02 11.33 11.33 1.71 coreutils的安裝 [root@racdb2 test]#wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.9.tar.gz [root@racdb2 test]#tar -zxvf coreutils-8.9.tar.gz [root@racdb2 test]#cd coreutils-8.9 [root@racdb2 test]#./configure [root@racdb2 test]#make && make install 總結: 1.使用方法:硬鏈接和化整為零 2.做事之前先思考方法,不要急於動手 3.多角度思考問題,本來是在線問題,在線解決起來,束縛較多,那就把在線變離線;一次刪除影響大,那就變多次刪除 ---end----