brew install mysql仅安装二进制文件,不初始化数据目录、不配置socket路径、不生成root临时密码,需手动执行mysqld --initialize初始化、修改my.cnf指定socket=/usr/local/var/mysql/mysql.sock、用临时密码登录后立即alter user改密。

brew install mysql 这条命令本身能跑通,但装完大概率启动失败、连不上、报 socket 错误或卡在“找不到 root 密码”——不是命令错了,是 macOS 上 Homebrew 安装 MySQL 后必须手动补三步:初始化数据目录、覆盖 socket 路径、用临时密码登录改密。
为什么 brew install mysql 装完不能直接 brew services start mysql
Homebrew 只负责把二进制文件和依赖拉下来,不创建 /usr/local/var/mysql 这个数据目录,也不生成初始系统表。结果就是服务启动时直接退出,日志里只有一行 mysqld is not running,毫无提示。
- 必须运行
mysqld --initialize --user=$(whoami) --datadir=/usr/local/var/mysql --tmpdir=/tmp(Apple Silicon 推荐此命令,比mysql_install_db更可靠) - 执行后会输出一行
A temporary password is generated for root@localhost: xxxxxx,这个密码只出现一次,关掉终端就没了 - 如果已执行过该命令又重跑,会报错
Can't create directory '/usr/local/var/mysql'或提示 data dir not empty,说明初始化已完成,别硬重复
连接时报 Can't connect to local MySQL server through socket '/tmp/mysql.sock'
macOS 15 Sequoia 及更新系统默认禁止进程往 /tmp 写 socket 文件,而 Homebrew 的 MySQL 配置仍指向 /tmp/mysql.sock,客户端(比如 mysql -u root -p)就会跪在这儿。
- 手动创建配置文件:
echo '[mysqld]\nsocket=/usr/local/var/mysql/mysql.sock' > /usr/local/etc/my.cnf - 确保数据目录权限正确:
sudo chown -R $(whoami) /usr/local/var/mysql - 重启服务:
brew services restart mysql,再查日志:brew services log mysql,看到mysqld is ready才算真正就绪
首次登录后必须立刻改密,否则后续所有操作都会被拒绝
MySQL 8.0+ 强制要求 root 用户首次登录后必须重置密码,哪怕你刚用临时密码登进去,执行任何语句(包括 SHOW DATABASES;)都会报错 ERROR 1820 (HY000): You must reset your password before executing this statement。
- 登录:
mysql -u root -p,输入初始化时打印的临时密码 - 立即执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; - 别用
mysql_secure_installation——它会在改密前先问一堆问题(比如删匿名用户),但只要没先改密,它自己就会卡住退出,白跑一趟 - 改密成功后,退出再重新登录验证:
mysql -u root -p→ 输入新密码 → 能进就是成了
容易被忽略的残留和路径差异
Apple Silicon(M1/M2/M3)和 Intel Mac 的 Homebrew 根路径不同,导致 brew --prefix mysql 输出不一样,但实际安装后所有关键路径(/usr/local/var/mysql、/usr/local/etc/my.cnf)都是统一的。真正麻烦的是旧版本残留。
- 执行
brew list | grep mysql,只要输出非空,就必须先brew uninstall mysql,再rm -rf /usr/local/var/mysql /usr/local/etc/my.cnf -
brew cleanup清掉旧 bottle 缓存,避免安装时拉到损坏包 - 如果之前用 .dmg 包装过 MySQL,检查
ps aux | grep mysqld是否有残留进程,有就kill -9掉,否则端口 3306 会被占着











