文档章节

连接MySQL数据库时常见故障问题的分析与解决

laoyi007
 laoyi007
发布于 2016/05/28 09:35
字数 3158
阅读 6
收藏 0

初学的mysql网友好象经常会碰到mysql无法连接的错误。特开贴收集这样问题的现象和原因。

先自己扔块砖头出来。

归纳如下:

更改mysql root账号密码 mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

故障现象 : 无法连接 mysql

错误信息1 :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:YES) 错误信息2 :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:NO)

下面,首先分析说明这两种错误信息分别在什么情况下会出现:

描述:使用mysql连接命令或连接工具,对远程数据库进行连接时,可能会出现以上两种错误信息,下面以命令的连接方式进行说明。

当使用mysql里连接命令时,若带-p参数且指明密码,或带-p参数不指明密码,但在下一步输入密码时有字符串输入,则返回的是 “错误信息1”,若不带-p参数,或带-p参数但在下一步输入密码时,不输入任何字符,则返回的是“错误信息2”,如下所示:

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -proot //带-p参数,并指明密码 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -p //带-p参数,在下一步进行密码输入 Enter password: //有字符串输入 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 //不带-p参数 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO)

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -p //带-p参数,在下一步进行密码输入 Enter password: //无字符串输入 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO)

上面的对比可总结出一点,使用mysql命令进行登录时,若有密码输入行为并输入了字符,则验证出错后,则返回的错误提示中,对于 (using password: ?)中?的关键字,则返回的是YES,若没有密码输入行为,或无密码字符输入,则返回的是NO。

除上面的实验对比,还进行了如下的登录对比操作,并记录了他们所返回错误提示类型,对上面的总结进行验证:

1.使用存在的用户,不输入密码 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO) 2.使用不存在的用户,不输入密码 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO) 3.使用存在的用户,且输入密码正确 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES) 4.使用存在的用户,但输入密码不正确 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES) 5.使用不存在的用户,但输入数据库中存在的某一个密码 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES) 6.使用不存在的用户,且输入数据库中不存在的一个密码 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

总结:对于 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' 此类错误返回时, (using password: ?)中?的 关键字是YES还是NO,关键不在于用户是否存在,密码是否正确,它的结果取决于登录时,用户对于密码有没有字符串的输入,如果没有,MySQL数据库验证后,若出错返回此类信息,则应是 (using password: NO),若用户对密码有字符串的输入,返回的则是 (using password: YES)。

下面分析这类 ERROR 1045 (28000): Access denied for user'usera'@'localhost' 错误出现的原因:

原因1 : 客户端远程访问的用户账号并未创建

检查 : 以管理员ROOT登录后,show grants for 'user'@’IP‘; 或者 select user from mysql.user; 确认用户账号是否存在。 mysql> show grants for 'jtsec'@'192.168.8.123'; ERROR 1141 (42000): There is no such grant defined for user 'jtsec' on host '192.168.8.123' mysql>

返回信息:ERROR 1141 (42000): There is no such grant defined for user 'jtsec' on host '192.168.8.123' 说明,没有jtsec用户,或者没有对jtsec用户进行在192.168.8.123远程访问的授权。

mysql> select user,host from mysql.user; +-------+---------------+ | user | host | +-------+---------------+ | root | localhost | +-------+---------------+ 1 rows in set (0.00 sec) mysql> 关于user记录数只有一条,是root,并没有jtsec相关的记录,说明没有数据库中没有jtsec这个帐号。

处理 :创建用户账号。 mysql> grant all privileges on . to 'jtsec'@'192.168.8.123' identified by 'jtsec' with grant option; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> show grants for 'jtsec'@'192.168.8.123'; +---------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for jtsec@192.168.8.123 | +---------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON . TO 'jtsec'@'192.168.8.123' IDENTIFIED BY PASSWORD '*0B4AB716B6BE11F89101577836F3016D8EEAA217' WITH GRANT OPTION | +---------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select user,host from mysql.user; +-------+---------------+ | user | host | +-------+---------------+ | jtsec | 192.168.8.157 | | root | localhost | +-------+---------------+ 2 rows in set (0.00 sec) mysql>

原因2 : 用户账号存在,但未对其所在的客户端的IP进行远程访问授权允许

检查 : 以管理员ROOT登录后 show grants for 'user'@'IP';

mysql> show grants for 'root'@'192.168.8.123'; ERROR 1141 (42000): There is no such grant defined for user 'root' on host '192.168.8.123' mysql>

返回信息:ERROR 1141 (42000): There is no such grant defined for user 'root' on host '192.168.8.123' 说明,没有root用户(因为是MySQL超级用户所以排除此种可能),或者没有对root用户进行在192.168.8.123远程访问的授权。

我们来对比一下看,root用户本地访问的权限,则可查出: mysql> show grants for 'root'@'localhost'; +----------------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@localhost | +----------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON . TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION | +----------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

或者直接查询mysql的user用户表select user,host from mysql.user;,其中记录了每一个用户的权限信息 mysql> select user,host from mysql.user; +-------+---------------+ | user | host | +-------+---------------+ | root | localhost | +-------+---------------+ 1 rows in set (0.00 sec) mysql> 关于user值为root的记录数只有一条,且host值为localhost,说明root用户只能在本地访问数据库。

处理 :进行root用户的远程访问授权,可以授权到指定的客户端IP,也可以授权为所有IP都可访问(host值为%)。 授权为所有IP都使用用户root,密码root,来远程访问数据库 mysql> GRANT ALL PRIVILEGES ON . TO'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)

再次进行授权的查询 mysql> show grants for 'root'@'%'; +--------------------------------------------------------------------------------------------------------------------------------+ | Grants for root@% | +--------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION | +--------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

再次查询授权表记录 mysql> select user,host,password from mysql.user; +-------+---------------+-------------------------------------------+ | user | host | password | +-------+---------------+-------------------------------------------+ | root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | root | % | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-------+---------------+-------------------------------------------+ 2 rows in set (0.00 sec) mysql>

原因3 : 用户账号授权访问的密码不正确

检查 :以管理员ROOT登录后, select user,host,password from mysql.user; mysql> select user,host,password from mysql.user; +-------+---------------+-------------------------------------------+ | user | host | password | +-------+---------------+-------------------------------------------+ | root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | root | % | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | jtsec | 192.168.8.123 | | | jtsec | 192.168.8.123 | 0B4AB716B6BE11F89101577836F3016D8EEAA217 | +-------+---------------+-------------------------------------------+ 4 rows in set (0.00 sec) mysql> 根据查询结果可以看出来,root账户的本地访问和远程访问密码一样。 而jtse账户在192.168.8.123这个IP上,远程访问数据库的密码有两个,其中一个为空(第三条记录)。 也就是说在IP为192.168.8.123的客户机上,使用jtsec这个账户远程访问数据库,合法的密码有两个可以选择: 一个是不输入密码(密码为空),另一个是0B4AB716B6BE11F89101577836F3016D8EEAA217(经过加密的), 其余的输入,都是错的。

处理 :使用正确的访问密码进行访问即可。

=================================================================================== 错误信息 :ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.8.88' (10065) 原因 :MySQL服务器上防火墙的阻断 检查 :在Linux下查看iptables规则,看是否未对MySQL数据库默认通信端口3306进行放行

处理 : 添加相应的放行规则 自己在 /etc/sysconfig/iptables 里加了一下代码: -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT 或尝试关掉防火墙 chkconfig ip6tables off chkconfig iptables off

问题描述: C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -proot ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.8.88' (10065) C:\Documents and Settings\Administrator>

=================================================================================== 错误信息 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (10061) 原因 : mysqld数据库服务没有启动。 检查 :在windows 的任务管理器,或者 unix/linux 下 ps -aux | grep mysql 看一下。确认服务已经启动。 处理 :启动mysqld 服务

错误信息 :ERROR 1130: Host xx.xx.xx.xx is not allowed to connect to this MySQL server 原因 : mysql服务器没有赋予此客户端远程连接的权限。
检查 :在mysql服务器本地查询mysql库里user表对应的host是否包含客户端机器的IP(%为不限制IP允许远程连接)。
处理 :修改mysql库下的user表:update user set host = '%' where user ='XXX';flush privileges;

错误信息 :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:NO) 原因 : 用户账号并未创建,远程登录时登录指令未直接包含密码项 检查 :以管理员ROOT登录后,show grants for 'usera'@'localhost'; 或者 select user from mysql.user; 确认用户账号是否存在。 处理 :创建用户账号。

错误信息 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (10061)
原因 : mysqld 客户端与服务端端口不一致。
检查 :在my.ini 设置下服务端口 这种情况特别是客户都与远程服务器端口不一致 很容易出现的问题 处理 :启动mysqld 服务

错误信息 :ERROR 2002 (HY000): Can't connect to local MySQL server server through socket '/var/lib/mysql/mysql.sock'(111) 原因 : mysqld的mysql.sock没在相应的位置。 处理 : 1.先查看/etc/rc.d/init.d/mysql status 看看是否启动 2.改权限 chown -R mysql:msyql /var/lib/mysql 3.修改/etc/my.cnf (注意:先停数据库) [mysqld] datadir=/usr/local/mysql/data socket=/var/lib/mysql/mysql.sock [mysql.server] user=mysql basedir=/usr/local/mysql [client] socker=/var/lib/mysql/mysql.sock 4.启动数据库

常用检查步骤。

  1. PING hostname 或 PING 189.xx.xx.xx 确认服务器IP层通信没有问题。如果PING通则继续(2),PING不通则找网络方面专家协助。
  2. TELNET hostname 3306 确认服务器TCP层通信没有问题。(你的端口号可能不是3306),如通则继续,如不通,请检查mysqld 是否已经在运行,防火墙屏蔽了端口。
  3. 检查用户权限, show grants ... 或 select user,host,password from mysql.user;

=================================================================================== 故障现象 : 本地无法 mysql -u root -p 用原来的密码登录,但可以用无密码,远程必须用原密码登录
错误信息 :ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 原因 : 未知,不知道是否mysql的新密码控制策略 检查 :mysql -u root 密码空登录无问,远程用navica mysql无密码有问题,有密码无问题 处理 :暂时先把本地登录的密码去掉 版本环境:mysql Ver 14.14 Distrib 5.1.56, for debian-linux-gnu (i486) using readline 6.2

问题分析(lioncode):Start --> MySQL数据库的用户信息均保存在mysql.user表中,其中包括用户的用户名,密码,授权的范围(可授权登录的IP、可进行的数据库操作的类型)等信息, 有必要查看一下该表中对于root用户的相关记录项,对于上述现象对应的查询结果可能是这样的:

出问题前该表中的数据如果是这样的: mysql> select user,host,password from mysql.user; +-------+---------------+-------------------------------------------+ | user | host | password | +-------+---------------+-------------------------------------------+ | root | localhost | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | root | % | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-------+---------------+-------------------------------------------+ 2 rows in set (0.00 sec) mysql> 出问题后该表中的数据可能是这样的: mysql> select user,host,password from mysql.user; +-------+---------------+-------------------------------------------+ | user | host | password | +-------+---------------+-------------------------------------------+ | root | localhost | | | root | % | 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-------+---------------+-------------------------------------------+ 2 rows in set (0.00 sec) mysql> 第一条数据,解释了,为什么在本地无法用原来的密码登录,但却可以用无密码登录成功。 原本,本地登录的密码和远程登录的密码是一样的,都为81F5E21E35407D884A6CD4A731AEBFB6AF209E1B (加密后的), 但是,由于某种原因,本地登录的密码被清空了,所以用原来的密码就不能登录了。

第二条数据,解释了,为什么远程必须用原密码登录。 root用户本地登录密码的设定和root用户远程登录密码的设定,分别是两条不同的数据,所以本地登录的密码被改,并不影响远程登录的密码。 <-- End

==================================================================================

故障现象 : 无法连接 mysql windows 错误信息 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (10061)
原因 : 同时开启大量的tcp端口和而仅有一小部分短命端口时,当他们处于time_wait时期,mysql可能会跑错端口 检查 :在windows 默认会开启5000个临时端口供调用,而他们的生命仅仅是120s,意思是在关闭端口的时候会有120秒的延时 处理 :减少不不必要的tcp端口。 修改注册表

==================================================================================

求助,不知道大家有一样的情况没有?

Lost connectiion to MySQL server during query. 按照网上说的方法仍没解决,楼主是否碰见过?

==================================================================================

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

什么问题??

Author: lioncode CMP: JTSEC-RD Date: 2012-08-28 18:14 Project: jtsec_one-way_dbsync Version: v1.0.0

© 著作权归作者所有

laoyi007
粉丝 0
博文 34
码字总数 34280
作品 0
南京
私信 提问
Oracle常见故障——Listener类:Hang、Crash及连接风暴的判断

目录 监听状态正常,应用反馈时断时连 Listener进程crash ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 11G SCAN LISTENER无法注册服务故障 Listener hang TNS-12535 TNS-00505处...

杨志洪 胡杰
2015/12/23
0
0
MySQL集群之五大常见的MySQL高可用方案(转)

1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据...

easonjim
2017/10/07
0
0
五大常见的MySQL高可用方案

转自:https://zhuanlan.zhihu.com/p/25960208 1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性...

严国华
2018/06/07
0
0
MYSQL数据库服务CPU高问题分析与优化

MYSQL数据库服务CPU高问题分析与优化 MySQL服务性能监控分析与优化是永恒的主题,做为性能测试人员有时也要站在DBA角度出发进行适当分析与优化,这也是性能测试人员能长期生存发展存在意义。...

郭柏雅
2018/03/22
0
0
MySQL常见错误分析与解决方法总结

一、Can't connect to MySQL server on 'localhost' (10061) 翻译:不能连接到 localhost 上的mysql 分析:这说明“localhost”计算机是存在的,但在这台机器上却没提供MySQL服务。 需要启动...

zzc052
2017/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部