MySQL 中的 localhost 和 127.0.0.1 的区别
文章目录
[toc]
今天看到一篇文章,是测试 MySQL 8.0 修改密码并验证登录的文章。
其中有以下验证
可以看到上面修改的是 root@'localhost'
用户的密码,而下面验证登录的是通过-h127.0.0.1
的方式登录。这很显然是有问题的,是不严谨的,为什么呢,因为在 MySQL 中 localhost 和 127.0.0.1 是有一点区别的。
下面说下我对 MySQL 中的localhost
和 127.0.0.1
区别的理解。
当前数据库的用户信息
1 | mysql> select user,host from mysql.user; |
也就是目前数据库当中只有一个用户 root@localhost
; 权限就是 all on *.*
MySQL 8.0 通过 show grants for
看到的是一堆相信的权限信息,在之前的版本比如 5.7就是显示GRANT ALL PRIVILEGES ON *.*
1 | mysql> select @@version; |
首先数据库中创建两个用户 root@localhost
和[email protected]
,设置不同的密码
当然在安装完成 MySQL 8.0 之后会创建一个 root@localhost
的用户,这里设置密码为rootlocal
,创建 [email protected]
用户,密码设置为 root127
。
1 | mysql> alter user root@localhost identified by 'rootlocal'; |
验证 -h127.0.0.1 和 -hlocalhost 登录
-h127.0.0.1 登录
通过密码 root127
可以登录成功。
1 | [root@liups bin]# ./mysql -uroot -proot127 -h127.0.0.1 |
-hlocalhost 登录
1 | [root@liups bin]# ./mysql -uroot -prootlocal -hlocalhost |
提示ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
也就是说他要通过 socket 来进行登录,但是默认的 /tmp/mysql.sock
不存在,次数据库的socket 在 /data/mysql/run/mysql.sock
因此登录失败。
1 | mysql> show variables like 'socket'; |
有两种方式解决:
通过-S
参数手动指定socket
1 | [root@liups bin]# ./mysql -uroot -prootlocal -hlocalhost -S /data/mysql/run/mysql.sock |
手动创建软连
1 | [root@liups bin]# ln -s /data/mysql/run/mysql.sock /tmp/mysql.sock |
然后通过 -hlocalhost
登录成功。
1 | [root@liups bin]# ./mysql -uroot -prootlocal -hlocalhost |
可以看到不管是创建软连还是手动指定socket
,current_user()
都是 root@localhost
检查-h127.0.01 和-hlocalhost 登录的连接方式
1 | [root@liups bin]# ./mysql -uliups -h127.0.0.1 -ppassword -e'status'|grep Connection: |
可以看到 -h127.0.0.1
的连接方式是 ==TCP/IP
==
1 | [root@liups bin]# ./mysql -uroot -prootlocal -S /data/mysql/run/mysql.sock -e'status'|grep Connection: |
可以看到 -hlocalhost
的连接方式是 ==UNIX socket
==
通过以上可以看到 -hlocalhost
和-h127.0.0.1
的区别:
1、连接数据库的方式不一样: -h127.0.0.1
的连接方式是 ==TCP/IP
==, -hlocalhost
的连接方式是 ==UNIX socket
==
2、这是两个不同的用户,以上演示的操作过程这俩用户的密码都不一样,既然用户不一样,那肯定是可以给这两个用户授予不同的权限了,这里不再展示。
验证本环境修改密码并测试登录
那么在本次实验中通过如下修改密码,验证是否会成功呢。
1 | mysql> alter user root@'localhost' identified by 'root1'; |
本环境是无法登录的,那就来了灵魂拷问的一个问题,为什么他可以呢?
原文作者: liups.com
原文链接: http://liups.com/posts/e9b891be/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议