无法连接本地MySQL

在Linux系统下,MySQL客户端有两种不同的方法连接本地mysqld服务:

  • 通过Unix socket文件。这是一个在文件系统中的文件,默认/tmp/mysql.sock。
  • 使用TCP/IP连接。TCP/IP需要个网络端口,默认3306。

Unix socket文件比TCP/IP连接速度快,但只能连接客户端所在的同一台服务器上的MySQL。连接MySQL时不指定主机名,或者指定特定的主机名localhost,则使用Unix socket文件连接。

error (2002) Can't connect to ...错误一般可能是以下原因导致的:

  • MySQL服务未启动。
  • 连接使用了错误的Unix socket文件。
  • 连接使用了错误的TCP/IP端口号。

原因知道了,排查起来也就简单了。

首先检查服务器上是否有mysqld进程,确定MySQL服务已启动。如果没有这个进程,则说明MySQL服务未启动。Linux系统查看方式如下:

1
2
3
4
$ ps xa | grep mysqld
13974 ? S 0:01 /bin/sh /usr/bin/mysqld_safe
14051 ? Sl 112:17 /opt/mysql/bin/mysqld --basedir=/opt/mysql --datadir=/opt/mysql/data --plugin-dir=/opt/mysql/lib/plugin --user=mysql --log-error=frin.err --pid-file=frin.pid
151147 pts/4 S+ 0:00 grep mysqld

如果mysqld进程在运行,可以用下面两种连接MySQL的方式,使用mysqladmin工具查看MySQL端口或Unix socket文件信息。

执行以下命令,用户是superset,可以看出连接方式是通过Unix socket(Localhost via UNIX socket),Unix socket文件是/tmp/mysql.sock。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ mysqladmin -hlocalhost -usuperset -p version
Enter password:
mysqladmin Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version 8.0.34
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /tmp/mysql.sock
Uptime: 31 min 49 sec

Threads: 2 Questions: 3537 Slow queries: 0 Opens: 191 Flush tables: 3 Open tables: 110 Queries per second avg: 1.852

在Linux中临时目录/tmp下的文件会被定期清理,所以/tmp/mysql.sock也会被清理掉,导致MySQL无法访问。关于如何保护或修改MySQL的Unix socket文件以后的文章再分项。

执行以下命令,用户同样是superset,可以看出连接方式是TCP/IP(127.0.0.1 via TCP/IP),端口是3306。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ mysqladmin -h127.0.0.1 -usuperset -p version
Enter password:
mysqladmin Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version 8.0.34
Protocol version 10
Connection 127.0.0.1 via TCP/IP
TCP port 3306
Uptime: 38 min 34 sec

Threads: 2 Questions: 4252 Slow queries: 0 Opens: 191 Flush tables: 3 Open tables: 110 Queries per second avg: 1.837

理解了MySQL连接的两种方式,出现连接不上的问题基本可以从以下几个方面排查:

  • MySQL服务:
    • MySQL服务是否运行正常。
    • MySQL启动没有指定skip_networking参数,这会导致MySQL不会接受任何TCP/IP连接。
    • MySQL服务绑定的IP地址,如果设置了127.0.0.1,则只允许本机访问,不接受远程访问。
  • Unix socket文件相关:
    • 文件是否存在。
    • 文件权限是否适当。
    • 客户端用的Unix socket文件是否正确。
  • 网络相关:
    • 检查网络是否连通,可以用ping命令。
    • 检查端口是否可访问,可以用telnet命令。
    • 检查是否防火墙屏蔽了访问。

参考文档:Can’t connect to [local] MySQL server