一、现象

在生产环境中我们偶尔会遇到show processlist;显示host为 unauthenticated user 这样的连接,同时伴有数据库服务器层面的load,sys cpu较高,或者thread running异常。

二、分析

类似于校园门卫看到一个陌生的人进入学校,对TA提出的哲学式问题:TA是谁?从哪里来? 要干什么?本文从IT技术角度回答这个哲学问题。

TA是谁?

官方介绍:

unauthenticated user refers to a thread that has become associated with a client connection but for which authentication of the client user has not yet been done。

意即:MySQL有一个线程在处理客户端的连接,但是该客户端还没通过用户验证,show processlist时显示"unauthenticated user"。
1

从哪里来?

回答这个问题之前,我们先了解client端和MySQL建立TCP连接(socket不在讨论范围之内)的过程,一般客户端建立与MySQL的连接分4步:

  1. 客户端发送数据包到MySQL服务器,准备建立连接。如果MySQL服务器对应的端口没有运行,则客户端会直接收到报错信息:

    ERROR 2003 (HY000): Can't connect to MySQL server on '[host]' (111)

  2. 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"。

  3. 客户端发送username/password/要访问的dbname到MySQ数据库服务器。如果客户端由于某些原因在connect_timeout规定的时间内没有发送包或者发送错误的包,数据库服务器会断开该连接。
  4. 服务器验证并返回验证结果给客户端。如果验证不通过 则通常返回: 

    ERROR 1045 (28000): Access denied for user 'user'@'host' (using password: [YES/NO])

ok,至此,我们可以知道TA来自客户端和MySQL服务器建立连接的第二阶段过程中。

要做什么?

显然此类连接是要访问数据库,准备获取数据或者写入数据。但是我们如何规避这样的三无人员的出现呢? 从该问题产生的原因来分析,主要的解决方法如下:

  • 在 /etc/my.cnf 的[mysqld]中添加

    skip-name-resolve

    参数,关闭mysql的dns反查询,mysql使用IP或者%授权。

  • 在 /etc/hosts 添加IP与主机名对应关系

    192.168.0.1 xxxx

值得注意的是在我们生产环境中已经为MySQL配置了skip-name-resolve,依然会出现大量unauthenticated user 的连接时,表明MySQL服务器没有为客户端连接请求确认凭证,也就是说MySQL无法确认这些连接使用的数据库账号信息,在wait_timeout时间之内MySQL一直等待这些连接完成。 比如我在某机器上执行

telnet x.x.x.x 3306

目标机器上 MySQL中执行

mysql>show processlist;

有一个连接显示为unauthenticated user 。 因此这种现象不一定就是数据库本身的问题,下面这些都有可能产生这种现象:

  1. 如果由于应用安全问题出现大量数据库探测,出现大量这种未经授权的连接。
  2. 应用服务压力过大出现线程异常中断导致出现大量异常数据库连接。
  3. 应用服务到db服务器的网络异常,客户端由于某些参数配置不正确致使正常的请求没有在规定时间内发出,MySQL无法验证连接的有效性。
  4. MySQL客户端连接版本问题,验证协议不兼容,尤其注意old-password验证方式。
  5. 数据库服务器的线程处于排队状态,因此可以加大back_log,增加MySQL处理连接请求的能力。

前三种情况要从应用服务器端查看系统的负载或者应用程序的状态,后面两个要从数据库服务器层面来检查系统的状态。

三、参考

MySQL:关于 unauthenticated user的更多相关文章

  1. mysql执行show processlist unauthenticated user 解决方法

    一台unibilling机器前几天突然负载变重. 在top中发现cpu被大量占用. agi程序运行的很慢,并出现僵尸进程. 其实当时只有50个左右的并发呼叫. 远远达不到正常水准. 重新启动机器问题也 ...

  2. MySQL DNS反查导致连接缓慢

    场景 机器A上的一个模块连接机器B上的MySQL,在实验室网络环境下正常:同样A.B两台机器,网络环境切换为与外界隔离的一个小型局域网环境,A上的模块与B上MySQL建立连接非常慢.   环境 SuS ...

  3. [转]解决MySQL出现大量unauthenticated user的问题

    最近发现两台MySQL server在中午的时候忽然(很突然的那种)发飙,不断的挂掉.重启mysql也尽是失败,看mysql的errorlog,只能看到类似如下的信息: Forcing close o ...

  4. | unauthenticated user (1130, "Host '127.0.0.1' is not allowed to connect to this MySQL server")

    mysql> show processlist;+----+----------------------+-----------------+------+---------+------+-- ...

  5. 解决MySQL出现大量unauthenticated user的问题

    近期OJ及相关的站点打开异常的慢,简直崩溃,一直没找着原因. 进入数据库server.进到mysql里,用show processlist命令查看一下,发现有非常多的unauthenticated u ...

  6. MySQL出现大量unauthenticated user的问题

    发现这算属MySQL的一个bug,不管连接是通过hosts还是ip的方式,MySQL都会对DNS做反查,IP到DNS,由于反查的接续速度过 慢(不管是不是isp提供的dns服务器的问题或者其他原因), ...

  7. mysql timeout知多少

    1.timeout变量知多少 打开mysql,用show variables like '%timeout%'命令一看,不看不知道,一看吓一跳,结果如下面所示,这么多timeout相关变量,一下就吓尿 ...

  8. 深度解析mysql登录原理

    使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...

  9. mysql配置以及性能优化(转)

    MySQL配置文件my.cnf中文详解,附mysql性能优化方法分享 ================================================================= ...

随机推荐

  1. java学习-sha1散列算法

    直接调用HashKit.sha1(String str)方法就可以了,,返回的是16进制的字符串长度是40, 也就是用md.digest()方法解析出来的字节数是160字节长度. 而MD5散列算法生成 ...

  2. [转]ASP.NET Core 指定环境发布(hosting environment)

    本文转自:https://www.cnblogs.com/xishuai/p/asp-net-core-set-hosting-environment-with-publish.html ASP.NE ...

  3. [转]C#进阶系列——WebApi 接口参数不再困惑:传参详解

    本文转自:http://www.cnblogs.com/landeanfen/p/5337072.html#_label1_2 阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作 ...

  4. datatable 转excel

    public static void ExportToExcel(System.Data.DataTable dt) { if (dt == null) return; Microsoft.Offic ...

  5. TortoiseGit用户手册

    3 配置TortoiseGit 3.1 生成公钥 生成SSH安全密钥,提供给GIT版本库管理员以访问Git 版本库,点击桌面上生成的图标 然后执行执行“ssh-keygen”生成自己的公钥: 一路回车 ...

  6. NGINX防御CC攻击教程

    CC攻击即http flood,以攻击成本低(只需数台http代理服务器即可实现攻击).隐蔽性强(中小CC攻击一般不会造成网络瓶颈).难防御(与正常访问的请求很难区分开).威力强大(造成和DDOS流量 ...

  7. ajax对服务器返回xml的处理过程

    客户端:<script type="text/javascript">    function getXml(){        var name = $(" ...

  8. Unity3d之MonoBehavior自带方法的执行顺序

    首先贴一张图(从其他地方摘录的,不记得出处,如果有小伙伴知道可以评论留言) 看了以后脑子有个大概的概念,可还是一知半解的感觉(接触Unity也有2年之久,却从来没想过弄清楚心中这团迷雾,总是囫囵吞枣用 ...

  9. ASP.NET MVC传递Model到视图的多种方式总结(一)__通用方式的使用

    有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 场景: 在视图页面,下拉框选择课程触发事件,分别 ...

  10. 阿里云 CentOS7安装redis4.0.9并开启远程访问

    1 安装redis编译的c环境 yum install gcc-c++ redis是c语言开发的,安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境. 如果没有gcc环境,需要安装gcc ...