MySQL连接错误的十二“坑”

环境准备

自建MySQL环境主机

主机:iZbp1e*****krn92qrx0Z

内网ip: 10.26.254.217

客户端ecs主机

主机:iZbp1e6*****zkrn92qrwzZ

内网ip: 10.24.236.231

说明

说明:mysql的account的组成为’user’@’host’

常见问题分析

ERROR 1045 (28000)

现象描述

ERROR 1045 (28000): Access denied for user 'testcon'@'10.24.236.231' (using password: YES)

可能1:password错误

当使用'testconcon'@'10.24.236.231'的account错误的password时,登录失败,因为创建了testcon@’%’,

所以account验证可以通过,但是密码不对

可能2:user错误(account错误)

当使用错误的user时,登录失败,按照之前的account的构成,实际的进行验证的account是: 'testconcon'@'10.24.236.231',

但是并没有创建'testconcon'@'10.24.236.231',而是创建的为testcon@’%’,所以account验证失败,即使使用正确的密码也无法登录,当创建一个'testconcon'@'%'的时候,使用正确密码则登录正常,如下:

可能3:account错误

与第二种相比,此次创建的账号和密码有如下对应:

Account

Password

testcon@'10.24.236.231'

123

testcon@'1.1.1.1'

12

当使用testcon@'10.24.236.231'以及密码12登录时,登录失败,因为testcon@'10.24.236.231'的

password为123,所以使用password为123可以正常登录

解决办法:

1、如果确认密码正确,检查mysql.user(rds for mysql分为高权限账号和普通账号管理,高权限账号的实例可以查询mysql.user_view表)表里面的account信息(主要是user,host列),确认连接的account符合user里面的匹配项

2、如果通过mysql.user(rds for mysql分为高权限账号和普通账号管理,高权限账号的实例可以查询mysql.user_view表)account正常,可以尝试更改一下密码再进行测试

3、最快速简单的方法是重新创建一个账号,授予相关的权限

ERROR 2005 (HY000)

现象描述

ERROR 2005 (HY000): Unknown MySQL server host 'com-mysql.coflodhn1n0y.us-west-1.rds.amazonaws.com' (110)

可能:DNS解析异常

同ping来获取ip,无法获取到,故mysql命令行进行连接时就出错了,此时需要通过ping来观察dns的解析,

并检查系统dns配置

20170809补充:当使用阿里云的ECS设置的安全组为如下时,会导致dns解析异常:

如下为测试结果:

ERROR 1449 (HY000)

现象描述

ERROR 1449 (HY000): The user specified as a definer ('testcon'@'10.24.236.231') does not exist

或者

ERROR 1045 (28000): user not exist

可能:account不存在(阿里云rds高安全模式特有)

解决办法:

原因是该account不存在,检查mysql.user(rds for mysql分为高权限账号和普通账号管理,高权限账号的实例可以查询mysql.user_view表)表里面的account信息(主要是user,host列),确认连接的account符合user里面的匹配项当把高安全模式切换到标准模式是,再次进行测试则变成ERROR 1045 (28000): Access denied for user 'contest'@'10.24.236.231' (using password: YES),如下

ERROR 2003 (HY000)

现象描述

ERROR 2003 (HY000): Can't connect to MySQL server on 'test.mysql.rds.aliyuncs.com' (110)

可能1:安全限制,不允许访问

一般表现为telnet特定特定端口不通

解决办法:

检查应用所在主机的安全规则是否有拦截

可能2:端口错误

端口错误,即使没有安全限制也无法连接,telnet 特定端口也不会通。

解决办法:

确认连接mysql的端口是否正确

可能3:mysql服务未正确运行

先关掉自建mysql数据库

然后进行连接

同样表现为telnet 特定断开不通。

解决办法:

(自建mysql的情况适用,rds不适用如下方法):

1,执行netstat -apn | grep 3306,检查下3306端口的进程信息

2,执行ps -ef | grep mysql,检查下进程信息

3,如果1和2没有输出,可能mysql server未在主机正确运行

可能4:如果是rds for mysql,且访问模式为标准模式,原因为客户端的ip地址在rds的白名单未配置

当加上白名单后(等待任务运行完成):

ERROR 1135 (HY000)

现象描述

ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the

manual for a possible OS-dependent bug

可能1:limits.conf文件对max user processes做了限制

解决办法:

(自建mysql的情况适用,rds不适用如下方法):

检查和修改系统的内核参数

可能2:mysql没有可用内存

解决办法:

(先确认内存是否已经不足)

增加mysql的内存,如果是rds,可以考虑升级RDS的实例规格

ERROR 1130 (HY000)

现象描述

ERROR 1130 (HY000): Host '192.168.1.3' is not allowed to connect to this MySQL server

可能:mysql.user表里没有匹配的host名称

解决办法:

检查mysql.user(rds for mysql分为高权限账号和普通账号管理,高权限账号的实例可以查询mysql.user_view表)表里面的account信息(主要是user,host列),确认连接的account符合user里面的匹配项

ERROR 1045 (HY000)

现象描述

ERROR 1045 (HY000): #28000ip not in whitelist

可能:rds for mysql的提示,且访问模式为高安全模式才会出现,原因是ip地址没有在rds的白名单中

当添加白名单后(等待任务运行完成):

解决办法:

检查RDS的白名单设置是否正确

ERROR 5 (HY000)

现象描述

ERROR 5 (HY000): Out of memory (Needed 260400 bytes)

可能:mysql没有可用内存

解决办法:

(先确认内存是否已经不足):增加mysql的内存,如果是rds,可以考虑升级RDS的实例规格

ERROR 1129 (HY000)

现象描述:

ERROR 1129 (HY000): Host '10.24.236.231' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

可能:达到了mysql服务器设置的max_connect_errors的值

上面通过3次telnet,然后进行第四次时提示ERROR 1129 (HY000): Host '10.24.236.231' is blocked because of many connection

errors; unblock with 'mysqladmin flush-hosts',原因是已经超过了max_connect_errors=3的值,

解决方法

(只适用于自己mysql,rds目前不支持):系统命令行下执行mysqladmin flush-hosts或者mysql命令行里执行flush hosts

需要注意的是,当进行多次登录失败时,是没有影响的:

ERROR 1226 (42000)

现象描述

ERROR 1226 (42000): User 'testcon' has exceeded the 'max_user_connections' resource (current value: 2)

可能:达到了该account设定的max_user_connections大小

当使用grant设定了testcon@’%’的max_user_connections为2时,并发连接超过2就会提示ERROR 1226 (42000):

User 'testcon' has exceeded the 'max_user_connections' resource (current value: 2),如果没有手动grant指定,会用系统参数max_user_connections的值来设定

解决办法:

重新grant为0或者调整系统变量max_user_connections,如果没有权限,也可以删除账号重新创建

ERROR 1226 (42000)

现象描述

ERROR 1226 (42000): User 'testcon' has exceeded the 'max_connections_per_hour' resource (current value: 2)

可能:达到了该account设定的max_connections_per_hour大小

使用testcon一小时内登录2次后就会提示ERROR 1226 (42000): User 'testcon' has exceeded the 'max_connections_per_hour' resource (current value: 2)

解决办法:

重新grant该账号max_connections_per_hour为0,如果没有权限,也可以删除账号重新创建

ERROR 1040 (HY000)

现象描述

ERROR 1040 (HY000): Too many connections

可能:达到了mysql系统参数max_connections的限制

当并发连接大于max_connections的值时,就会出现ERROR 1040 (HY000): Too many connections

解决办法:

1、检查mysql server的CPU,IO,内存等状态的变化,是否有明显的升高现象,如果有明显的升高,实时的通过show processlist获取session信息,通过获取到的session信息分析cpu,io以及内存跑高的原因,综合分析(是否是遇到了阻塞或者慢查询)kill掉相关会话来解决

2、检查mysql server的CPU,IO,内存等状态的变化,是否有明显的升高现象,如果没有明显的升高,实时的通过show processlist获取session信息,通过获取到的session信息找到会话来源(看下是否是sleep连接较多),尝试调整来源主机的应用行为

3、如果无法手动干预,尝试调整mysql的max_connections的值,如果是rds for mysql,需要升级实例规格来提升连接数

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-08-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Aloys的开发之路

MYSQL常见错误及其解决方式

ERROR 1130: Host 10.0.0.1 is not allowed to connect to this MySQL server 在用远程连接M...

2578
来自专栏张善友的专栏

CentOS 6上的redis搭建实战记录

redis 是一个基于内存的高性能key-value数据库,数据都保存在内存中定期刷新到磁盘,以极高的读写效率而备受关注。他的特点是支持各种数据结构,stirn...

27510
来自专栏测试开发架构之路

redis集群部署那点事Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value 解决处理

 参考:https://blog.csdn.net/wzygis/article/details/51705559

803
来自专栏禁心尽力

Solr_全文检索引擎系统

Solr介绍: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务。Solr可以独立运行在Jetty、Tomca...

1918
来自专栏Golang语言社区

【Go 语言社区】删除redis所有KEY

批量删除Key Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这...

3728
来自专栏数据和云

丝般润滑:Oracle 18.3 RPM安装从未有过的顺畅初体验

自 Oracle 18c 开始,Oracle开始支持 Linux 上的 Oracle 数据库 RPM 安装方式,虽然刚刚发布还有一些限制,但是这无疑开始改变,目...

972
来自专栏james大数据架构

Docker镜像导致centos-root根分区容量爆满

  当虚拟机服务器运行Docker久了后,发现Docker的文件越来越大,某天发现此台机上的数据库访问不了了,再重启数据库等日志,提示空间不足,查看磁盘空间: ...

3725
来自专栏bboysoul

ubuntu安装Metasploit Framework(最简单)

这个其实我以前说过ubuntu安装metasploit,就是在github上clone下来安装,但是那种方式安装的话会碰到很多依赖的问题,不方便安装,下面我推荐...

2444
来自专栏Laoqi's Linux运维专列

k8s集群运维篇–kubectl常用命令

1.1K4
来自专栏黑白安全

新手如何连接到MySQL

所谓数据库就是专为储存数据而设计的库,是相对独立的。所以对于运行在Web服务器上的PHP程序在使用数据库的时候,首先需要做的就是连接数据库。在PHP本身就提供对...

1433

扫码关注云+社区