为什么mysql -h localhost
无法登录了?
在mac上用docker运行了一个mysql,配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
version: '3'
services:
mysql:
# restart: always
image: mysql:5.7.22
container_name: mysql-dev
volumes:
- ./my.cnf:/etc/my.cnf
environment:
- "MYSQL_ROOT_PASSWORD=abc123"
- "MYSQL_DATABASE=mydb"
- "TZ=Asia/Shanghai"
ports:
- 3306:3306
|
1
2
3
4
5
6
7
8
9
10
11
|
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
|
启动容器,运行正常
1
2
3
4
5
6
7
8
9
10
11
|
> docker-compose -f docker-compose.yml up -d
Pulling mysql (mysql:5.7.22)...
5.7.22: Pulling from library/mysql
Digest: sha256:aaba540cdd9313645d892f4f20573e8b42b30e5be71c054b7befed2f7da5f85b
Status: Downloaded newer image for mysql:5.7.22
Creating mysql-dev ... done
> docker-compose -f docker-compose.yml ps
Name Command State Ports
------------------------------------------------------------------------
mysql-dev docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp
|
但是在登录时却失败了,报错如下
1
2
3
|
> mysql -hlocalhost -P3306 -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
|
登录容器发现/tmp/mysql.sock文件是存在的,网上搜索了一圈,大多都是修改my.cnf配置socket参数路径,试了一遍全部不行
最后发现了这遍文章为什么mysql -h localhost
无法登录了?
原来把localhost换成127.0.0.1就可以使用,这么简单,浪费不少时间,记录一下
1
2
3
4
5
6
7
8
9
10
11
12
13
|
> mysql -h127.0.0.1 -P3306 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
|
localhost和127.0.0.1的区别
- localhost和127.0.0.1,前者是域名,后者是IP地址中特殊的一类回还地址。
- 许多时候localhost和127.0.0.1给人感觉是等价的,是由于在多数系统的/etc/hosts文件中,两者存在映射关系。
- 本机上的服务,如果通过localhost访问,可以不经过网卡,并且不受防火墙的限制。如果不经过网卡,那客户端和服务端要如何通信?答案就是socket。比如上面例子中的/tmp/mysql.sock。也因为不需要经过网卡,不需要TCP/IP协议的层层封包和层层解包过程,性能上会更出色一些。
- 本机上的服务,如果通过127.0.0.1访问,需要经过网卡,也可能受到防火墙限制。
参考