Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0

连接MySQL提示:

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

这是由于库文件初始化连接MySQL时连接失败引起的。

导致此错误的原因有:

  • mysql设置文件中“bind-address”值的问题;
  • 访问权限限制问题;
  • 防火墙、杀毒软件阻拦的问题(特别是Windows);
  • 负载过大、最大连接限制了访问(特别正式提供服务的mysql)

1、mysql设置文件的问题:
在mysql数据库一些版本,为了保证安全,mysql安装后,默认只监听本机ip的“127.0.0.1”,如下:

reading_initial_communication_packet.png

这时表现为连接“127.0.0.1”或“localhost”可以连通,连接局域网ip和公网IP无法连通。这时我们将“/etc/my.cnf”文件中的“bind-address”行前添加一个“#”号注释掉,并重启mysqld服务即可:

1
2
3
4
5
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock
#bind-address=127.0.0.1

注:linux下mysql配置文件默认在“/etc/my.cnf”,Windows平台mysql配置文件在安装目录下的“my.ini”。

2、访问权限的问题:
①、默认mysql的账户只允许本机登录的,要给账户授权通过“ip+端口”进行远程访问,需要先在mysql服务器上授权。在服务器桑登录到mysql,执行下面SQL语句授权:

1
2
3
4
5
6
7
8
9
use mysql;
-- 将数据库"aiezu"的所有权限授权给"root"通过密码"123456"在"8.8.8.8"上进行访问;
grant all privileges on aiezu.* to 'root'@'8.8.8.8' identified by '123456';
-- 将数据库"test"的所有权限授权给"aiezu"通过密码"123321"在任何主机上进行访问;
grant all privileges on test.* to 'aiezu'@'%' identified by '123321';
--刷新权限表
flush privileges;

②、 在mysql客户端连接到服务端时,服务端会根据客户端的ip,尝试将客户端的ip解析为“主机名”,再通过“主机名”去检查mysql的权限表,这项功能叫“name-resolv”。由于此功能的某些原因,也会导致我们文章标题中的错误,还有就是会导致连接数据库变慢,所以需要将吃功能禁用。
禁用方法:在mysql设置文件“[mysqld]”选项组下一行“skip-name-resolve”;

1
2
3
4
5
6
[mysqld]
datadir=/storage/aiezu.com/mysql
socket=/storage/aiezu.com/mysql/mysql.sock
#bind-address=127.0.0.1
skip-name-resolve

③、如果是linux,修改“/etc/hosts.allow”文件,在文件的末尾添加下面内容,允许所有主机访问本机的“mysql”服务:

1
2
mysqld : ALL : ALLOW
mysqld-max : ALL : ALLOW

3、防火墙和杀毒软件:
关闭杀毒软件和防火墙试试,windows方面:关闭系统防火墙,中国人常用的QQ电脑管家、360安全卫士、QQ医生、金山毒霸、卡巴斯基等;linux方便,检查iptables、ipfire系统自带防火墙的设置。

4、服务过载的问题:
①、mysql服务过载:

  • 执行“show processlist;”SQL命令看是否当前打开的连接过多;
  • 使用“show variables like ‘%connect_timeout%’;”语句的设置值,改成一个稍大的值,如20:“SET GLOBAL connect_timeout = 20;”
  • 使用“SHOW STATUS like ‘aborted_%’;”语句查询异常终止的连接和失败的连接;

②、系统过载:

  • 使用shell命令“top”观察mysql占有的内存、cpu情况;
  • 使用shell命令“free -h”看内存占有情况;
  • 使用shell命令“uptime”看cpu负载情况;
  • 使用shell命令“df -h”看磁盘空间使用率,特别占用率100%的情况;

from:https://www.aiezu.com/article/mysql_error_at_reading_initial_communication_packet

发表评论

电子邮件地址不会被公开。 必填项已用*标注