ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Mac上安装MySQL全指南:Homebrew、DMG与Docker三种方案详解

Mac上安装MySQL全指南:Homebrew、DMG与Docker三种方案详解 1. 装之前先把思路理清楚三种方式怎么选在Mac上装MySQL这个事网上教程一抓一大把但大多只告诉你“复制这条命令回车”至于为什么这么做、装完怎么管理、出了问题怎么排查基本没人讲清楚。我前前后后在Mac上装过几十次MySQL踩过各种奇怪的坑今天把整个流程和思路一次说透。先回答一个最核心的问题你到底是哪种情况如果你平时用Homebrew管理开发环境那直接brew install最省心如果你只是临时要用一下、不想动命令行那一套官网DMG安装包双击就行如果你已经在用Docker那跑一个MySQL容器也完全不冲突。这三种方式各有适用场景没有绝对的对错选错了后面才麻烦。以我自己的经验日常开发机推荐Homebrew因为后续升级、卸载、启动服务都归brew管数据目录、配置文件位置清晰不会出现装了一堆东西最后烂在系统里的情况。官网DMG适合想要“开箱即用”的人安装向导会引导你完成全部配置不过它对系统的侵入性更强以后想卸载会比较痛苦。至于Docker隔离性最好但不适合做本地开发的常驻数据库容器一停数据就“消失”了除非你挂了数据卷。提示不管选哪种方式MySQL 8.0是当前最稳妥的版本选择。8.4是LTS版本功能更新更频繁但对普通开发者来说8.0足够了。1.1 为什么我不建议一上来就“双击安装”很多Mac新手拿到安装包就一路“继续”装完发现命令行里根本找不到mysql命令原因是安装包默认不会帮你配置PATH环境变量还得手动改.zshrc。而且DMG方式默认的配置文件路径、数据目录、日志文件分散在不同位置出问题的时候想排查都不知道日志在哪。反过来说Homebrew方式的优势就在于“一切尽在掌握”。它把MySQL装在/opt/homebrew/opt/mysqlApple Silicon或/usr/local/opt/mysqlIntel配置文件在/opt/homebrew/etc/my.cnf数据目录在/opt/homebrew/var/mysql。路径统一备份、迁移、卸载都很好操作。另外还要考虑一个问题你只是想装个MySQL练手还是打算长期开发用如果只是临时练练SQL用Docker跑一个容器就够了docker run -d --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0这条命令就能拉一个MySQL 8.0起来不用的时候容器一停宿主机干干净净。但如果打算长期用、要跑项目原生安装才靠谱。1.2 先认清你的Mac芯片、系统、环境装了这么多次MySQL我总结出一个教训动手之前先搞清楚自己的机器是什么芯片、什么系统版本能少走很多弯路。Apple SiliconM1/M2/M3系列和Intel芯片的Mac安装包和命令都存在差异。打开终端找不到终端的话用Spotlight搜索“Terminal”依次执行下面三条命令uname -m sw_vers brew -vuname -m会输出arm64Apple Silicon或x86_64Intel这决定你下载哪个架构的安装包。sw_vers输出macOS版本号比如ProductVersion: 14.5。MySQL对系统版本有最低要求过于老的系统装不了新版MySQL。brew -v检查是否安装了Homebrew。如果提示command not found说明没装或者装了但PATH没配置好。这里单独说一句Homebrew的安装。很多新手卡在这一步不是Homebrew本身有问题而是网络不给力。国内环境下装brew时经常卡在下载Command Line Tools for Xcode这一步。解决办法很简单开代理如果你有的话或者用国内镜像源。有一点需要注意Homebrew安装过程中会往/opt/homebrew或/usr/local目录写入文件如果权限不对会报Permission denied此时需要手动修复目录权限sudo mkdir -p /opt/homebrew sudo chown -R $(whoami):admin /opt/homebrew装完之后用brew -v验证一下能看到版本号就说明环境OK了。这一步完成了后面安装MySQL会非常顺利。2. 方案一Homebrew一条命令装好推荐给有brew的人如果你已经装好Homebrew那安装MySQL只需要一条命令brew install mysql这一条命令会自动拉取MySQL 8.0的稳定版目前brew默认是8.0系列具体小版本号取决于软件源同时把依赖的OpenSSL等一并搞定。安装完成后终端会提示你运行mysql_secure_installation来做安全配置还会告诉你brew services start mysql可以启动服务并设置开机自启。这个方式最大的好处是干净。它不会像DMG那样往你的/Library/LaunchDaemons里塞自启脚本也不会在系统偏好设置里多出一个面板所有操作都通过brew托管。升级也简单brew upgrade mysql一条命令搞定数据文件会保留。2.1 装brew时最常见的两个报错我帮你们先踩过虽然你现在的目标是MySQL但绝大多数人第一步就卡在Homebrew上。我在公司帮同事配环境时几乎每个人都会碰到下面两个报错报错一curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused这个报错十有八九是网络问题不是命令错误。Homebrew安装脚本需要从GitHub拉取文件国内直连经常不通。解决办法有两个要么用代理要么用国内源。用中科大源的话安装命令改为/bin/bash -c $(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)执行后会提示你选择镜像源选中科大或者清华都行。装完后再执行brew -v能输出版本号就算成功。报错二Error: /opt/homebrew is not writable这是目录权限问题。新Mac或换过用户名后经常遇到执行sudo chown -R $(whoami) /opt/homebrew把/opt/homebrew目录的所有权还给当前用户重新执行安装脚本即可。注意Command Line Tools for Xcode安装失败也会导致brew无法使用。如果安装过程中卡在“Installing Command Line Tools”环节可以先手动执行xcode-select --install弹窗出来后点安装等它完成后再装brew。2.2 brew install mysql之后你需要知道的初始化细节安装过程大概几分钟取决于网速。装完先别急着用有几步配置必须做。第一步启动服务。这里有两种启动方式区别很大brew services start mysql这种方式会把MySQL注册成后台服务开机自动启动以后不用管它适合当常驻数据库用。另外一种mysql.server start这种方式只是临时启动进程重启电脑后MySQL不会自动启动适合偶尔用一下。我建议开发机用brew services start mysql省心。第二步初始化密码。Homebrew安装的MySQL默认root用户密码是空的也就是你执行mysql -uroot就能直接登录不需要密码。这是最危险的状态因为MySQL默认监听localhost端口3306局域网内的任何人都能尝试连接。所以装完第一件事就是设置root密码。mysql -uroot进入MySQL命令行后执行ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;这样root密码就设置好了。以后登录就要用mysql -uroot -p然后输入密码。2.3 mysql_secure_installation到底要不要跑安装完成后brew会提示你运行mysql_secure_installation。很多人直接跳过了我觉得没必要跳过跑一下只要一分钟。mysql_secure_installation它会依次问你几个问题是否设置密码强度校验策略、是否删除匿名用户、是否禁止root远程登录、是否删除test数据库、是否刷新权限表。我的建议是密码强度校验选“否”。MySQL 8.0默认的密码策略要求至少8位且包含大小写、数字、特殊字符开发环境设个123456它都不让太烦了。匿名用户删除选“是”。禁止root远程登录选“是”。本地开发用不到远程登录而且禁止了更安全。删除test数据库选“是”。刷新权限表选“是”。这一套下来MySQL的安全基线就差不多了。如果你后面还想改密码可以直接用ALTER USER语句不需要重跑整个流程。3. 方案二官网DMG安装包适合不用brew的人如果你不想用Homebrew或者公司电脑不方便装brew那官网DMG安装包是另一个选择。流程上比brew啰嗦一些但也没多复杂。先说明一下官方网站的下载地址是https://dev.mysql.com/downloads/mysql/打开后选择macOS系统会看到两个包.dmg和.tar.gz。二选一的话新手选.dmg因为.tar.gz是压缩包需要手动解压、移动目录、配置环境变量步骤更多。3.1 下载时选哪个包dmg还是tar.gz在官网页面里你还会看到ARM 64-bit和x86_64两种架构这个跟你的Mac芯片对应。uname -m输出arm64就选ARM版输出x86_64就选x86_64版。选错了装不上或者跑起来会提示“无法打开”。版本的优先级也提一嘴。官网会提供类似8.0.x和8.4.x的系列版本。如果你只是日常开发建议选最新的8.0.x版本生态兼容性最好。如果公司项目强制要求特定版本按项目要求来。下载完双击.dmg文件会弹出安装向导。按提示连续点击“继续”和“安装”期间可能会要求输入Mac的开机密码来授权安装。安装完成后安装器会弹出一个提示框显示一行临时密码格式类似xJ#kLp9z一定要立刻记住或者截图保存。重点这个临时密码只显示这一次关掉窗口就找不回来了。如果真丢了只能用后面的“跳过权限验证”方法重置见第5章。3.2 安装完成后的临时密码与首次登录DMG方式安装的MySQL默认会在系统偏好设置底部多出一个“MySQL”图标可以在这里启动和停止服务。首次使用建议先打开这个面板点“Start MySQL Server”启动服务。启动成功后打开终端先手动指定mysql客户端路径/usr/local/mysql/bin/mysql -uroot -p输入临时密码进入MySQL命令行。接下来必须先修改root密码否则临时密码每次重启都会变实际上不会变但为了安全必须改。执行ALTER USER rootlocalhost IDENTIFIED BY 你设置的永久密码; FLUSH PRIVILEGES;退出后用exit;再重新连接一次确认新密码生效。这里有个点值得注意DMG安装方式不会自动配置PATH环境变量。也就是说你直接在终端输入mysql -uroot -p会提示command not found。解决方法是编辑shell配置文件Apple Silicon和Intel芯片的Mac默认都用zsh编辑~/.zshrcvim ~/.zshrc在文件末尾追加一行export PATH$PATH:/usr/local/mysql/bin保存后执行source ~/.zshrc再执行mysql -uroot -p就能正常识别了。之所以是/usr/local/mysql/bin而不是/opt/homebrew/...是因为DMG安装包统一装在/usr/local/mysql与芯片架构无关。3.3 卸载DMG版MySQL比别人多走两步源码安装或DMG安装的坏处就是卸载麻烦。如果以后想卸载干净不能只把/usr/local/mysql删掉还要把配置文件、LaunchDaemon、日志都清理掉。我整理了一份卸载命令建议收藏备用sudo /usr/local/mysql/bin/mysqladmin -uroot -p shutdown sudo rm -rf /usr/local/mysql sudo rm -rf /Library/StartupItems/MySQLCOM sudo rm -rf /Library/PreferencePanes/MySQL.prefPane sudo rm -rf /Library/LaunchDaemons/com.mysql.mysql.plist sudo rm -rf /private/var/db/receipts/mysql-*.pkg其中com.mysql.mysql.plist是开机自启的服务配置文件不删除的话即使MySQL程序没了系统日志里也会残留报错。4. 装完不是结束配置与日常使用MySQL装好、密码设好之后很多人以为大功告成了。但我在实际开发中以下几个配置我觉得很有必要尽早处理否则等用到的时候再折腾容易踩坑。4.1 配置文件my.cnf建议你改这三个参数MySQL的配置文件叫my.cnfHomebrew安装在/opt/homebrew/etc/my.cnfDMG方式在/etc/my.cnf。这个文件在安装时可能并不存在需要手动创建。用vim编辑sudo vim /etc/my.cnf写入以下最基础的三项配置[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci port3306character-set-serverutf8mb4设置默认字符集为utf8mb4。为什么不用utf8因为MySQL的utf8只支持最多3个字节的字符存emoji表情就会报错Incorrect string value。utf8mb4是utf8的超集兼容所有Unicode字符是当前的标准做法。collation-serverutf8mb4_unicode_ci排序规则。ci结尾表示大小写不敏感日常查询更符合直觉。port3306默认端口除非你的3306被其他程序占用否则不用改。改完后需要重启MySQL生效brew services restart mysql如果之后发现修改没生效先检查配置文件权限和路径是否正确再确认没有第二个my.cnf文件覆盖了当前配置。可以用mysql --help | grep Default options查看配置文件读取顺序。4.2 自启动和服务管理brew services的隐藏用法Homebrew方式最大的优势是服务管理简单。常用的命令我列出来brew services list # 查看所有服务状态 brew services start mysql # 启动MySQL并设置开机自启 brew services stop mysql # 停止MySQL brew services restart mysql # 重启MySQL如果你当初没有用brew services而是用mysql.server start启动的那不建议把两种方式混用否则会在日志里看到重复启动的报错。DMG方式的开机自启依赖系统设置里的MySQL面板勾选“Start MySQL at login”即可。每次系统更新后如果发现MySQL没自动启动去系统设置里重新确认一下这个选项。4.3 图形客户端连接Workbench初体验命令行虽然是基本功但日常写SQL还是图形界面效率高。MySQL官方的Workbench是免费的下载地址在官网的Downloads页面里选择MySQL Workbench下载安装。安装后新建连接填这几个关键信息Connection Name随便起比如Local MySQLHostname127.0.0.1不要用localhost有些网络环境下localhost会被解析为IPv6地址::1而MySQL默认只监听IPv4会报Cant connect to MySQL server on ::1Port3306UsernamerootPassword点后面的Store in Keychain输入密码保存点“Test Connection”如果显示Successfully made the MySQL connection说明连接成功。如果报错多半是MySQL服务没启动、端口被占用或者密码不对。检查顺序先看服务状态brew services list再查端口lsof -i :3306最后确认密码。5. 踩坑实录连接失败、密码重置、干净卸载最后分享几个我实际遇到过的坑基本覆盖了90%的初学者问题。5.1 连接不上MySQL的排查顺序“连不上库”是最常见的问题先别慌按下面这个顺序一步步来# 1. 看服务是否在运行 brew services list # 2. 看端口是否监听 lsof -i :3306 # 3. 试着用socket连接绕开端口问题 mysql -uroot -p --socket/opt/homebrew/var/mysql/mysql.sock第一步和第二步结合看如果服务已启动但端口没监听说明配置有问题可能是端口被改成了3307或者启动时报错但brew没有显示。此时查看日志最直接的路径是tail -50 /opt/homebrew/var/mysql/*.err日志会告诉你具体报错信息比如数据目录权限不对、磁盘空间不足、配置文件语法错误等。排查完修复后再执行brew services restart mysql。5.2 忘记root密码跳过权限表重置这个场景很常见尤其是时隔几个月没碰本地MySQL密码早就忘干净了。重置思路是先让MySQL跳过权限验证启动再进去把密码改回来。具体分四步。第一步先把MySQL服务停掉brew services stop mysql第二步用--skip-grant-tables模式启动mysqld_safe --skip-grant-tables 这一步会绕过所有权限校验。需要注意这是不安全的启动方式操作过程中不要访问外网操作完立刻关掉。第三步打开新终端连接mysql -uroot因为跳过了权限验证这里不需要密码。进入MySQL后执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;第四步重启服务。先关闭mysqld_safe进程再正常启动mysqladmin shutdown brew services start mysql注意--skip-grant-tables模式下不要执行除了密码重置以外的任何操作尤其是不要Drop数据库。这个模式下没有权限控制误操作没有后悔药。5.3 想彻底卸载MySQLHomebrew版除了前面第3.3节的DMG卸载命令Homebrew版卸载更简单但也要注意清理数据。如果只是普通地brew uninstall mysql数据文件还会留在/opt/homebrew/var/mysql下次装新版MySQL时会自动沿用旧数据有时会因为版本不兼容报错。想彻底清空brew uninstall mysql rm -rf /opt/homebrew/var/mysql rm -rf /opt/homebrew/etc/my.cnf其中/opt/homebrew/var/mysql是数据目录删除后所有数据库都没了操作前记得备份。如果你之前用brew services start mysql启动过服务还需要执行一次brew services stop mysql移除LaunchAgent的注册信息。5.4 一个容易忽略的小细节端口被其他进程占用有时候MySQL启动正常但就是连不上lsof -i :3306出来一看占用端口的根本不是什么MySQL进程。这种一般是之前装过其他数据库或者某个服务把3306端口占了。解决办法是改掉冲突的端口在my.cnf里加一行port3307重启MySQL以后连接就用mysql -uroot -p -P 3307。如果非要让3306端口空出来就得找到占用进程并停掉lsof -i :3306会列出进程PID然后kill -9 PID即可。这个操作要慎重先用ps -p PID确认这是什么进程再动手。装了这么多次MySQL我的体会是大部分所谓的“安装失败”其实都是环境问题不是MySQL本身的问题。先把Homebrew或下载链路弄稳再考虑安装后面基本一路顺畅。很多年前我自己第一次在Mac上装MySQL也折腾了两三天后来把网速、权限、PATH这些问题都梳理清楚现在装一个开发环境大概十分钟就完事。熟练之后你会发现MySQL安装真没那么多玄学按部就班就不会出问题。最后再分享一个小技巧装完MySQL后立刻做一个快照备份或者记下“安装时间 版本号 配置文件改动”以后排查问题时特别好用。如果你用的是虚拟机或容器直接个快照最省事。以后遇到问题翻记录比对一下就定位到是哪次改动惹的祸排查效率翻倍。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进