/ mysql

mysql lost connection

问题

连接云服务器上的 mysql 时出现了以下问题:

ERROR 2013 (HY000): Lost connection to MySQL server at 'waiting for initial communication packet', system error: 0

原因

mysql开启了DNS的反向解析功能,这样mysql对连接的客户端会进行DNS主机名查找。

  • mysql处理客户端解析过程:
  1. 当mysql的client连过来的时候,服务器会主动去查client的域名。
  2. 首先查找 /etc/hosts 文件,搜索域名和IP的对应关系。
  3. 如果hosts文件没有,则查找DNS设置,进行DNS反向解析,直到timeout连接失败。
  • mysql的DNS反向解析:
  1. mysql接收到连接请求后,获得的是客户端的ip,为了更好的匹配mysql.user里的权限记录(某些是用hostname定义的)。
  2. 如果mysql服务器设置了dns服务器,并且客户端ip在dns上并没有相应的hostname,那么这个过程很慢,导致连接等待。

解决

在 mysql 的配置文件中的[mysqld]后面加上 skip-name-resolve

/etc/mysql/my.cnf OR For Ubuntu16.* /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
skip-name-resolve

重启

sudo service mysql restart

相关配置参数

  • skip-name-resolve

跳过DNS反向解析过程.(这样就不能使用主机名连接mysql了,只能使用ip连接)

  • skip-grant-tables

跳过授权表(当mysql登陆密码忘记时的解决办法)

  • skip-networking

跳过TCP/IP连接

  • skip-host-cache

禁用主机名缓存;要想清除主机名缓存,执行FLUSH HOSTS语句或执行mysqladmin flush-hosts命令

参考

https://stackoverflow.com/a/42221456/6011995

然而

过了一段时间又连不上了,以上方案无效,现在估计是 navicat 的问题,暂时先用其他 MySQL gui 试试。

然后

看起来是云服务器厂商的安全策略?有的时候已经连上了还是会断连,恢复到了最初始的配置……