自建MySQL环境主机html
主机:iZbp1e*****krn92qrx0Zmysql
内网ip: 10.26.254.217sql
客户端ecs主机数据库
主机:iZbp1e6*****zkrn92qrwzZ安全
内网ip: 10.24.236.231服务器
说明session
说明:mysql的account的组成为’user’@’host数据结构
ERROR 1045 (28000)并发
现象描述app
ERROR 1045 (28000): Access denied for user 'testcon'@'10.24.236.231' (using password: YES)
可能1:password错误
可能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能够正常登陆
现象描述:
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解析异常:
以下为测试结果:
可能1:account不存在(阿里云rds高安全模式特有)
现象描述:
可能1:client侧安全限制,不容许访问
通常表现为telnet特定特定端口不通,解决办法:检查应用所在主机的安全规则是否有拦截
可能2:端口错误
端口错误,即便没有安全限制也没法链接,telnet 特定端口也不会通,解决办法:确认链接mysql的端口是否正确
可能3:mysql服务未正确运行
先关掉自建mysql数据库
而后进行链接
一样表现为telnet 特定断开不通,解决办法(自建mysql的状况适用,rds不适用以下方法):
当加上白名单后(等待任务运行完成):
ps:确认本身本地主机的公网出口ip的方式我经常使用的是使用dms的实例管理-受权访问地址来查看,比较准确,具体以下:
1,用客户端主机访问dms控制台:https://dms.console.aliyun.com/
2,按照以下操做确认公网出口ip
现象描述:
可能1:limits.conf文件对max user processes作了限制
解决办法(自建mysql的状况适用,rds不适用以下方法):
检查和修改系统的内核参数
可能2:mysql没有可用内存
现象描述:
可能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错误)
现象描述:
可能1:rds for mysql的提示,且访问模式为高安全模式才会出现,缘由是ip地址没有在rds的白名单中
当添加白名单后(等待任务运行完成):
现象描述:
可能1:mysql没有可用内存
最近又遇到了这个问题,这个问题出现的缘由归纳以下(感谢内核同窗):
执行sql的时候,mysql server须要申请内存,会先判断当时可用内存是否知足,若是不知足,则直接抛错,不会进行内存申请
解决办法(先确认内存是否已经不足):增长mysql的内存,若是是rds,能够考虑升级RDS的实例规格
现象描述:
关于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 connectionerrors; unblock with 'mysqladmin flush-hosts',缘由是已经超过了max_connect_errors=3的值,
须要注意的是,当进行屡次登陆失败时,是没有影响的:
现象描述:
可能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的值来设定,
现象描述:
可能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
解决办法:
假设有一个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语句和报错信息。
这个错误是因为你执行update或者delete语句时,没有指定where条件,若是想忽略这个错误,则修改配置
SET SQL_SAFE_UPDATES = 0;
从新打开错误提醒
SET SQL_SAFE_UPDATES = 1;
1067这个错误和TINESTAMP默认值有关,需查看官方文档
1292/1366 double和integer类型错误,检查语法和数值类型
1292 detatime错误,检查插入的时间数据格式,是否超出范围,带时区格式的时间字符串格式是否有问题
1292 VARIABLE 检查你设置的VARIABLE属性
1292 LOAD DATA 检查转义字符,检查数据类型
1411 STR_TO_DATE 检查时间字符串格式
权限错误,检查用户名密码是否正确,检查当前用户是否有权限访问数据。
一般状况下,这是因为mysql主节点挂掉了而且sync_binlog=OFF,解决方法是在从节点设置 POS=0。
当sync_binlog=OFF时,主节点会在把数据先发给从节点,而后写binlog。当主节点在写binlog以前挂掉了,这时候因为已经把数据发给从节点了,因此从节点在写完数据后,binlog被更新,致使主节点和从节点binlog指针位置不一致。因此,当主节点从新启动后,会开启一个新的binlog,因此这时候把从节点的binlog指针位置设置为0,从头从新开始。
最好的解决方法设置sync_binlog=ON,这样基于binlog同步,但会带来较多的i/o开销。
open_files_limit是个系统的设置,table_open_cache必须比系统的这个配置小
这个错误一般有如下几个缘由 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行为一致,插入数据。
当你访问数据时,可能会遇到这些错误。这是错误是因为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
这一般意味着客户端和服务器之间的字符集处理不一致。
错误139可能意味着表定义中字段的数量和大小超过了一些限制。检查sql语句中异常长的字符串,异常大的整数等等
没法链接,若是服务正常启动,检查如下可能的项目 一、是否是防火墙的问题,关闭防火墙试试 二、检查mysql服务监听的IP 三、检查skip-name-resolve 四、检查socket文件路径
这个是因为你运行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一直在等你把结果取走。
添加外键错误,检查外键关联的两个字段数据类型是否一致。
在测试备份还原时,使用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.
做者:笨熊
原文连接: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