某天接近业务高峰期想往表里加字段加不了,报错:Fail to get MDL on replica during DDL synchronize
遂等到业务空闲时操作、还是加不了,
最后怀疑是相关表被锁了,或者有事务一直进行(可能这俩是一个意思),
于是通过查看当前正在执行的线程和事务ID,kill掉遂解决问题
最后还有两个疑问没解决:
1.kill线程ID时只能由对应的sql执行者删除,让运维删都删不了,会显示没有该线程号;
2.kill掉的线程ID正在执行的sql里貌似没有包含我要操作的表,这样居然也会互相影响吗
另外,其他同事也给了我一些更改表结构但不会锁表的语句(对于我这个场景不适应),但还是备份下
查当前mysql的线程和事务信息
SHOW FULL PROCESSLIST 是一个用于查看MySQL服务器当前运行的所有线程和它们的状态的SQL命令。通过执行这个命令,你可以获取有关MySQL服务器上运行的所有连接和线程的详细信息,包括SQL语句、连接时间、执行时间等。
以下是执行 SHOW FULL PROCESSLIST 命令后可能返回的一些信息字段:
Id:线程的唯一ID。
User:连接的用户名。
Host:连接的主机名。
db:当前正在使用的数据库。
Command:线程正在执行的命令(例如,Sleep、Query、Connect)。
Time:线程运行的时间(秒)。
State:线程的当前状态。
Info:线程执行的SQL语句。
-- 显示mysql正在运行的线程
SHOW FULL PROCESSLIST
-- 查询当前事务的线程号、事务ID,执行状态,sql
SELECT
trx_mysql_thread_id,
trx_id,
trx_started AS start_time,
trx_state AS state,
trx_query AS query
FROM
information_schema.innodb_trx;
加字段但不锁表
ALTER TABLE `user` ADD `age` int NOT NULL DEFAULT '0' COMMENT '年龄',
ALGORITHM=Inplace,
LOCK=NONE;