truncate/drop表很是慢,怎麼辦?用硬連接,極速體驗

     這個這個,我必須花巨大篇幅,記錄下今天清空表記錄的英雄壯舉,可知道一個drop操做,執行了一下午啊一下午,這是要急出翔的節奏。。呵呵,下面開始mysql

 

個人需求:某表因歷史緣由,積壓了1億條記錄,約佔360G空間。我要清掉它,就是這麼簡單。sql

嘗試1:做爲DB小菜,首先想到的,固然是delete命令。因而歡快的執行了delete from mytable; 知道嗎?一杯茶都喝完了,它尚未執行完。個人尊嚴受到了挑戰,捉急了,開始google。oracle

嘗試2:好,換用truncate命令。truncate table mytable; 知道嗎?第二壞茶喝完了,它尚未執行完。快急出翔了,繼續google。google

嘗試3:好,乾脆drop表好了。drop table mytable; 知道嗎?第三杯茶喝完了,它尚未執行完。這下快嚇尿了,這是什麼狀況。。。趕快找大牛問spa

          固然,drop以前別忘了先備份一下表結構,一下子drop完了還得從新建表,那得多麻煩呀,嘿嘿orm

          create table mytable_bak like mytable; // 備份server

          drop table mytable;                      // 刪表 索引

 

          alter table mytable_bak rename to mytable;  // 從新命名ssl

嘗試4:大牛說,不妨改一下這兩個開關,能夠加速drop。因而,又等了10min,窗外雨都下停了,仍是沒有執行完。。。博客

        show variables like '%lazy%';
        show variables like '%file_per%';
        set  global innodb_lazy_drop_table=1;  // 默認值是0
         set global innodb_file_per_table=OFF; //默認值是ON
嘗試5:又找了另外一位大牛,這下得解救了,翻身農奴了,拜啊,三柱香,牛!想知道是怎麼作的嗎?我知道你想,嘻嘻,彆着急,是這樣的,建硬連接
          在DB server上,找到mytable表對應的文件,個人是/data/mysql3306/data/mydatabase/。
          在這個目錄下,咱們能夠看到如下記錄,真的是390G!嚇死銀呀! 
          -rw------- 1 oracle oinstall  46672 Aug 30 15:42 mytable.frm 
          -rw------- 1 oracle oinstall 391466975232 Aug 30 15:42 mytable.ibd 
          以上記錄中,1表示該文件只有一個連接(沒有另外的人連接到它,要刪就是真的刪文件自己了哦),怪不得我執行truncate/drop這麼慢,原來背後就是在刪這個東東呀!
          那怎麼辦呢?能不能繞過,不刪文件自己,先快速把表drop掉該多好呀。那麼建硬連接ln能夠完成。
         ln mytable.ibd  mytable.ibd.h
         ln mytable.frm  mytable.frm.h
         至關於一個文件被兩個索引連接着,要刪就是隻刪連接,而不是刪文件自己了,直到只有一我的連接它,纔會是真的刪呢。
          這時再執行drop表的動做,別提多快了,oh my god,快到驚人,mytable.ibd瞬間它不見了,不見了!
          最後別忘了把那個大大的「真文件」手工刪刪掉 
         rm -f mytable.ibd.h
         rm -f mytable.frm.h
 
          因此,同窗們,鄉親們,最最親愛的屌絲們,我痛完了,也絮叨完了,但願你疼的時候能看到這篇博客,幫你節約哪怕一杯茶的時間,也值了。共勉!
 
 
 
 
         正題說完了,說點題外話,一些mysql經常使用命令:
【1】如何查看錶記錄數、所佔空間等。這個在巨表面前,用select count(*) from mytable 神馬的都弱爆了,用這個:
root@ information_schema  04:24:23>SELECT TABLE_NAME,TABLE_ROWS,DATA_LENGTH FROM TABLES WHERE TABLE_SCHEMA='mydatabase' AND TABLE_NAME='mytable';
【2】如何查看mysql鏈接狀況,哪些用戶連着,分別用了多少鏈接數
root@information_schema 01:31:12>select substr(host,1,locate(':',host)-1),user, count(*) from processlist group by substr(host,1,locate(':',host)-1), user order by count(*) desc, host desc;
【3】如何斷開這些鏈接呢?
root@(none) 01:26:08>show processlist;  // 看到相關鏈接的id
root@(none) 01:26:08>kill id;                   // 斷掉鏈接,id即爲上條命令查到的
相關文章
相關標籤/搜索