更新20180205:增加:对error 5 (hy000): out of memory (needed 260400 bytes)问题原因进行说明
主机:izbp1e*****krn92qrx0z
内网ip: 10.26.254.217
主机:izbp1e6*****zkrn92qrwzz
内网ip: 10.24.236.231
说明:mysql的account的组成为’user’@’host’
要区分这种错误:error 1142 (42000) command denied to user 'testcon'@'10.24.236.231' for table/database '****'
这种不是连接问题,这种是已经连上了,出现权限问题导致,错误码也不一样
现象描述:
error 1045 (28000): access denied for user
'testcon'@'10.24.236.231' (using password: yes)
可能1:password错误

当使用'testcon'@'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): unknown mysql server
host 'rm-xxxxxxxxxxxx.mysql.rds.aliyuncs.com' (110)
可能1:dns解析异常
同ping来获取ip,无法获取到,故mysql命令行进行连接时就出错了,此时需要通过ping来观察dns的解析,
并检查系统dns配置
20170809补充:当使用阿里云的ecs设置的安全组为如下时,会导致dns解析异常:
如下为测试结果:
error 1449 (hy000): the user specified as a
definer ('testcon'@'10.24.236.231') does not exist
或者
error 1045 (28000): user not exist
可能1:account不存在(阿里云rds高安全模式特有)
解决办法:原因是该account不存在,检查mysql.user(rds for mysql分为高权限账号和普通账号管理,高权限账
当把高安全模式切换到标准模式是,再次进行测试则变成error 1045 (28000): access denied for user 'contest'@'10.24.236.231'
(using password: yes),如下:
error 2003 (hy000): can't connect to mysql
server on 'test.mysql.rds.aliyuncs.com' (110)
可能1:client侧安全限制,不允许访问
一般表现为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的白名单未配置
当加上白名单后(等待任务运行完成):
ps:确认自己本地主机的公网出口ip的方式我常用的是使用dms的实例管理-授权访问地址来查看,比较准确,具体如下:
1,用客户端主机访问dms控制台:https://dms.console.aliyun.com/
2,按照如下操作确认公网出口ip
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): host '192.168.1.3' is
not allowed to connect to this mysql server
可能1:mysql.user表里没有匹配的host名称
从mysql server的mysql.user表里查看user为testcon的host,只有两个:127.0.0.1以及izbp1e6df2sbzkrn92qrwzz,当使用另一个客户端(ip为10.24.236.231,主机名为izbp1e6df2sbzkrn92qrwzz)使用user为testcon登录时提示error 1130 (hy000): host '10.24.236.231' is not allowed to connect to this mysql server,因为mysql server的mysql.user表里没有ip为10.24.236.231的host,这里要说一点,mysql是把mysql.user里的信息放到内存中排序好之后进行匹配的,先按host排序,host相同排序user(上面的这个问题如果创建一个testcon1@'10.24.236.231'的account,再次连接就会出现error 1045 (28000): access denied for user 'testcon'@'10.24.236.231' (using password: yes) 因为host匹配到了,user没有,account错误)
解决办法:检查mysql.user(rds for mysql分为高权限账号和普通账号管理,高权限账号的实例可以查询mysql.user_view表)表里面的account信息(主要是user,host列),确认连接的account符合user里面的匹配项
error 1045 (hy000): #28000ip not in
whitelist
可能1:rds for mysql的提示,且访问模式为高安全模式才会出现,原因是ip地址没有在rds的白名单中
当添加白名单后(等待任务运行完成):
解决办法:检查rds的白名单设置是否正确
error 5 (hy000): out of memory (needed
260400 bytes)
可能1:mysql没有可用内存
最近又遇到了这个问题,这个问题出现的原因概括如下(感谢内核同学):
执行sql的时候,mysql server需要申请内存,会先判断当时可用内存是否满足,如果不满足,则直接抛错,不会进行内存申请
解决办法(先确认内存是否已经不足):增加mysql的内存,如果是rds,可以考虑升级rds的实例规格
error 1129 (hy000): host '10.24.236.231' is
blocked because of many connection errors; unblock with 'mysqladmin
flush-hosts'
关于max_connect_errors可以参考另一篇:https://yq.aliyun.com/articles/159612?spm=5176.100240.searchblog.8.czzmgt
可能1:达到了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): user 'testcon' has
exceeded the 'max_user_connections' resource (current value: 2)
可能1:达到了该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,如果没有权限,也可以删除账号重新创建
exceeded the 'max_connections_per_hour' resource (current value: 2)
可能1:达到了该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): too many connections
可能1:达到了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,需要升级实例规格来提升连接数