当 MySQL 发生 Lock wait timeout timeout returned 错误时,如何识别持有锁的特定查询
介绍:
MySQL 中的锁等待超时超出错误表示查询在尝试时遇到锁等待超时访问锁定的资源。当多个查询访问相同的数据并且一个查询由于锁冲突而阻塞另一个查询的执行时,可能会发生这种情况。确定导致锁定等待的特定查询有助于解决问题并防止将来再次发生。
识别罪魁祸首查询:
在错误日志中,单词“ transaction”是一个关键指标,表明尝试访问数据库的查询正在修改一个或多个 InnoDB 表。知道触发错误的查询,就可以识别涉及的表。
使用命令 SHOW ENGINE INNODB STATUSG,可以获得有关受影响的表和锁定状态的信息。此命令显示详细信息,包括:
示例输出:
SHOW ENGINE INNODB STATUSG 的以下输出显示特定查询正在等待独占锁附件表:
RW-excl spins: 787046, OS waits: 39353 ... Latest foreign key error (a full list is printed in the InnoDB error log when a foreign key error occurs): ... 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 ... Foreign key constraint fails for table `backoffice`.`attachment`: , CONSTRAINT `attachment_ibfk_2` FOREIGN KEY (`file_id`) REFERENCES `file` (`file_id`) Trying to delete or update in parent table, in index `PRIMARY` tuple: ... But in child table `backoffice`.`attachment`, in index `PRIMARY`, there is a record:
解决方案:
要解决此问题,您可以增加 innodb_lock_wait_timeout 参数的值,该参数指定事务执行的最长时间在报告错误之前等待锁定。通过增加此超时,您可以为事务完成提供更多的缓冲时间,并减少锁定超时错误的可能性。
设置 innodb_lock_wait_timeout:
要永久设置超时,请将以下行添加到 /etc/my.cnf 并重新启动MySQL:
[mysqld] innodb_lock_wait_timeout=120
要设置当前会话的超时,请执行以下查询:
SET GLOBAL innodb_lock_wait_timeout = 120;
以上是如何识别MySQL中导致'锁定等待超时”错误的特定查询?的详细内容。更多信息请关注PHP中文网其他相关文章!