故障现象
show full processlist发现大量的innodb表出现Waiting for table level lock,业务将近不可用
原因分析
1 一开始当然是认为这是myisam引擎导致的,扫了一圈发现该db下确实有一个myisam表;
2 不过故障时无论是show processlist还是innodb_trx等结果看,都没有发现这个myisam表的记录;
3 排查了一圈又没有其他发现,于是又将怀疑的对象转到这个唯一存在的myisam表
4 鬼使神差地查了下information_schema.triggers表,发现了大量的触发器,触发器的意思大概是:无论什么表做什么更新,都将最后的时间戳写入到这个myisam表
5 基本断定原因就是它了,触发器更新myisam表,导致show processlist显示innodb处于Waiting for table level lock
故障模拟
1 sysbench准备一个表的数据,数据量很少即可,一个表即可
sysbench --report-interval=1 --num-threads=50 --max-time=2000 --test=sysbench/tests/db/oltp.lua --mysql-user='root' --mysql-password='mysql19-=' --oltp-table-size=50000 --mysql-host=10.9.158.2 --mysql-port=3306 --mysql-db=xx --max-requests=500000 --oltp-tables-count=1 prepare