`
zfj.rails
  • 浏览: 44836 次
  • 性别: 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数据库主机127.0.0.1与localhost区别

    mysql -h 127.0.0.1 的时候,使用 TCP/IP 连接, mysql server 认为该连接来自于127.0.0.1或者是”localhost.localdomain” mysql -h localhost 的时候,是 不使用TCP/IP 连接的,而使用 Unix socket ;此时,...

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

    今天在mac上搭建好了php的环境,把先前在window、linux下运行良好的程序放在mac上,居然出现访问不了数据库,数据库连接的host用的是localhost,可以确认数据库配置是正确的,因为在java中使用localhost访问正常,...

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

    mysql_connect(‘localhost’,’root’,’zzzizzz1′); 使用strace获取系统调用: 复制代码 代码如下: strace php connects.php 2>&1 | grep connect #127.0.0.1 -> internet socket connect(3, {sa_family=AF_INET...

    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: ...

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

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

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

    仔细思考了下,既然mysql是正常启动的,本地连接不上,是否和mysql绑定ip有关,因为之前将其作为远程数据库使用的,因此对其绑定的ip进行了修改。 切换到对应路径,打开mysql配置文件: 可以看到绑定的ip地址为192....

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

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

    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...

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

    最近用 Node 写一个小玩意,需要用到 MySQL 数据库,现在用得最广泛的是 mysql 这个库。然后呢,现在 ORM 这么火,干脆也上 ORM 吧,正好我也不会可以学习一下,于是找到了 Sequelize.js 这个 ORM 库。 发现问题 看...

    设置Mysql5.6允许外网访问的详细流程分享

    最近部署mysql5.6,发现默认mysql只允许本地提供服务,如果要进行若干配置,记录如下。...需要使用root权限登录mysql,更新mysql.user表,设置指定用户的Host字段为%,默认一般为127.0.0.1或者localhost。 1

    mysql-8.0.20-macos10.15-x86_64.tar.gz

    _mysql 40907 0.4 2.1 4907248 350300 s000 S 5:46下午 0:00.95 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql...

    mysql允许外网访问以及修改mysql账号密码实操方法

    mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法如下: 1,修改表,登录mysql数据库,切换到mysql数据库,使用sql语句查看”...

    mongodb-to-mysql-sync:MongoDB 到 MySQL 同步

    " host " : " 127.0.0.1 " , " port " : 27017 , " db " : " test " , " collection " : " blog_posts " }, " mysql " : { " host " : " localhost " , " user " : " root " , " password " : " " , " db ...

    如何设置mysql允许外网访问

    mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所以我想访问无法访问,测试暂停. 解决方法: 1,修改表,登录mysql数据库,切换到mysql数据库,使用sql语句查看”...

    Spring Boot mybatis plus layui 企业后台管理平台

    打开 application.properties 修改 MySQL 和 Redis 连接信息. spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.cache.type=redis spring.datasource.username=root spring.datasource.password=123456...

    最新开运网付费测算源码数据库

    host' => array( 'memcache://127.0.0.1:11212' ) ) ); //MySql配置 //slave数据库从库可以使用多个 $GLOBALS['config']['db'] = array( 'host' => array( 'master' => 'localhost', 'slave' => array('...

    Ubuntu下配置Mysql的远程管理

     将root用户对应的记录只保留一条host为localhost的记录;  然后将root用户对应的host属性由localhost改为%  再执行命令 flush privileges;  2.修改/etc/mysql/my.cnf  老的版本中  >skip-networking =>...

    Backup-Mysql-Ansible:使用Ansible备份Mysql

    MySQL-Ansible 使用Ansible备份Mysql 这很有趣,它将排除mysql数据库,仅备份对我们很重要的数据库ansible-playbook playbook.yml --extra-vars " host=localhost user=username pass=password db_host=127.0.0.1 ...

    PHP 配置后台登录以及模板引入

    DB_HOST=127.0.0.1 DB_DATABASE=blog DB_PREFIX=blog_ DB_USERNAME=root DB_PASSWORD=123.comg 分别写入数据库服务器地址、所连接的数据库名、表前缀、用户名、密码 其中表前缀DB_PREFIX 字段默认没有,需要在config...

    paymentDemo:支付API演示

    在项目的根文件夹中,使用任何终端,运行以下命令行以在localhost中启动Docker容器: docker-compose up -d 设置环境 将/app/.env.example文件复制到名为“ .env”的新文件中 在.env文件中,更改以下行: DB_...

Global site tag (gtag.js) - Google Analytics