问题描述:
RDS MySQL MyISAM 表级锁等待的产生和处理
解决过程:
在使用 MyISAM 引擎表过程中,经常会碰到会话处于表级锁等待(Waiting for table level lock)的情况,经常会导致连接数堆积,严重的情况下会出现由于实例连接数被占满而应用无法正常连接的情况。
注:RDS MySQL 不推荐使用MyISAM引擎表,因为其不支持事务,读写相互冲突(同一时间仅能执行读取或写入),仅支持表级锁,且有数据丢失的风险。
1. 出现表级锁等待的原因
MyISAM引擎表上有长时间未结束的查询
在该查询执行过程中,出现DML数据修改语句(比如 Insert、Update、Delete、Replace)
比如:
可以看到:
表 perf_test_myisam 上有一条长时间没有结束的查询(本例选择了一条SQL注入查询) - select * from perf_test_myisam where id = 15 OR 1=sleep(300)
在这条查询执行的过程中,又有一条数据修改语句出现 - update perf_test_myisam set detail='my_test' where id = 9
由于MyISAM 引擎表读写相互冲突,因此后提交的 update 语句需要等待之前的 Select 语句完成;而在 update 语句之后的任何语句,则要等待 update 语句的完成。随着对该MyISAM引擎表访问的不断增加,连接数也开始堆积。
2. 解决方法
终止长时间的查询(在本例中,终止 ID 为 118013161的长时间执行会话)。
如何终止会话,请参考:RDS MySQL 如何终止会话。
如何管理长时间的查询,请参考:RDS MySQL 管理长时间运行查询
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。