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错误

91cce7464be4377fbf11f9a75ca84871178.jpg

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

3e420095f09d72aee9fdcb1f63e0828bfe1.jpg

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

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

b1bfad2193c26b34aa735fd27737eac7253.jpg

可能3:account错误

772fbde2f328b671673598132ef5fa2bd4e.jpg

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

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,最快速简单的方法是重新创建一个账号,授予相关的权限

 

2.2 ERROR 2005 (HY000)

现象描述:

ERROR 2005 (HY000): Unknown MySQL server host 'rm-XXXXXXXXXXXX.mysql.rds.aliyuncs.com' (110)

可能1:DNS解析异常

832b7b90af5d7cc6e523c389bc96260a398.jpg

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

并检查系统dns配置

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

60425f653bcdc9dca253a475728e65812ec.jpg

如下为测试结果:

dd257e8e395187cd92f04a5ae449fe9eb93.jpg

2.3 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

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

53831b37516855a70b7bb87da071df4f27e.jpg

  • 解决办法:原因是该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),如下:

fb179682fb1b3148542ac1146b9e62a5099.jpg

2.4 ERROR 2003 (HY000)

现象描述:

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

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

f88ac225d5f0932d05b83cc56e0f04b107b.jpg

一般表现为telnet特定特定端口不通,解决办法:检查应用所在主机的安全规则是否有拦截

可能2:端口错误

05314a6969a9fc636e2fa38979789c0c729.jpg

端口错误,即使没有安全限制也无法连接,telnet 特定端口也不会通,解决办法:确认连接mysql的端口是否正确

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

先关掉自建mysql数据库

1350cf9338518535bc61e855abbb57bca96.jpg

然后进行连接

c7339aaf40d1d11b548145d5b0ff5bcda3d.jpg

同样表现为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的白名单未配置

b1c3ca14bae51c350305d20386112157be6.jpg

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

c70193d49e28ccc1c39d4d474cef9f7bf67.jpg

5322148598b350bf2b7a797e5c26ee7127d.jpg

ps:确认自己本地主机的公网出口ip的方式我常用的是使用dms的实例管理-授权访问地址来查看,比较准确,具体如下:

1,用客户端主机访问dms控制台:https://dms.console.aliyun.com/

2,按照如下操作确认公网出口ip

0d7aa062385c3e501bb17c3ac40d50cd362.jpg

 

2.5 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做了限制

ff90bb31083d43f38c9040745800f6988a5.jpg

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

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

可能2:mysql没有可用内存

b82bc7d48a8a59ee4c492941d962f49c633.jpg

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

 

2.6 ERROR 1130 (HY000)

现象描述:

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

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

418d0c07389b10a09e379730d018d3e1db3.jpg

7baf3973876d353156a97232ebeac635e21.jpg

       从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里面的匹配项

 

2.7 ERROR 1045 (HY000)

现象描述:

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

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

310de54586d3399e8bab3a5e0c32d4ef46c.jpg

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

784a7646a4b725f921094887cef6123dbd6.jpg

7ace39bd39d6cdb429ea64e1d0ea8cc0299.jpg

  • 解决办法:检查RDS的白名单设置是否正确
  •  

2.8 ERROR 5 (HY000)

现象描述:

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

可能1:mysql没有可用内存

b1a80da5c6c7ae981f101ea8530ac5e7767.jpg

274056a23745a403f906bd8c1841abbfcf3.jpg

最近又遇到了这个问题,这个问题出现的原因概括如下(感谢内核同学):

执行sql的时候,mysql server需要申请内存,会先判断当时可用内存是否满足,如果不满足,则直接抛错,不会进行内存申请

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

 

2.9 ERROR 1129 (HY000)

现象描述:

  • 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的值

b2ea199775dbb55482b7e000e6c96db8d7f.jpg

上面通过3次telnet,然后进行第四次时提示ERROR 1129 (HY000): Host '10.24.236.231' is blocked because of many connectionerrors; unblock with 'mysqladmin flush-hosts',原因是已经超过了max_connect_errors=3的值,

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

c8168f6244b82afd7c22957472ec2ee01bc.jpg

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

7dbd783bad9d479bd988d0818ff541131fa.jpg

2.10 ERROR 1226 (42000)

现象描述:

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

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

6c859ee7169d35b8ca934ba252beee46df5.jpg

当使用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,如果没有权限,也可以删除账号重新创建

 

2.11 ERROR 1226 (42000)

现象描述:

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

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

ddf8962efb63505797024c3ce4e5aaccdf1.jpg

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

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

 

2.12 ERROR 1040 (HY000)

现象描述:

ERROR 1040 (HY000): Too many connections

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

f1c5e4169270aa6dfbb65f6f519f8386e72.jpg

当并发连接大于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,需要升级实例规格来提升连接数

 

 

常见错误码

1) Error code 1064: Syntax error

假设有一个sql语句

select LastName, FirstName,from Person

执行的时候会包错误

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from Person' at line 2.

  • 1064错误说明你的sql语句有语法错误,单看这个错误码,我们无法判断出具体是哪的错误。

  • 仔细看报错信息的最后,有一段用单引号标识的对源sql语句的引用'from Person',这表示的是这段sql语句无法被解析,但是对于我们这个例子,这个报错引用并没什么卵用。我们再注意观察,这个引用的信息前面多了一个逗号,这个逗号后面应该接的是个表中的列名,而不是from关键字。

  • 1064的错误信息一般最后会有个... near '...'格式的信息,near后面的引用就是sql语句开始无法被解析的地方,当遇到这个错误,多观察这段无法解析的sql语句前后的字符。

  • 有时候,你得到的错误信息是... near '',near后面的引用是空的,这表示出错的地方位于sql语句的开头或者第一个字符,通常情况是单引号、引号、括号没有成对出现或者是结尾处没有正确的字符,如中文分号。

  • 如果发现了1064错误,注意查看报错信息里引用的sql语句,多查看这个错误的sql语句前后部分。

  • 如果有人向你询问1064的sql错误,你最好让他给你提供完整的sql语句和报错信息。

 

2) Error code 1175: Safe Update

这个错误是由于你执行update或者delete语句时,没有指定where条件,如果想忽略这个错误,则修改配置

SET SQL_SAFE_UPDATES = 0;

重新打开错误提醒

SET SQL_SAFE_UPDATES = 1;

 

3)1067, 1292, 1366, 1411 - Bad Value for number, date, default, etc.

  • 1067这个错误和TINESTAMP默认值有关,需查看官方文档

  • 1292/1366 double和integer类型错误,检查语法和数值类型

  • 1292 detatime错误,检查插入的时间数据格式,是否超出范围,带时区格式的时间字符串格式是否有问题

  • 1292 VARIABLE 检查你设置的VARIABLE属性

  • 1292 LOAD DATA 检查转义字符,检查数据类型

  • 1411 STR_TO_DATE 检查时间字符串格式

 

4)1045 Access denied

权限错误,检查用户名密码是否正确,检查当前用户是否有权限访问数据。

5)1236 "impossible position" in Replication

  • 通常情况下,这是由于mysql主节点挂掉了并且sync_binlog=OFF,解决方法是在从节点设置 POS=0。

  • 当sync_binlog=OFF时,主节点会在把数据先发给从节点,然后写binlog。当主节点在写binlog之前挂掉了,这时候由于已经把数据发给从节点了,所以从节点在写完数据后,binlog被更新,导致主节点和从节点binlog指针位置不一致。所以,当主节点重新启动后,会开启一个新的binlog,所以这时候把从节点的binlog指针位置设置为0,从头重新开始。

  • 最好的解决方法设置sync_binlog=ON,这样基于binlog同步,但会带来较多的i/o开销。

 

6)24 Can't open file (Too many open files)

open_files_limit是个系统的设置,table_open_cache必须比系统的这个配置小

7)1062 - Duplicate Entry

这个错误通常有以下几个原因 1. 主键约束,Error Code: 1062. Duplicate entry ‘12’ for key ‘PRIMARY’,主键约束的数据必须是唯一的,解决的方法之一是设置主键是自增的,这样,插入数据时,设置主键的数据为NULL。 2. 唯一属性约束,Error Code: 1062. Duplicate entry ‘A’ for key ‘code’,这是你设置了数据是唯一的,但插入的数据和表中数据重复了,解决的方法是使用INSERT IGNORE代替INSERT,INSERT IGNORE插入数据的时候,如果重复了,就不做任何操作,也不报错,如果不重复,就和INSERT行为一致,插入数据。

8)126, 127, 134, 144, 145

当你访问数据时,可能会遇到这些错误。这是错误是由于mysql数据库内部错误引起的。比如:

 

MySQL error code 126 = Index file is crashed MySQL error code 127 = Record-file is crashed MySQL error code 134 = Record was already deleted (or record file crashed) MySQL error code 144 = Table is crashed and last repair failed MySQL error code 145 = Table was marked as crashed and should be repaired

mysql的bug,被攻击了,服务挂了,不正确的关闭mysql,损坏的数据都有可能造成这些问题。当这些错误发生时,数据就无法访问了,并且一直永久的无法访问。所以,最好把数据做好备份,如果你没有备份,可以尝试去修复mysql。如果存储引擎是MyISAM,使用CHECK TABLE和REPAIR TABLE命令(mysql>=5.7)。

 

CHECK TABLE <table name> To check the extent of database corruption REPAIR TABLE <table name> To repair table

 

9)1366

这通常意味着客户端和服务器之间的字符集处理不一致。

10)139

错误139可能意味着表定义中字段的数量和大小超过了一些限制。检查sql语句中异常长的字符串,异常大的整数等等

11)2002, 2003 Cannot connect

无法连接,如果服务正常启动,检查以下可能的项目 1、是不是防火墙的问题,关闭防火墙试试 2、检查mysql服务监听的IP 3、检查skip-name-resolve 4、检查socket文件路径

12)2014 Commands out of sync; you can't run this command now

这个是由于你运行sql查询语句的序列不正确造成的,官方的解释

 

This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called     mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

总结起来意思就是你查询了结果,但是却没有把结果获取下来。造成mysql server一直在等你把结果取走。

13)1215: Cannot add foreign key constraint

添加外键错误,检查外键关联的两个字段数据类型是否一致。

 

MySQL 常见错误 ERROR 3009

在测试备份还原时,使用XtraBackup还原数据库后,创建一个测试账号时遇到了下面错误: 

mysql> grant all on house.* to test@'192.168.%' identified by 'test1249';

 

ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 43. Created with MySQL 50620, now running 50721. Please use mysql_upgrade to fix this error.

mysql>

因为备份的数据库版本为MySQL 5.6.20,目标数据库的MySQL版本为5.7.21,因为两个数据库版本不一致,在还原过后,忘记升级数据库(还原后没有使用mysql_upgrade升级数据结构)。其实从错误信息也能看出一二,需要执行mysql_upgrade命令会检查所有数据库中的所有表与当前版本的MySQL服务器是否不兼容。 mysql_upgrade还会升级系统表,以便你可以使用一些新特性或功能。

# mysql_upgrade -u root -p

Enter password: 

Checking if update is needed.

Checking server version.

Running queries to upgrade MySQL server.

Checking system database.

mysql.columns_priv OK

mysql.db OK

mysql.db_database_info OK

mysql.db_instance_info OK

mysql.db_server_info OK

mysql.engine_cost OK

......................................................

......................................................

Upgrade process completed successfully.

Checking if update is needed.

 

Mysql常见的13个错误码讲解

作者:笨熊

原文链接:http://www.bugcode.cn/mysqlerrorcodes.html

链接:https://yq.aliyun.com/articles/158321?spm=5176.8091938.0.0.pdvaeq

MySQL 常见错误 ERROR 3009 : https://mp.weixin.qq.com/s/owAKeCQJ3fVIgkZfF0J_XA

 

 

 

转载于:https://my.oschina.net/u/3803405/blog/3047981

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值