时间:2021-07-01 10:21:17 帮助过:17人阅读
回答这个问题之前,我们先了解client端和MySQL建立TCP连接(socket不在讨论范围之内)的过程,一般客户端建立与MySQL的连接分4步:
客户端发送数据包到MySQL服务器,准备建立连接。如果MySQL服务器对应的端口没有运行,则客户端会直接收到报错信息:
ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘[host]‘ (111)
MySQL服务器向客户端响应基本信息 数据库服务器的ip,port,mysqld version,the thread id,客户端的host,port等等,此时连接已经建立但是尚未完成授权。
“When a new client connects to mysqld, mysqld spawns a new thread to handle the request. This thread first checks whether the host name is in the host name cache. If not, the thread attempts to resolve the host name: The thread takes the IP address and resolves it to a host name (using gethostbyaddr()). It then takes that host name and resolves it back to the IP address (using gethostbyname()) and compares to ensure it is the original IP address.”
实际连接过程是 mysql 分配一个新的线程来处理客户端的连接请求。先检查客户端的hostname 是否在缓存中,如果不在则对hostname解析。先作反向解析客户端IP --> 客户端的hostname,然后作客户端的hostname --> 客户端IP的正向解析。如果结果符合,则验证为合法用户允许登录,如果不符合则定义为"unauthenticated user"。
ERROR 1045 (28000): Access denied for user ‘user‘@‘host‘ (using password: [YES/NO])
在 /etc/my.cnf 的[mysqld]中添加
skip-name-resolve
参数,关闭mysql的dns反查询,mysql使用IP或者%授权。
在 /etc/hosts 添加IP与主机名对应关系
192.168.0.1 xxxx
目标机器上 MySQL中执行telnet x.x.x.x 3306
有一个连接显示为unauthenticated user 。 因此这种现象不一定就是数据库本身的问题,下面这些都有可能产生这种现象:mysql>show processlist;
前三种情况要从应用服务器端查看系统的负载或者应用程序的状态,后面两个要从数据库服务器层面来检查系统的状态。
《Troubleshooting Problems Connecting to MySQL》
《what is an unauthenticated user》
back_log 官方说明
connection-threads 官方说明
host-cache 官方说明
MySQL:关于 unauthenticated user
标签:span code 增加 5.6 DBName 授权 xxx 中断 ip add