刪除表,你們下意識想到的命令多是直接使用DROP TABLE "表名"
,這是初生牛犢的作法,由於當要刪除的表達空間到幾十G,甚至是幾百G的表時候。這樣一條命令下去,MySQL可能就直接夯住了,外在表現就是QPS急速降低,客戶請求變慢。mysql
這個可能就須要DBA不辭辛勞,大晚上爬起來刪表了。linux
譬如1000萬條數據,寫腳本每次刪除20萬,睡眠一段時間,繼續執行。這樣也能作到對用戶無感知。sql
這個方法利用了linux下硬連接的知識,來進行快速刪除,不記得話能夠回去翻一下《鳥哥的linux私房菜》shell
ln data_center_update_log.ibd data_center_update_log.ibd.hdlk [root@mysql01 sports_center]# ll 總用量 19903792 -rw-r----- 1 mysql mysql 9076 10月 17 13:15 data_center_update_log.frm -rw-r----- 2 mysql mysql 8447328256 12月 23 11:35 data_center_update_log.ibd -rw-r----- 2 mysql mysql 8447328256 12月 23 11:35 data_center_update_log.ibd.hdlk
很快,200萬條數據只用了1秒完成,此操做是在建立硬連接後執行的 mysql> drop tables data_center_update_log; Query OK, 0 rows affected (1.02 sec) mysql> exit Bye 退出來,再次查看數據目錄,發現就只剩data_center_update_log.ibd.hdlk硬連接文件了 [root@mysql01 sports_center]# ll 總用量 19903792 -rw-r----- 2 mysql mysql 8447328256 12月 23 11:35 data_center_update_log.ibd.hdlk
ibd.hdlk
硬連接文件呢drop table
以後,剩下的硬連接文件已經和mysql沒有關係了。但若是文件過大,直接用rm
命令來刪除,也是會形成IO開銷飆升,CPU負載太高,進而影響到MySQL。truncate
命令[root@mysql01 ~]# cruncate -bash: cruncate: 未找到命令 一般操做系統會安裝truncate命令,該命令在coreutils安裝包裏面,若是沒有安裝可使用下面命令安裝 [root@mysql01 ~]# yum provides truncate coreutils-8.22-24.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts 源 :base 匹配來源: 文件名 :/usr/bin/truncate 能夠看到truncate由coreutils安裝包提供,下面安裝coreutils安裝包: [root@mysql01 ~]# yum install -y coreutils
truncate
經常使用選項-c, --no-create --> 不建立任何文件 -o, --io-blocks --> 將大小視爲存儲塊的數量,而不是字節 -r, --reference=RFILE --> 參考指定的文件大小 -s, --size=SIZE --> 按照指定的字節設置文件大小
truncate -s
選項能夠指定文件大小,經過腳本指定每次文件減小的大小,並sleep睡眠必定時間,從而達到可控的刪除文件#! /bin/bash # TRUNCATE=/usr/bin/truncate FILE=$1 if [ x"$1" = x ];then echo "Please input filename in" exit 1; else SIZE_M=$(du -sm "$1" | awk '{print $1}') for i in $(seq "${SIZE_M}" -100 0) do sleep 1 echo "${TRUNCATE} -s ${i}M ${FILE}" ${TRUNCATE} -s "${i}"M "${FILE}" done fi if [ $? -eq 0 ];then \rm -f "${FILE}" else echo "Please check file" fi
easydb.net
微信公衆號:easydb
關注我,不走丟!