关注我们获得更多内容
作者 | 陈龙,云和恩墨西区工程师,一线服务过金融等行业,精通 oracle 性能优化,故障诊断,特殊恢复领域 。
众所周知 innodb 是支持事务型的存储引擎,在日常运维中大部分运维人员都会遇到关于 DDL 锁阻塞的情况,对于解决这类问题,有常规快速的解决方式。
那今天主要分享一个,如何去查找有关阻止事务的更多信息。
测试环境:
mysql> USE test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
新建测试表:
mysql> CREATE TABLE tx_albert (
-> id INT PRIMARY KEY,
-> name VARCHAR(20),
-> age INT,
-> sex CHAR(2),
-> city VARCHAR(20),
-> job VARCHAR(10)
-> );
Query OK, 0 rows affected (0.24 sec)
插入数据:
mysql> INSERT INTO tx_albert (id,name,age,sex,city,job) VALUES (1,'albert',18,'M','GuiYang','DBA');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tx_albert (id,name,age,sex,city,job) VALUES (2,'john',24,'F','GuiYang','DEV');
Query OK, 1 row affected (0.00 sec)
会话1:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE tx_albert SET name = 'Taeyeon' WHERE id = 2;
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
会话2:
mysql> UPDATE tx_albert SET name = 'Jessica' WHERE id = 2;
会话等待....
不同方法解读
对于一般常规的做法,可以直接利用 show processlist
如果发生了 DDL 锁阻塞,特别是表上有事务未提交的会话,利用show processlist,不便于具体定位。
当然,可以看 Command,找出 locked 的 id,然后 kill,但是这样太过于暴力,也容易会 kill 错。
备注:command列:显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。