您现在的位置:首页 » 红经验 » 技术博客

Mysql假死如何解决

2019-05-20 09:05:13

1、Mysql报错Forcing close of thread 139 user: 'root'

 

最近重启服务器的mysql总是报大量的如下错误:

160330  9:14:26 [Warning] /usr/libexec/mysqld: Forcing close of thread 139  user: 'root'
160330  9:14:26 [Warning] /usr/libexec/mysqld: Forcing close of thread 138  user: 'root'
160330  9:14:26 [Warning] /usr/libexec/mysqld: Forcing close of thread 137  user: 'root'
160330  9:14:26 [Warning] /usr/libexec/mysqld: Forcing close of thread 136  user: 'pdss'
160330  9:14:26 [Warning] /usr/libexec/mysqld: Forcing close of thread 131  user: 'root'
160330  9:14:26 [Warning] /usr/libexec/mysqld: Forcing close of thread 130  user: 'csm'


 

这个错误其实是mysql在对DNS做反查,由于反查的接续速度过慢,大量的查询处理不及时,线程得不到释放,造成MySQL“ 假死”。


解决办法:

 

linux服务器

修改mysql的配置文件(my.cnf)在[mysqld]下添加:

skip-name-resolve

windows服务器

修改mysql的配置文件(my.ini)在[mysqld]下添加:

    skip-locking
  skip-name-resolve


修改完成后,重启mysql服务。

2、优化MySQL开启skip-name-resolve参数时显示“ignored in --skip-name-resolve mode.”Warning解决方法

 

参数用途: 
skip-name-resolve #禁止MySQL对外部连接进行DNS解析skip-grant-tables

添加–skip-name-resolve方法:

[Mysqld] 
 ……
skip-name-resolve
……
  • 1
  • 2
  • 3
  • 4

修改配置文件添加并需要重启。

参数优化: 
skip-name-resolve 参数的目的是不再进行反解析(ip不反解成域名),这样可以加快数据库的反应时间。 
内部有DNS服务器,对各服务器的IP做了反向解析,但未对内网IP做反向解析,所以使用skip-name-resolve以后用内网地址向mysqlslap请求响应快了一半。

添加“–skip-name-resolve mode”参数后发现错误日志有

120203 10:21:06 [Warning] 'user' entry 'root@jimmyli\' ignored in --skip-name-resolve mode.
120203 10:21:06 [Warning] 'user' entry '@jimmyli\' ignored in --skip-name-resolve mode.
  • 1
  • 2

只需去服务器里边把用户root@jimmyli和@jimmyli删除即可。 
提示Warning信息:

130739 11:12:22 [Warning] 'user' entry 'root@localhost.localdomain\' ignored in --skip-name-resolve mode.
130739 11:12:22 [Warning] 'user' entry '@localhost.localdomain\' ignored in --skip-name-resolve mode.
  • 1
  • 2

一般在优化MySQL配置参数时,添加“–skip-name-resolve”,然后在重新启动MYSQL时检查启动日志,发现有警告信息。如上。

原因分析: 
“–skip-name-resolve mode”是禁用dns解析,避免网络DNS解析服务引发访问MYSQL的错误,一般应当启用。 
启用“–skip-name-resolve mode”后,在MySQL的授权表中就不能使用主机名了,只能使用IP ,出现此警告是由于mysql 表中已经存在有 localhost.localdomain 帐号信息。

解决方法: 
把Warning的账号删除就解决了。 
MySQL命令行:

mysql>use mysql;
mysql> delete from user where HOST='localhost.localdomain';
Query OK, 2 rows affected (0.00 sec)
  • 1
  • 2
  • 3

最后,重启MySQL,再看错误信息提示,日志发现警告已经没有啦。该方法是mysql启用skip-name-resolve模式时出现Warning的处理办法。