在 macOS 12 (Monterey) 上安装 MySQL 的血泪史:旧 Mac 踩坑全记录
环境:Intel MacBook Pro / macOS 12 Monterey / Homebrew + MacPorts
目标:在闲置旧 Mac 上部署一个需要 MySQL 8.4 的小项目
结果:耗时一下午,最终用 MySQL 8.0.31 官方 DMG 解决
教训:旧系统追新软件,等于用老爷车跑 F1。
一、起因:只是想装个数据库
事情很简单。我有一台闲置的 Intel Mac,系统停在 macOS 12 Monterey(Apple 早已停止大版本更新)。我想把之前开发的一个小工具部署上去,后端需要 MySQL。
我心想:不就是 brew install mysql 吗?能有多难?
结果这一下午,我先后经历了 3 小时 LLVM 源码编译、链接器报错、Protobuf 版本不兼容、端口树踩雷……最后才意识到:这不是我的问题,是旧系统被整个生态抛弃了。
二、第一坑:Homebrew 安装 MySQL 8.4,触发 LLVM 地狱编译
现象
执行:
brew install mysql@8.4
Homebrew 没有直接下载 MySQL,而是先开始编译 LLVM。
终端里开始疯狂输出:
[8414/10109] /usr/local/Homebrew/.../clang++ ... FormExpressions.cpp.o
我一开始以为卡死了,结果一查——不是卡死,是真的在编译。 而且进度是 8414/10109,说明总共有 10109 个编译目标。
为什么?
macOS 12 已经被 Homebrew 列为 Tier 3 支持(最低档)。MySQL 8.4 的 Formula 依赖 LLVM,但 Homebrew 没有为 macOS 12 提供预编译的 bottle(二进制包),所以只能从源码编译整个 LLVM 全家桶(包括 Clang、MLIR、LLD、libc++、compiler-rt 等)。
耗时
168 分钟 11 秒(2 小时 48 分钟)。
9,638 个文件,1.7GB。我的老风扇响了一下午。
结果
LLVM 终于编译安装成功,正当我以为苦尽甘来时,MySQL 的链接阶段直接报错:
ld: unknown option: -no_warn_duplicate_libraries
clang++: error: linker command failed with exit code 1
3 小时白熬。
根因
-no_warn_duplicate_libraries 是 Xcode 15 / macOS 13+ 的链接器才支持的选项。MySQL 8.4 的构建系统直接硬编码了这个选项,没有检测旧系统是否支持。而 macOS 12 的 ld64 永远停留在旧版本(Apple 不向后移植工具链)。
Homebrew 的报错也很直白:
“This build failure was expected, as this is not a Tier 1 configuration… Do not report any issues to Homebrew!”
翻译:我们知道会炸,但你别找我们。
三、第二坑:转向 MacPorts,又踩 Protobuf 版本雷
现象
Homebrew 官方提示说 MacPorts 对旧系统支持更好。我转而安装 MacPorts,执行:
sudo port selfupdate
sudo port install mysql8 mysql8-server
端口确实存在(mysql8 @8.4.8),而且 MacPorts 甚至专门打了 patch 修复了 -no_warn_duplicate_libraries 问题。我心想这次稳了。
结果编译到 [8%] 左右,又炸了:
/opt/local/.../mysqlx_datatypes.pb.h:13:2: error:
This file was generated by a newer version of protoc which is
incompatible with your Protocol Buffer headers. Please update
为什么?
MySQL 8.4 的源码包里预先生成了一批 Protobuf 文件(mysqlx_*.pb.h),这些文件是用 protoc 3.21+ 生成的。但 macOS 12 的 MacPorts 端口树中,protobuf3-cpp 的版本够不上这个要求。
我尝试 sudo port install protobuf3-cpp 升级,但端口树的版本仍然低于 MySQL 8.4 的要求。
根因
又是 MySQL 上游构建系统的兼容性漏洞——预生成代码假设了所有人都在用最新版 protoc,没有做版本检测和自动重新生成。
四、第三坑:官方下载页也没有 macOS 12 的 8.4 包
我想到:既然包管理器都不行,那我下官方二进制总行吧?
打开 MySQL 官方下载页,发现:
- MySQL 8.4 / 9.x:只提供 macOS 14/15 的 DMG
- MySQL 8.0 早期版本:官网 Archives 里才有 macOS 12 的构建
也就是说,MySQL 官方也已经彻底放弃了 macOS 12。
五、最终解决方案:MySQL 8.0.31 官方 DMG
步骤
- 访问 MySQL Archives
- Product Version: 选择
8.0.31(或 8.0.34,如果 Archives 里有) - Operating System:
macOS - OS Version:
macOS 12 (x86, 64-bit) - 下载 DMG Archive(约 461MB)
- 双击安装,在系统偏好设置里启动 MySQL Server
- 配置环境变量:
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> ~/.zshrc source ~/.zshrc
为什么选 8.0.31?
- 这是 MySQL 官方曾经为 macOS 12 发布的原生安装包
- 8.0 是长期支持版(LTS),到 2026 年仍在维护
- 对开发测试场景来说,8.0 和 8.4 的差异几乎无感知(认证插件、基本语法、客户端工具都兼容)
六、清理战场:保留 LLVM,清除残留
那 3 小时编译的 LLVM 不能白扔,以后装 Rust、Node、PostgreSQL 等依赖 LLVM 的软件还能复用。
Homebrew 清理(保留 LLVM):
# 确认 llvm 安全
brew list | grep llvm
# 清理 MySQL 残留
brew cleanup -s mysql@8.4
brew uninstall --force mysql@8.4 2>/dev/null || true
rm -f ~/Library/Caches/Homebrew/downloads/*mysql*
MacPorts 清理:
sudo port clean --all mysql8
sudo port clean --all mysql8-server
sudo rm -rf /opt/local/var/macports/build/*mysql8*
sudo rm -rf /opt/local/var/macports/logs/*mysql8*
sudo port uninstall mysql8 mysql8-server 2>/dev/null || true
七、复盘:到底是谁的锅?
| 责任方 | 问题 | 锅的大小 |
|---|---|---|
| MySQL 上游 | 构建系统硬编码新链接器选项、预生成 Protobuf 文件不兼容旧版本、不做特性检测 | 最大 |
| Apple | Xcode 15+ 不向后移植到 macOS 12,旧系统工具链永远停留在旧版本 | 次之 |
| Homebrew | 已明确声明 macOS 12 是 Tier 3,构建失败是"预期行为" | 较小 |
| MacPorts | 尽力维护了,但端口树版本追不上 MySQL 8.4 的激进依赖 | 无 |
最冤的是我,和这台老 Mac。
八、避坑指南(如果你也是旧 Mac)
1. 先查系统版本
sw_vers -productVersion
如果是 macOS 12 或更早,直接放弃包管理器安装新版 MySQL 8.4/9.x。
2. 优先查官方 Archives
不要只看官网首页的"最新版本",直接去 Archives 找对应系统的历史版本:
- https://downloads.mysql.com/archives/community/
3. 包管理器选择
| 系统版本 | 推荐方案 |
|---|---|
| macOS 14+ | brew install mysql(有 bottle,几分钟) |
| macOS 12/13 | 官方 DMG(8.0.x) 或 MacPorts MariaDB |
| 更旧 | MacPorts 或 Docker |
4. Docker 是最后的退路
虽然我不想加虚拟化层(老机器性能本来就弱),但如果必须跑 8.4,Docker 是唯一确定能成的路径:
docker run --name mysql84 \
-e MYSQL_ROOT_PASSWORD=你的密码 \
-p 3306:3306 \
-d mysql:8.4
5. 旧系统不要追新
核心教训:旧硬件 + 旧系统 + 新软件 = 灾难。要么升级系统(硬件允许的话),要么接受"能用就行"的旧版本。
九、写在最后
这台 Intel Mac 今天编译了 3 小时 LLVM,两次 MySQL 构建失败,风扇响了一下午。它尽力了,我也尽力了。
有时候,技术问题不是"能不能解决",而是"值不值得解决"。一下午的时间,如果一开始就去 Archives 下 DMG,5 分钟就能跑起来。
希望这篇记录能帮你省下一下午。

682

被折叠的 条评论
为什么被折叠?



