MySQL 死锁的定位与处理
应用报 Deadlock found when trying to get lock; try restarting transaction(ERROR 1213)。事务被 InnoDB 选为牺牲者回滚,通常不是数据库坏了,而是加锁顺序或索引问题。
SHOW ENGINE INNODB STATUS\G
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';
SELECT * FROM performance_schema.data_locks;
SELECT * FROM performance_schema.data_waits;
错误日志:
tail -100 /var/log/mysql/error.log | grep -i deadlock
innodb_print_all_deadlocks 持续记录,按 SQL 模式治理。mysql — 执行诊断 SQLjournalctl — 错误日志mysqladmin — 服务状态合上页面,先回答,再展开对照。
innodb_print_all_deadlocks。再结合 SHOW ENGINE INNODB STATUS 和错误日志中的 deadlock 记录。