为什么mysql -h localhost无法登录了?

在mac上用docker运行了一个mysql,配置如下:

  • docker-compose.yml配置
 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
  • my.cnf配置
 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访问,需要经过网卡,也可能受到防火墙限制。

参考