连接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”,如下:
这时表现为连接“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