MYSQL中host名 127.0.0.1和localhost的小陷阱
时间:2011-05-20
来源:互联网
昨天晚上重装了下虚拟机,遇到点mysql账号相关的麻烦事,纠结了一晚上,早上起来,终于解决了。
我一般都是ssh到虚拟机上,直接用控制台对mysql进行日常管理的,这里就会用到host名为localhost的www用户,为了方便,是没有进行密码设置的,密码为空。
而我的应用程序呢,一般是用的127.0.0.1这个host下的www用户,密码不为空。
Mysql代码
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| localhost | www | |
| 127.0.0.1 | www | *password |
+-----------+------+-------------------------------------------+
这时便出现了一个比较怪的问题:
当我以127.0.0.1这个host进行mysql登录的时候,不管是ssh控制台
mysql -h 127.0.0.1 -u www -p
还是用rails 应用程序连接,均报以下错误:
Mysql::Error: Access denied for user 'www'@'localhost' (using password: YES)
怎么回事呢?为什么会把我的127.0.0.1这个host解析成localhost呢?
明明我指定用127.0.0.1这个host登录,Mysql为什么偏要给我换成localhost呢
仔细看看上面那个mysql.user这个表,你就会发现。
同样是www用户,host为localhost的数据行在host为127.0.0.1的这条数据行的前面。
当mysql解析这个127.0.0.1的时候,他会把他当成localhost来使。所以就找到了第一行,不带密码的www@localhost,马上就进行认证,看密码符不符合,来确认是否进行连接。
不知道这个算不算mysql的事,当连接数据库进行认证的时候,他会从上至下遍历,找到第一条满足条件的host和user数据,然后返回进行密码校验。
www@localhost这条数据在[email protected]这条数据之上,所以不管你来的是localhost,还是127.0.0.1, mysql都将用第一条无密码的www@localhost去进行密码校验。
交换一下顺序就OK了
Mysql代码
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| 127.0.0.1 | www | *password |
| localhost | www | |
+-----------+------+-------------------------------------------+
以上仅是个人观点,如有不正确的地方,请指正。
我一般都是ssh到虚拟机上,直接用控制台对mysql进行日常管理的,这里就会用到host名为localhost的www用户,为了方便,是没有进行密码设置的,密码为空。
而我的应用程序呢,一般是用的127.0.0.1这个host下的www用户,密码不为空。
Mysql代码
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| localhost | www | |
| 127.0.0.1 | www | *password |
+-----------+------+-------------------------------------------+
这时便出现了一个比较怪的问题:
当我以127.0.0.1这个host进行mysql登录的时候,不管是ssh控制台
mysql -h 127.0.0.1 -u www -p
还是用rails 应用程序连接,均报以下错误:
Mysql::Error: Access denied for user 'www'@'localhost' (using password: YES)
怎么回事呢?为什么会把我的127.0.0.1这个host解析成localhost呢?
明明我指定用127.0.0.1这个host登录,Mysql为什么偏要给我换成localhost呢
仔细看看上面那个mysql.user这个表,你就会发现。
同样是www用户,host为localhost的数据行在host为127.0.0.1的这条数据行的前面。
当mysql解析这个127.0.0.1的时候,他会把他当成localhost来使。所以就找到了第一行,不带密码的www@localhost,马上就进行认证,看密码符不符合,来确认是否进行连接。
不知道这个算不算mysql的事,当连接数据库进行认证的时候,他会从上至下遍历,找到第一条满足条件的host和user数据,然后返回进行密码校验。
www@localhost这条数据在[email protected]这条数据之上,所以不管你来的是localhost,还是127.0.0.1, mysql都将用第一条无密码的www@localhost去进行密码校验。
交换一下顺序就OK了
Mysql代码
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host | user | password |
+-----------+------+-------------------------------------------+
| 127.0.0.1 | www | *password |
| localhost | www | |
+-----------+------+-------------------------------------------+
以上仅是个人观点,如有不正确的地方,请指正。
作者: zfjoy520 发布时间: 2011-05-20

作者: Coolriver: 发布时间: 2011-05-20

作者: Coolriver 发布时间: 2011-05-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28