微博上討論mysql在刪除大表engine=innodb(30g+)時,如何減少my hang的時間,現做一下簡單總結:
當buffer_pool很大的時候(30g+),由於刪除表時,會遍歷整個buffer pool來清理資料,會導致mysql hang住,解決的辦法是:
1、當innodb_file_per_table=0的時候,以上不是問題,因為採用共享表空間的時候,該錶所占用的空間不會被刪除,buffer pool中的相關頁不程式設計客棧會 被discard。
2、當innodb_file_per_www.cppcns.comtable=1的時候,並且當buffer_pool比較大的時候,遍歷整個buffer poyibofol 需要很多的時間(table_cache 會被鎖住,所有的dml操作被阻止)。
認識誤區:
將innodb 表改為 myisam表,這個是沒有效果的,該操作會刪除舊表,建立新錶,依然會遍歷整個buffer_pool。
解決思路:
1、採用指令碼形式,批量刪除部分記錄
2、可以再sl**e上進行操作,進行主備切換(成本高)
3、percona 5.1.58以上版本都支援innodb_lazy_drop_table(bug不少,慎用)
4、與buffer pool無關,但是可以加快 刪除資料檔案的速度,同樣能減少mysql hang住的時間。即:對資料檔案建立硬鏈結,(依賴原理:os hard link 當多個檔名同時指向同乙個inode時,這個inode的引用數n>1, 刪除其中任何乙個檔名只是刪除了乙個指標而已,不會刪除資料檔案。當inode的引用數n=1時, 刪除檔案需要去程式設計客棧把這個檔案相關的所有資料塊清除,所以會比較耗時)
本文標題: mysql 刪除大表的效能問題解決方案
本文位址:
mysql刪除大表更快的drop table辦法
曾經發文介紹過,drop table 特別是碰到大表時,在drop table 過程中,所有操作都會被hang住。這是因為innodb會維護乙個全域性獨佔鎖 在table cache上面 直到drop table完成才釋放。在我們常用的ext3,ext4,ntfs檔案系統,要刪除乙個大檔案 幾十g,...
mysql刪除大表更快的drop table辦法
利用硬鏈結和truncate降低drop table對線上環境的影響 在drop table的時候,所有程序不管是ddl還是dml都被hang起 直到drop結束才繼續執行 這是因為innodb會維護乙個全域性獨佔鎖 在table cache上面 直到drop table完成才釋放。在我們常用的ex...
MySQL 儲存過程刪除大表
1 許可權問題 alter routine 編輯或刪除儲存過程 create routine 建立儲存過程 execute 建立儲存過程 2 儲存過程相關的一些命令 show procedure status g 檢視資料庫中有哪些儲存過程 show procedure status where d...