When encountering "Lock wait timeout exceeded" errors in MySQL logs, it's indicative of a transaction waiting for a lock on a database item. While you may know which query is attempting to access the database, determining the query holding the lock at that precise moment can be challenging.
The presence of the word "transaction" in the error message suggests that the problematic query involves modifying at least one row in one or more InnoDB tables. Since you have access to the query causing the errors, you can determine which tables are being accessed, as they are potential culprits.
To further investigate, run the following command:
SHOW ENGINE INNODB STATUS\G
This will provide information on locks and mutexes, including:
For instance, the following output from a client illustrates the issue.
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' ) ...
In this output, the table "file" appears to be the affected table, as the DELETE query is attempting to modify rows in that table. By analyzing the output, you can pinpoint the specific table that is causing the lock contention.
To avoid encountering these errors in the future, consider increasing the lock wait timeout value for InnoDB by setting the innodb_lock_wait_timeout parameter. The default value is 50 seconds.
To increase the timeout permanently, add the following line to your /etc/my.cnf file:
[mysqld] innodb_lock_wait_timeout=120
Alternatively, you can adjust the timeout temporarily within the current session:
SET innodb_lock_wait_timeout = 120;
Increasing the timeout will grant the waiting transaction more time to acquire the lock, reducing the likelihood of timeout errors.
The above is the detailed content of How to Resolve MySQL's 'Lock wait timeout exceeded' Errors?. For more information, please follow other related articles on the PHP Chinese website!