上一篇: 魔域打神域战功排名奖励查询表 下一篇:waiting for table level lock锁

Mysql数据库DNS反查引发假死卡住设置skip-name-resolve解决

最近百度抓取显示,总有抓取失败和超时,开始不明白,还以为是cdn不给力,还责怪了付费cdn如此不厚道。今天上服务器发现mysql又卡死了导致网站一个多小时无法访问,已经发现两三次了。查看日志,似乎次数更多,联想起来百度的抓取失败原因在此。

mysqld.log显示警告错误信息如下:

160506 15:42:08 [Warning] IP address '120.27.40.12' could not be resolved: Name or service not known
160506 17:08:16 [Warning] IP address '218.244.254.49' could not be resolved: Name or service not known
160507  3:48:34 [Warning] IP address '74.207.252.101' could not be resolved: Name or service not known
160507  5:27:17 [Warning] IP address '121.42.0.31' could not be resolved: Name or service not known
160507 15:24:27 [Warning] IP address '112.124.108.222' could not be resolved: Name or service not known
160507 21:09:58 [Warning] IP address '169.54.233.118' could not be resolved: Name or service not known
160508  2:51:35 [Warning] IP address '121.42.0.18' could not be resolved: Name or service not known
160508 20:12:34 [Note] /usr/libexec/mysqld: Normal shutdown

160508 20:12:35 [Note] Event Scheduler: Purging the queue. 0 events
160508 20:12:37 [Warning] /usr/libexec/mysqld: Forcing close of thread 1819746  user: '*******'

以下是参考的解决方案:

发现这算属MySQL的一个bug,不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过 慢(不管是不是isp提供的dns服务器的问题或者其他原因),大量的查询就难以应付,线程不够用就使劲增加线程,但是却得不到释放,所以MySQL会 “ 假死”。

 

  解决的方案很简单,结束这个反查的过程,禁止任何解析。

 

  1、打开mysql的配置文件(my.cnf),在[mysqld]下面增加一行:

  skip-name-resolve

 

  2、在my.ini添加的内容:

  skip-locking

  skip-name-resolve

 

     重新载入配置文件或者重启MySQL服务即可

以上解决方案来自 http://my.oschina.net/u/1036767/blog/212689?fromerr=pifismr0

我只设置skip-name-resolve, 想来是因为换了服务器dns变了,把旧服务器的dns搬过来附加在resolv.conf里,观察看看后续。

 

skip-external-locking参数有限制:

MySQL的配置文件my.cnf中默认存在一行skip-external-locking的参数,即“跳过外部锁定”。根据MySQL开发网站的官方解释,External-locking用于多进程条件下为MyISAM数据表进行锁定。

 

如果你有多台服务器使用同一个数据库目录(不建议),那么每台服务器都必须开启external locking;

 

参数解释

当外部锁定(external-locking)起作用时,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定。由于服务器访问数据表时经 常需要等待解锁,因此在单服务器环境下external locking会让MySQL性能下降。所以在很多Linux发行版的源中,MySQL配置文件中默认使用了skip-external-locking 来避免external locking。

当使用了skip-external-locking后,为了使用MyISAMChk检查数据库或者修复、优化表,你必须保证在此过程中MySQL服务器没有使用需要操作的表。如果没有停止服务器,也至少需要先运行

1 mysqladmin flush-tables

命令,否则数据表可能出现异常。

 

参数使用说明

如果是多服务器环境,希望打开external locking特征,则注释掉这一行即可

1 # skip-external-locking

如果是单服务器环境,则将其禁用即可,使用如下语句

1 skip-external-locking

 

 注意事项

在老版本的MySQL中,此参数的写法为:

1 skip-locking

如果在新版本MySQL配置中依然使用此写法,则可能出现:

[Warning] ‘–skip-locking’ is deprecated and will be removed in a future release. Please use ‘–skip-external-locking’ instead.

推荐阅读

最新发表