如果您使用的是一個很大的innodb表,並且您正在更新、插入或刪除大量的行,那么您可能會偶然發現以下錯誤:
[Err] 1206 - The total number of locks exceeds the lock table size
innodb將其鎖表存儲在主緩沖池中。這意味着可以同時擁有的鎖的數量受mysql啟動時設置的innodb_buffer_pool_size變量的限制。默認情況下,mysql將其保留為8mb,如果您在服務器上使用innodb執行任何操作,那么這是非常無用的。
幸運的是,解決這個問題非常容易:將innodb_buffer_pool_size調整為一個更合理的值。該修復確實需要重新啟動mysql守護進程。但是根本沒有辦法動態地調整這個變量(在本文撰寫之際使用當前穩定的mysql版本)。
在調整變量之前,請確保服務器可以處理額外的內存使用。innodb_buffer_pool_size變量是服務器范圍的變量,而不是每個線程的變量,因此它在所有到mysql服務器的連接(如查詢緩存)之間共享。如果將其設置為1GB,MySQL不會預先使用所有這些。隨着mysql發現更多的東西要放入緩沖區,內存使用量將逐漸增加,直到達到1gb。這時,最舊和使用最少的數據在需要出現新數據時開始被裁剪。
如何不重啟mysql達到同樣的效果?
如果需要刪除一百萬行,請嘗試在每個事務中刪除其中5-10%的行。這可能允許您在不重新啟動mysql的情況下,在鎖定表大小限制下清除一些數據。