不能用Colima跑原生MySQL,必须用Homebrew原生安装mysql@8.0:确认which brew输出/opt/homebrew/bin/brew、arch输出arm64,执行brew install mysql@8.0,手动--initialize-insecure初始化,再ALTER USER...IDENTIFIED WITH mysql_native_password降级认证插件。

直接说结论:不能用 colima 跑原生 MySQL,它不是容器化 MySQL 的正确解法;M1 上想获得真正 ARM 原生、低延迟、易调试的 MySQL 环境,必须走 Homebrew 原生安装路线 —— colima 只适合运行 x86_64 镜像或 Kubernetes 场景,硬塞进去反而引入网络、权限、时区、socket 路径等一连串不可控问题。
为什么别在 Colima 里跑 MySQL 容器
Colima 是为运行 x86_64 镜像(比如 OpenReplay 的 Helm Charts)而设计的,靠 QEMU 模拟层实现兼容。但 MySQL 不是“拿来即用”的服务组件,开发阶段你频繁需要:
- 直接读写本地
/opt/homebrew/var/mysql@8.0数据目录(比如恢复 dump、查 ib_logfile) - 用
mysql -u root -p零延迟连接,而不是绕docker exec -it mysql-container mysql -u root -p - 让 Navicat / DBeaver / Laravel Sail 直连
127.0.0.1:3306,不碰host.docker.internal或自定义 network - 调试慢查询日志、
my.cnf参数热加载、信号触发 flush logs 等底层行为
这些操作在 Colima 容器里要么路径错乱,要么权限拒绝,要么根本无法触发宿主机文件系统事件。这不是配置问题,是架构错位。
正确做法:Homebrew 原生安装 mysql@8.0
确保你用的是 Apple Silicon 原生 Homebrew(路径为 /opt/homebrew),不是 Rosetta 下的 Intel 版。验证方式:
- 运行
which brew→ 输出必须是/opt/homebrew/bin/brew - 运行
arch→ 输出必须是arm64 - 运行
brew install mysql@8.0(不要用mysql别名,它可能指向 8.4+) - 验证二进制架构:
/opt/homebrew/opt/mysql@8.0/bin/mysql -V中应含macos22-arm64字样
装完立刻停服务:brew services stop mysql@8.0,因为默认初始化会启用 validate_password 插件,导致后续连不上。
绕过初始化坑:手动 insecure 初始化 + 降级认证插件
MySQL 8.0 默认用 caching_sha2_password,但旧版客户端(Navicat 15、DBeaver 22.3、Laravel Sail 12)默认不支持公钥检索,报错 Public Key Retrieval is not allowed 或直接拒绝连接。必须主动降级:
- 执行手动初始化:
/opt/homebrew/opt/mysql@8.0/bin/mysqld --initialize-insecure --user=$(whoami) --basedir=/opt/homebrew/opt/mysql@8.0 --datadir=/opt/homebrew/var/mysql@8.0 - 启动服务:
brew services start mysql@8.0 - 无密登录:
mysql -u root - 立即执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password'; - 刷新权限:
FLUSH PRIVILEGES;
这步跳过 mysql_secure_installation,因为它会强制启用 validate_password 并设复杂密码策略,和开发场景背道而驰。
开放远程访问(可选但高频)
开发中常需从 Docker 容器、iOS 模拟器或另一台机器访问本机 MySQL。编辑 /opt/homebrew/etc/my.cnf(若不存在则新建),在 [mysqld] 段下加:
bind-address = 0.0.0.0 port = 3306
然后执行 brew services restart mysql@8.0。再给 root 开放远程权限(仅限开发环境):
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_secure_password';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;
注意:bind-address = 0.0.0.0 后必须配用户授权,否则连 127.0.0.1 都会被拒绝 —— 这是 MySQL 8.0 的严格 host 匹配逻辑,容易被忽略。


















