在 macOS 12 (Monterey) 上安装 MySQL 的血泪史:旧 Mac 踩坑全记录

在 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_librariesXcode 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

步骤

  1. 访问 MySQL Archives
  2. Product Version: 选择 8.0.31(或 8.0.34,如果 Archives 里有)
  3. Operating System: macOS
  4. OS Version: macOS 12 (x86, 64-bit)
  5. 下载 DMG Archive(约 461MB)
  6. 双击安装,在系统偏好设置里启动 MySQL Server
  7. 配置环境变量:
    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 文件不兼容旧版本、不做特性检测最大
AppleXcode 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 分钟就能跑起来。

希望这篇记录能帮你省下一下午。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dapeng-大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值