RDS MySQL行锁等待和行锁等待超时的处理
问题描述
当一个连接会话等待另外一个会话持有的互斥行锁时,就会发生行锁等待情况,行锁等待超时的报错如下。
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
问题原因
通常情况下,持有该互斥行锁的会话会迅速的执行完相关操作并释放掉持有的互斥锁(事务提交或者回滚),然后等待的会话在行锁等待超时时间内获得该互斥行锁,进行下一步操作。但在某些情况下,比如一个实例未感知到的来自客户端应用的数据库会话中断,持有该互斥行锁的会话长时间不释放该互斥行锁,此时如果有其他会话申请该互斥行锁,则会导致大量的行锁等待与行锁等待超时。
解决方案
阿里云提醒您:
- 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
- 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
- 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
本文提供的检查和处理方法,仅当正在发生行锁等待的情况下才成立。因为RDS MySQL行锁等待默认超时时间为50秒,通常情况下不容易观察到行锁等待的现场,可以通过将innodb_lock_wait_timeout参数设置为较大值来复现问题,但是生产环境不推荐使用过大的innodb_lock_wait_timeout参数值。
- 在旧版DMS控制台,参见DMS登录RDS数据库,登录RDS数据库。
- 依次单击性能>InnoDB锁等待,检查导致锁等待和锁超时的会话。
如果返回结果中没有等待锁,请您执行以下操作,查看存在当前正在执行的事务和等待锁的事务。
- 执行以下SQL语句,查看正在执行的事务。
SELECT * FROM information_schema.INNODB_TRX;
- 执行以下SQL语句,查看等待锁的事务。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
- 执行以下SQL语句,查看正在锁的事务。
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
- 执行以下SQL语句,查看正在执行的事务。
- 对于标识为Blocker的会话,即持有锁阻塞其他会话的DML操作,导致行锁等待和行锁等待超时,确认可以接受其对应的事务回滚的情况下,可以将其终止。
- 如果您还是无法解决问题,请参见锁阻塞,通过锁阻塞统计页面快速定位造成长时间阻塞的会话及其详细信息。
适用于
- 云数据库 RDS MySQL 版