當 MySQL 日誌中遇到「Lock wait timeout returned」錯誤時,表示交易正在等待用於鎖定資料庫項目。雖然您可能知道哪個查詢正在嘗試存取資料庫,但確定在該精確時刻持有鎖的查詢可能具有挑戰性。
「事務」一詞的存在錯誤訊息中表明有問題的查詢涉及修改一個或多個 InnoDB 表中的至少一行。由於您有權存取導致錯誤的查詢,因此您可以確定正在存取哪些表,因為它們是潛在的罪魁禍首。
要進一步調查,請執行以下命令命令:
SHOW ENGINE INNODB STATUS\G
這將提供有關鎖定和互斥鎖的信息,包括:
例如,來自客戶端的以下輸出說明了這個問題。
Type: InnoDB Name: Status: ===================================== 110514 19:44:14 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- Mutex spin waits 0, rounds 11487096053, OS waits 7756855 RW-shared spins 722142, OS waits 211221; RW-excl spins 787046, OS waits 39353 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 110507 21:41:35 Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1 MySQL thread id 3686635, query id 124164167 10.64.89.145 viget updating DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' ) ...
在此輸出中,出現表格「檔案」成為受影響的表,因為 DELETE 查詢正在嘗試修改該表中的行。透過分析輸出,您可以找出導致鎖爭用的特定表。
為了避免將來遇到這些錯誤,請考慮增加鎖定等待超時透過設定 innodb_lock_wait_timeout 參數來設定 InnoDB 的值。預設值為 50 秒。
要永久增加超時,請將以下行添加到/etc/my.cnf 檔案中:
[mysqld] innodb_lock_wait_timeout=120
或者,您可以臨時調整超時在當前會話內:
SET innodb_lock_wait_timeout = 120;
增加超時將為等待交易提供更多時間來獲取鎖,從而降低可能性超時錯誤。
以上是如何解決MySQL的「超過鎖定等待逾時」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!