MYSQL锁死怎么办?

MYSQL锁死怎么办?,第1张

通过代码解锁

代码如下  

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 during 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]

mysql 悲观锁 没有锁定 的原因主要是事务控制不严谨。

悲观锁指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。

悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

举例说明:

可以使用命令设置MySQL为非autocommit模式:

set autocommit=0

设置完autocommit后,就可以执行系统的正常业务了。

具体如下:

//0.开始事务

begin

1.查询出商品信息

select status from t_goods where id=1 for update在此使用了select…for update的方式,这样就通过数据库实现了悲观锁。

2.根据商品信息生成订单

insert into t_orders (id,goods_id) values (null,1)

3.修改商品status为2

update t_goods set status=2

4.提交事务

commit

注:上面的begin/commit为事务的开始和结束,因为在前一步关闭了mysql的autocommit,所以需要手动控制事务的提交。

1)可以使用show processlist查看当前用户连接

如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。show processlist只列出前100条,如果想全列出请使用show full processlist

2)在构造锁的会话中,使用unlock tables也可以解锁


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6196218.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存