发布网友 发布时间:2022-04-24 15:06
共2个回答
懂视网 时间:2022-04-29 21:48
RECORD LOCKS space id 122 page no 3 n bits 80 index `PRIMARY` of table `test`.`t` trx id 307463 lock_mode X
RECORD LOCKS space id 122 page no 4 n bits 80 index `idx_name` of table `test`.`t` trx id 307463 lock_mode X
RECORD LOCKS space id 122 page no 4 n bits 80 index `idx_name` of table `test`.`t` trx id 307463 lock_mode X locks gap before rec
mysql> show processlist; +------+------+---------------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined | +------+------+---------------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+-----------+---------------+ | 4256 | root | localhost | test | Sleep | 72573 | | NULL | 7 | 7 | | 4375 | repl | 172.16.52.131:49285 | NULL | Binlog Dump | 75947 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | 0 | 0 | | 5294 | root | localhost | test | Sleep | 72553 | | NULL | 0 | 0 | | 9060 | root | localhost | test | Query | 0 | init | show processlist | 0 | 0 | | 9289 | root | localhost | NULL | Sleep | 40 | | NULL | 0 | 0 | +------+------+---------------------+------+-------------+-------+-----------------------------------------------------------------------+------------------+-----------+---------------+ 5 rows in set (0.00 sec) |
mysql> select * from t; +----+----------+------+ | i | name | age | +----+----------+------+ | 1 | zhangsna | 20 | | 2 | zhangsna | 20 | | 3 | c | 23 | | 4 | c | 23 | | 5 | e | NULL | | 6 | f | NULL | | 19 | xiaoming | 23 | +----+----------+------+ 7 rows in set (0.00 sec) |
判断:
通过innodb status发现对t表上了表锁:TABLE LOCK table `test`.`t` trx id 307463 lock mode IX
通过select * from t发现该表有7行:7 rows in set (0.00 sec)
通过show processlist发现有一个会话的Rows_sent | Rows_examined为7 7 ,ID为4526
通过判断kill掉id为4526会话:
mysql> kill 4256; Query OK, 0 rows affected (0.00 sec) |
在执行delete操作,顺利执行:
mysql> delete from t; Query OK, 7 rows affected (0.01 sec) |
本文出自 “浮生凤年” 博客,请务必保留此出处http://liuzhanbin.blog.51cto.com/10060150/1647320
MySQL锁检测-kill
标签:锁
热心网友 时间:2022-04-29 18:56
通过代码解锁。
代码如下
1set global max_connections=4000;
增加允许的最大连接数,先让前台网站可以正常工作。
回过头google :mysql unauthenticated user
果然,遇到此类问题的人很多,问题在于mysql的反向ip地址解析,配置参数里加上skip-name-resolve就可以。
补充
一、查看进程运行情况(会话1)
代码如下
1mysql> select id,user,host,db,command,time,state from processlist a;+—-+——+—————–+——————–+———+——+———–+| id | user | host | db | command | time | state|+—-+——+—————–+——————–+———+——+———–+| 40 | root | localhost:14046 | information_schema | Query | 0 | executing|| 39 | root | localhost:13992 | chf | Sleep | 251 ||| 38 | root | localhost:13991 | chf | Sleep | 251 ||+—-+——+—————–+——————–+———+——+———–+3 rows in set (0.00 sec)
二、构造表被锁现象
1)锁住表(会话1)
代码如下
1mysql>LOCK TABLES chf.disc02 READ;或者–LOCK TABLES chf.disc02 WRITE;
2)执行dml操作(会话2)
代码如下
1mysql>delete from chf.disc02 limit 1;–会话处于卡死状态
3)查询进程运行情况(会话1)
代码如下
1mysql> select id,user,host,db,command,time,state from processlist a;+—-+——+—————–+——————–+———+——+———–+| id | user | host | db | command | time | state|+—-+——+—————–+——————–+———+——+———–+| 41 | root | localhost:14358 | chf | Query | 5 | Locked|| 40 | root | localhost:14046 | information_schema | Query | 0 | executing|| 39 | root | localhost:13992 | chf | Sleep | 343 ||| 38 | root | localhost:13991 | chf | Sleep | 343 ||+—-+——+—————–+——————–+———+——+———–+
4 rows in set (0.01 sec)
说明:发现进程id为41的进程状态为Locked
三、解锁操作
1)删掉被锁进程(会话1)
代码如下
1mysql> kill 41;
出现现象(会话2)
ERROR 2013 (HY000): Lost connection to MySQL server ring query
2)查看进程(会话1)
代码如下
1mysql> select id,user,host,db,command,time,state from processlist a;+—-+——+—————–+——————–+———+——+———–+| id | user | host | db | command | time | state|+—-+——+—————–+——————–+———+——+———–+| 40 | root | localhost:14046 | information_schema | Query | 0 | executing|| 39 | root | localhost:13992 | chf | Sleep | 298 ||| 38 | root | localhost:13991 | chf | Sleep | 298 ||+—-+——+—————–+——————–+———+——+———–+3 rows in set (0.01 sec)
四、批量解锁
代码如下
1mysql> select concat(‘kill ‘,id,’;') kill_process from processlist a where a.state=’Locked’;+————–+| kill_process |+————–+| kill 43; || kill 42; |+————–+2 rows in set (0.01 sec)
Note:
1)可以使用show processlist查看当前用户连接
如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。show processlist;只列出前100条,如果想全列出请使用show full processlist;
2)在构造锁的会话中,使用unlock tables;也可以解锁
总结一下原因,大概如下:
因为mysql默认会根据客户端的ip地址反向解析,用于用户登录授权之用。不过正常情况下,很少会有人这样用。ip地址反向解析是很慢的,尤其是高负荷的mysql,每秒种几百次甚至更高的请求,这个请求压到本地的dns服务器上,dns服务器说不定会怀疑你在恶意请求,然后不理你了,然后这些登录请求就挂在那里,后面的连接还持续,然后越积越多,然后就达到mysql的最大连接数据*了,然后新的连接就直接被拒,得到连接数过多的消息。
因为mysql配置文件使用的之前的配置文件,当时跟web同服务器,所以不存在这个问题。
这也正好解释了为什么phpMyAdmin里看mysqld状态时,有很多失败的连接,它们应该就是因反解析失败而被拒的。
参考资料
MySQL解锁.壹聚教程[引用时间2018-1-21]