Homebrew装多版本MySQL需为每个版本单独初始化数据目录、指定独立socket和pid路径、用对应配置启动,否则必然冲突;须分别创建my57.cnf/my80.cnf,显式设置端口、socket、datadir,并按版本调用对应mysqld --initialize初始化。

Homebrew 装多版本 MySQL 不是“装完就能跑”,必须为每个版本单独初始化数据目录、指定独立 socket 和 pid 文件路径、用对应配置启动服务——否则必然冲突或启动失败。
安装 mysql@5.7 和 mysql@8.0 时不能共用默认配置
brew install mysql@5.7 和 brew install mysql@8.0 会各自拉取二进制,但 Homebrew 不会自动为它们生成隔离的配置文件或数据目录。两个版本若共用 /usr/local/etc/my.cnf 或默认 datadir,启动时会抢锁、报错 Can't start server: Bind on TCP/IP port 或 Table 'mysql.user' doesn't exist。
- 必须手动创建分离的配置文件,例如:
my57.cnf和my80.cnf - 每个配置里要显式指定不同端口(如
port = 3306和port = 3307)、不同 socket 路径(如socket = /usr/local/var/run/mysqld57.sock)、不同datadir(如/usr/local/var/mysql_57) - Apple Silicon 用户注意:
datadir路径需有写权限,推荐放在/usr/local/var/下而非/tmp或用户主目录
初始化数据目录必须按版本分别执行
MySQL 5.7 和 8.0 的初始化机制不同:mysql_install_db 在 8.0+ 已废弃,必须用 mysqld --initialize;而 5.7 仍支持该命令,但混用会导致系统表不兼容。
- 对 mysql@5.7:运行
/opt/homebrew/opt/mysql@5.7/bin/mysqld --initialize --user=$(whoami) --datadir=/usr/local/var/mysql_57 --tmpdir=/tmp - 对 mysql@8.0:运行
/opt/homebrew/opt/mysql@8.0/bin/mysqld --initialize --user=$(whoami) --datadir=/usr/local/var/mysql_80 --tmpdir=/tmp - 每次执行都会输出一行临时 root 密码,只显示一次,务必复制保存;重复执行会报
Data directory not empty - 别用
mysql_secure_installation——它不认自定义配置路径,且在 8.0+ 首次登录后必须先ALTER USER改密,否则任何操作都报ERROR 1820
启动服务必须绑定对应配置文件,不能依赖 brew services 默认行为
brew services start mysql@5.7 默认读 /usr/local/etc/my.cnf,不会自动加载你写的 my57.cnf,结果就是启动了但连不上、日志里全是 socket 错误或 sql_mode 不兼容警告。
- 正确做法是用完整命令启动:
/opt/homebrew/opt/mysql@5.7/bin/mysqld --defaults-file=/usr/local/etc/my57.cnf - 或者改写 service 配置:用
brew services run mysql@5.7 -- --defaults-file=/usr/local/etc/my57.cnf(仅临时),长期建议用 launchd plist 自定义 - 验证是否真跑起来:检查对应 socket 文件是否存在(
ls -l /usr/local/var/run/mysqld57.sock),再用mysql -u root -p -S /usr/local/var/run/mysqld57.sock连 - macOS Sequoia 及更新系统禁止往
/tmp写 socket,所以socket路径必须避开/tmp,推荐/usr/local/var/run/
客户端连接和工具配置容易忽略版本路由
DBeaver、TablePlus 或命令行 mysql 客户端默认走 /tmp/mysql.sock 或 3306 端口,不指定就永远连到第一个启动的版本,根本意识不到自己连错了。
- 命令行连指定版本:用
-S指 socket(mysql -u root -p -S /usr/local/var/run/mysqld57.sock)或-P指端口(mysql -u root -p -P 3307) - DBeaver 配置连接时,“Server Host”留空、“Port”填对应端口、“Unix Socket”填对应 socket 路径,二者选其一即可
- 如果用
mysql@5.7的 client 连mysql@8.0的 server,可能报Client does not support authentication protocol——因为 8.0 默认用caching_sha2_password,需在 server 端执行ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'xxx'
最常被跳过的动作是:没删旧版残留的 /usr/local/var/mysql 目录,也没清空 /usr/local/etc/my.cnf 里的全局配置,导致新版本初始化时静默失败,然后花几小时查日志却只看到 “mysqld is not running”。


















