今天下午,我吃着火锅唱着歌,打开navicat做一下今天的作业,突然发现链接失败…呃呃

立马打开终端排查:

1
2
3
4
➜  ~ brew services start mysql
Service `mysql` already started, use `brew services restart mysql` to restart.
➜ ~ mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

这个ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)给我干沉默了;

初步猜测或许是:

  1. 套接字路径不匹配:可能使用了非默认的套接字路径;
  2. 套接字文件丢失:套接字文件可能因权限问题或异常关闭而未生成;

那么应该是mysqld跑了,但它使用的 socket 路径 ≠ /tmp/mysql.sock;

我脑子一抽,直接brew remove mysql,我真傻,真的,我以为重新安装就会配置好了,结果还是ERROR 2002 (HY000);

我还是先看看进程ps aux | grep mysqld:

1
2
3
4
5
➜ ps aux | grep mysqld
xxxx 18584 0.0 0.0 410724112 1472 s005 S+ 3:00下午 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox --exclude-dir=.venv --exclude-dir=venv mysqld
xxxx 18554 0.0 2.3 412212880 567920 ?? S 3:00下午 0:00.41 /opt/homebrew/opt/mysql/bin/mysqld --basedir=/opt/homebrew/opt/mysql --datadir=/opt/homebrew/var/mysql --plugin-dir=/opt/homebrew/opt/mysql/lib/plugin --log-error=LENMacbook.local.err --pid-file=LENMacbook.local.pid
xxxx 18433 0.0 0.0 410604816 2896 ?? S 3:00下午 0:00.02 /bin/sh /opt/homebrew/opt/mysql/bin/mysqld_safe --datadir=/opt/homebrew/var/mysql

可以看出mysqld 进程已经在跑PID = 18554,只是客户端找错了 socket 位置;

Homebrew默认把 sock 放到 /opt/homebrew/var/mysql/mysql.sock,而 mysql 命令默认去 /tmp/mysql.sock,所以会报 2002;

直接走TCP连接试一下:

1
2
3
4
5
6
7
8
9
10
11
12
➜  ~ mysql -uroot -h127.0.0.1 -P3306 --protocol=tcp
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 9.3.0 Homebrew

Copyright (c) 2000, 2025, 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.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

所以我们可以确认:

  1. mysqld正常监听 3306;
  2. 通过 TCP (mysql -h127.0.0.1) 可以成功进入 → 服务器没问题;
  3. /opt/homebrew/etc/my.cnf没有 socket 配置,所以 mysqld 没去创建 Unix-socket 文件;

所以我们需要:

  1. 新建或编辑 /opt/homebrew/etc/my.cnf
1
sudo nano /opt/homebrew/etc/my.cnf
  1. 添加以下内容(没有就整段粘进去即可):
1
2
3
4
5
6
[mysqld]
datadir=/opt/homebrew/var/mysql
socket = /opt/homebrew/var/mysql/mysql.sock

[client]
socket = /opt/homebrew/var/mysql/mysql.sock
  1. 保存后重启服务
1
brew services restart mysql
  1. 验证
1
2
ls -l /opt/homebrew/var/mysql/mysql.sock
mysql -uroot

这样就好了……..我靠我忘记设密码了…

1
2
3
4
5
6
7
8
9
10
➜  ~ sudo nano /opt/homebrew/etc/my.cnf
➜ ~ brew services restart mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
TMPDIR is world-writable: /private/tmp
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
➜ ~ ls -l /opt/homebrew/var/mysql/mysql.sock
srwxrwxrwx 1 len5010 admin 0 5 19 15:04 /opt/homebrew/var/mysql/mysql.sock
➜ ~ mysql
ERROR 1045 (28000): Access denied for user 'xxxx'@'localhost' (using password: NO)

那就先mysql -uroot -h127.0.0.1 --protocol=tcp 进去改个密码

1
2
ALTER USER 'root'@'localhost' IDENTIFIED BY '我的密码';
FLUSH PRIVILEGES;

成功!