开发的话不可信
今天开发告诉我说表损坏不能查也不能删,当然开发的话不能信。
自己测试下
mysql> select * from order_lines_field_b limit 1;
一直是卡死状态
一直在想为啥不报错的,如果损坏了要报错。
于是百度看下,说看锁,我就晕了,又忘记了,mysql的select可能造成阻塞。第一感觉是有备份吗?但是是测试环境。没备份,到底问题出在哪里。那只能查了。
DDL语句被阻塞通常因为存在获取资源后未及时提交释放的长事务。因此,查找kill掉事务运行时间大于DDL运行时间的会话即可使DDL语句顺利下发,SQL语句如下:
查找事务运行时间 >= DDL等待时间的线程
SELECT trx_mysql_thread_id AS PROCESSLIST_ID,
NOW(),
TRX_STARTED,
TO_SECONDS(now())-TO_SECONDS(trx_started) AS TRX_LAST_TIME ,
USER,
HOST,
DB,
TRX_QUERY
FROM INFORMATION_SCHEMA.INNODB_TRX trx
JOIN INFORMATION_SCHEMA.processlist pcl ON trx.trx_mysql_thread_id=pcl.id
WHERE trx_mysql_thread_id != connection_id()
AND TO_SECONDS(now())-TO_SECONDS(trx_started) >=
(SELECT MAX(Time)
FROM INFORMATION_SCHEMA.processlist
WHERE STATE='Waiting for table metadata lock'
AND INFO LIKE 'alter%table%' OR INFO LIKE 'truncate%table%') ;