先执行mysql --version查看客户端版本,再运行brew services list | grep mysql确认服务状态及所用formula(如mysql@5.7),二者缺一不可。

确认当前MySQL版本和运行状态
升级前必须先看清现状,否则容易覆盖配置或中断服务。执行两条命令快速摸底:
-
mysql --version查看当前客户端版本(注意:这不一定是服务端版本) -
brew services list | grep mysql确认服务是否正在运行,以及用的是哪个formula(比如mysql还是mysql@5.7)
特别注意:如果看到 mysql@5.7 正在运行,而你想升级到 8.x,不能直接 brew upgrade mysql —— Homebrew 不允许跨主版本自动替换,会报错 Error: mysql@5.7 is already installed。
升级前必须备份数据和配置文件
Homebrew 升级 MySQL 不会自动迁移数据目录或保留 my.cnf,这是最容易丢库的环节。
- 数据目录位置取决于芯片:
/opt/homebrew/var/mysql(Apple Silicon)或/usr/local/var/mysql(Intel),用ls -la /opt/homebrew/var/ | grep mysql可确认 - 手动备份整个目录:
cp -R /opt/homebrew/var/mysql ~/mysql-backup-$(date +%Y%m%d) - 检查是否有自定义配置:
brew --prefix mysql输出路径后,再查$(brew --prefix mysql)/my.cnf或/etc/my.cnf,存在就复制走
别信“升级很安全”——MySQL 5.7 到 8.0 的系统表结构、密码认证插件、默认SQL模式全变了,跳过备份等于裸奔。
执行升级:分场景选择命令
不是所有升级都叫 brew upgrade。根据你的目标版本决定操作路径:
- 从
mysql@5.7升到mysql(即 8.x):
先停服务:brew services stop mysql@5.7
卸载旧版:brew uninstall mysql@5.7
装新版:brew install mysql
启动新服务:brew services start mysql - 同主版本内升级(如 8.0.x → 8.4.x):
直接运行:brew update && brew upgrade mysql
服务会自动重启,但首次启动时仍需检查错误日志:tail -20 /opt/homebrew/var/log/mysql/error.log - 降级(不推荐,但有时不得不做):
Homebrew 不提供历史包缓存,需手动brew tap-new username/mysql-legacy并导入旧formula,实际成本远高于重装,建议只用于紧急回滚测试
升级完成后,mysql -u root -p 登录进去第一件事是执行 SELECT VERSION(), @@sql_mode;,确认版本号和SQL模式是否符合预期。MySQL 8.0+ 默认启用 STRICT_TRANS_TABLES,老项目SQL可能报错。
升级后必须重置root认证方式与权限
MySQL 8.0+ 默认使用 caching_sha2_password 插件,而多数本地GUI工具(Sequel Ace、TablePlus、甚至某些Docker镜像里的客户端)仍依赖 mysql_native_password。空密码登录也会被拒绝。
- 登录后立即执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password'; - 刷新权限:
FLUSH PRIVILEGES; - 验证连接:
mysql -u root -p -h 127.0.0.1(强制TCP,避开socket认证歧义)
如果之前开通过远程访问(root@'%'),这个用户不会被自动迁移,必须手动重建并显式指定插件,否则连不上。另外,mysql_secure_installation 脚本在升级后不会自动重跑,所有安全策略(如匿名用户、test库)仍保持旧状态,需要人工复查。











