`
zfj.rails
  • 浏览: 46641 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

MYSQL中host名 127.0.0.1和localhost的小陷阱

阅读更多
昨天晚上重装了下虚拟机,遇到点mysql账号相关的麻烦事,纠结了一晚上,早上起来,终于解决了。

我一般都是ssh到虚拟机上,直接用控制台对mysql进行日常管理的,这里就会用到host名为localhost的www用户,为了方便,是没有进行密码设置的,密码为空。

而我的应用程序呢,一般是用的127.0.0.1这个host下的www用户,密码不为空。

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这条数据在www@127.0.0.1这条数据之上,所以不管你来的是localhost,还是127.0.0.1, mysql都将用第一条无密码的www@localhost去进行密码校验。

交换一下顺序就OK了

mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| 127.0.0.1 | www  | *password                                 | 
| localhost | www  |                                           | 
+-----------+------+-------------------------------------------+


以上仅是个人观点,如有不正确的地方,请指正。







分享到:
评论

相关推荐

    mysql不能用localhost,127.0.0.1连接,只能用ip连接 的解决方法

    在MySQL数据库系统中,连接方式通常分为通过主机名(如localhost)和IP地址(如127.0.0.1)两种。当你遇到“mysql不能用localhost,127.0.0.1连接,只能用ip连接”的问题时,这可能是由于MySQL配置文件中的设置或用户...

    MySQL数据库主机127.0.0.1与localhost区别

    在MySQL数据库中,`127.0.0.1` 和 `localhost` 都用于指代本地主机,但它们在连接方式上存在显著的区别。理解这些差异对于排查数据库连接问题至关重要。 首先,当我们使用 `mysql -h 127.0.0.1` 命令连接MySQL,它...

    Mac os 解决无法使用localhost连接mysql问题

    在Mac OS系统中,当你遇到无法使用`localhost`连接到MySQL数据库的问题时,这通常涉及到网络连接机制和系统配置的差异。在这个问题中,我们发现`localhost`与`127.0.0.1`在连接MySQL时表现不同,这是因为它们采用的...

    mysql_connect localhost和127.0.0.1的区别(网络层阐述)

    总结起来,`localhost` 和 `127.0.0.1` 在MySQL连接中的主要区别在于它们使用的通信机制,`localhost` 通过Unix域套接字实现高效本地通信,而 `127.0.0.1` 则使用TCP/IP协议栈,适合远程访问场景或跨网络通信。...

    php mysql localhost,127.0.0.1和ip区别

    localhost与127.0.0.1的区别localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析。看来这个入门问题还有人不清楚,其实这两者是有区别的。 no1: ...

    完美解决MySQL通过localhost无法连接数据库的问题

    问题:一台服务器的PHP程序通过localhost地址无法...大部分情况下,可以用localhost代表本机127.0.0.1,但是在MySQL连接时,二者不可混用,而且MySQL中权限设置中localhost与127.0.0.1也是分开设置的。当设置为127.0.0.

    解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题

    在本例中,Node.js应用试图连接到`127.0.0.1:3306`,这是MySQL默认的监听地址和端口。 **问题分析:** 1. **数据库未安装**:确保已正确安装MySQL数据库,并且数据库服务正在运行。 2. **数据库未启动**:检查MySQL...

    Host 'localhost' Not Allowed To Connect To Server

    1. **权限问题**:MySQL的用户权限表(如`mysql.user`)中没有为'localhost'这个主机名赋予适当的连接权限。你可以通过`GRANT`语句来修改这些权限,例如: ``` GRANT ALL PRIVILEGES ON *.* TO 'username'@'...

    php连接mysql数据库最简单的实现方法

    您可以使用IP地址或服务器名称,例如,127.0.0.1 或 localhost MySQL数据库名称:表示要连接的数据库的名称。 用户名和密码:指定用于连接MySQL数据库服务器的MySQL用户的用户名和密码。该帐户必须具有足够的权限...

    有效解决ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (111)

    MySQL服务器默认情况下会监听localhost(127.0.0.1)地址,这意味着它只接受来自同一台机器的连接。如果需要从其他主机(如本例中的Windows系统)进行连接,需要更改配置以允许远程访问。在MySQL的配置文件(通常是`...

    无法远程访问Mysql的解决方案

    `mysql> update user set host='localhost' where user='root' and host='%'` 八、新增用户和权限 最后,如果我们想从远程主机登陆 Mysql,而不影响本机的登陆,我们可以新增一个用户,并授予该用户必要的权限,将...

    mysql远程连接错误1130的解决方法.pdf

    为了解决这个问题,我们可以通过修改 mysql 库中的 user 表里的 host 项,从 "localhost" 改为 "%",或者创建一个新的用户账户,并授予该用户远程连接的权限。 解决方法一:修改 user 表里的 host 项 在 mysql 库...

    MYSQL连接数据库实例

    在本地开发环境中,它通常是“localhost”或“127.0.0.1”。 2. **端口(Port)**:MySQL默认监听3306端口,但根据配置可能有所不同。 3. **用户名(Username)**:用于身份验证的账户名。每个MySQL服务器都有一...

    mysql命令到底多长符合要求

    mysql> insert into mysql.user(Host,User,Password) values('localhost','zhouz',password('1234')); 3)允许外网 IP 访问 mysql>insert into mysql.user(Host,User,Password) values('%','zhouz',password('1234...

    服务器mysql远程配置

    出于安全考虑,MySQL服务通常只允许本地主机(127.0.0.1或localhost)进行连接。这意味着,如果你尝试从另一台设备通过网络访问MySQL服务器,将会被拒绝,这就是描述中提到的“远程报错”。 配置MySQL以接受远程...

    MYSQL无法远程连接

    - 使用`UPDATE`语句更新`user`表中的`host`字段,将其值从`localhost`更改为`%`,表示允许所有IP地址连接。 ```sql UPDATE user SET host = '%' WHERE user = 'root'; ``` - 使用`SELECT`语句验证更新结果。 `...

    远程登陆mysql1130错误解决办法

    当`host`字段设置为“127.0.0.1”或“localhost”时,意味着该用户只能从本地主机访问MySQL服务器。 解决这个问题的方法如下: 1. **连接MySQL服务器**:你可以使用如`xshell`这样的SSH工具或者Windows的命令提示...

    Linux下mysql8.0.11安装包

    DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE test; FLUSH PRIVILEGES; ``` 最后,退出MySQL客户端并重新启动服务,使改动生效: ``` exit sudo ...

    Zabbix5.0监控mysql配置详细手册.docx

    本手册将详细介绍如何使用 Zabbix 5.0 监控 MySQL 数据库,包括 MySQL 服务器配置、Zabbix Agent 安装和配置、Zabbix 服务器配置等步骤。 一、MySQL 服务器配置 首先,需要在 MySQL 服务器上创建一个新用户用于...

Global site tag (gtag.js) - Google Analytics