问题的起因是这样的,我在准备执行修改表结构的SQL,主要是新增字段,然后就卡住了,网站也无法访问了。系统瞬间崩溃,出现 502访问超时。
现在就来分析一下这个问题的原因。
Waiting for table metadata lock 的意思当前线程正在等待获取该表的 metadata 独占锁,但是该锁现在被其它线程占用了,如果对方一直不释放的话,我们就只能一直处于等待状态,后面对该表查询的线程也只能处于等待的状态,因此就导致了前面出现的这种情况,表结构修改不了,网站也无法正常访问了。
怎么知道该操作正处于 Waiting for table metadata lock 状态呢? 使用命令 show processlist
查看当前线程的运行情况。
如果你的网站访问量很大的话,而且修改的这个表又是被频繁读写的表,那么现在你估计会看到很多条Waiting for table metadata lock,大家都在等着这把锁的释放。怎么办呢?
正常情况就是等会儿就好了,如果长时间等待,该锁一定是被未提交的事务占用了,可以通过sql查询
select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx
找到正在运行的事务,然后把这些线程kill,锁就被释放了。
关注公众号「Python之禅」,回复「1024」免费获取Python资源