【问题标题】:Unable to connect to MySQL database from vps using localhost无法使用 localhost 从 vps 连接到 MySQL 数据库
【发布时间】:2020-03-10 12:01:32
【问题描述】:

我有两个环境:我的本地机器 Mac 和 VPS 上的 linux。问题是我无法使用 localhost 从 VPS 连接到我的数据库。 在我的本地机器上一切正常。

本地:

mysql -u root mydb -h 127.0.0.1 --password=password --port=2345 //OK
mysql -u root mydb -h 0.0.0.0 --password=password --port=2345   //OK
mysql -u root mydb -h localhost --password=password --port=2345 //OK

即使使用 VPS 的公共 ip,我也可以从本地机器连接到远程数据库。

VPS:

mysql -u root mydb -h 127.0.0.1 --password=password --port=2345 //OK
mysql -u root mydb -h 0.0.0.0 --password=password --port=2345   //OK
mysql -u root mydb -h localhost --password=password --port=2345 //KO <-

错误:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

我使用以下 docker 文件来创建我的图像。

DockerFile:

FROM mysql:8.0
COPY *.sql /docker-entrypoint-initdb.d/

docker-compose.yaml:

version: '3.7'
services:
  ls:
    image: ***/db-container:v6 # <-my image
    container_name: db-container
    restart: always
    environment:
      MYSQL_DATABASE: 'mydb'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '2345:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
    volumes:
      - db-container:/var/lib/mysql
volumes:
  db-container:

容器内查询:

mysql> SELECT host, user FROM mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| %         | user             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+


mysql> SELECT * FROM performance_schema.host_cache; 
Empty set (0.02 sec)

【问题讨论】:

  • 对于失败的连接(KO),请记录看到的错误信息。
  • 我在尝试连接本地主机时添加了错误
  • 这里是您的问题的可能解决方案:stackoverflow.com/questions/33001750/…
  • 您是否尝试使用 docker 容器的 IP 而不是 127.0.0.1?... 比如 10.0.1.12:2345 ? @Alexey

标签: mysql networking docker-compose localhost vps


【解决方案1】:

我猜在本地机器上,你没有使用 docker。但是,在 vps 上,你是。

在您本地,mysql 安装在操作系统本身上,因此,它在 /var/run/mysqld/mysqld.sock 处暴露了其套接字文件。但是,在 VPS 上,socket 在 docker 里面。

这里的重点是localhost127.0.0.1在引用mysql时的区别。在基于 unix 的系统(包括 mac)上,localhost 通过套接字连接,而127.0.0.1 通过 TCP/IP 连接。

尝试在 docker-compose 卷部分下添加以下内容。看看它是否有效。

volumes:
    - /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysqld.sock

【讨论】:

    【解决方案2】:

    "localhost" 表示使用套接字。但是 VPS 可能只允许 TCP/IP 连接,而不是“套接字”。

    【讨论】:

    • @Alexey 你也在本地机器上使用 Docker 吗?
    • 是的,我在问题中的本地机器(MacBook)被写为 LOCAL,而远程机器(Ubuntu)被称为 VPS。我执行相同的命令连接mysql,结果不同。
    • 好的,可能是VPS拒绝了“socket”访问。
    【解决方案3】:

    连接被拒绝有许多不同的根本原因。

    由于可以在容器内执行查询,最好的做法是检查performance_schema.host_cache 表:

    SELECT * FROM performance_schema.host_cache;
    

    它应该更准确地指向问题。

    文档: https://dev.mysql.com/doc/mysql-perfschema-excerpt/8.0/en/host-cache-table.html

    【讨论】:

    • mysql> 选择 * FROM performance_schema.host_cache;返回:空集(0.00 秒)
    • 见@rick james 的回答。失败发生在客户端,甚至连服务器都连接不上,所以host_cache表什么也不会显示。
    • 但是为什么它在本地机器上工作(本地和远程使用相同的docker镜像和docker-compose文件),相同的查询在本地机器上也返回空结果
    • 你确定来自 mac 的 localhost 连接到正确的服务器吗?使用 /var/run/mysqld/mysqld.sock 的 UNIX(不是 TCP/IP)连接将指向在同一机器上运行的服务器,并忽略 TCP/IP 端口号。 Docker对/var/run/mysqld/mysqld.sock一无所知,这里就不涉及了。
    • 是的,我可以连接到 docker 容器内的 MySQL 并查看我的所有表。
    猜你喜欢
    • 2016-12-13
    • 2021-10-13
    • 2020-12-03
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2015-12-30
    • 2012-01-13
    相关资源
    最近更新 更多