简介这是一份面向Mac用户在macOS系统中安装与彻底卸载MySQL 5.7.11的操作指南适合数据库初学者、开发者和因安装失败需要清理残留的运维人员。资源详细梳理了从官网下载DMG镜像、安装时获取临时root密码、通过系统偏好设置启动服务到使用终端命令修改密码并完成登录验证的全流程同时针对难以卸载干净的痛点提供了逐条管理员命令涵盖删除启动项、偏好设置、安装记录及配置文件等关键位置。包体为1个PDF文件容量约47KB以图文或多步命令形式呈现便于对照操作。该资源已有1571人学习下载其价值在于既给出标准安装路径也整理了完整卸载命令与排错思路可帮助读者避免因残留文件导致重装失败尤其适合反复安装出错、希望一次性清理MySQL相关文件的用户参考。1. 为什么还要专门写 Mac 安装和卸载 Mysql5.7.11 的方法很多读者第一反应是都 8.0 满天飞了干嘛还折腾 5.7.11但现实里课程实验、老项目维护、生产环境版本对齐都卡在「必须本地跑一个 5.7.11」上。这个版本当年是 Mac 上 dmg 安装包最顺滑的一代可它偏偏赶上 macOS 后来几轮大版本更迭启动、权限、卸载残留全变了样。这篇笔记把从选型、安装、卸载到验证一条路走通重点写清楚哪些命令是必须的、哪些参数不能乱改、卸载后还有什么文件在悄悄占端口。无论你是刚拿到新 Mac 的学生还是要给团队写内部手册的工程师照着做都能落地。2. 装之前先分清三条路dmg、tar.gz、homebrew 哪个适合你2.1 三种安装方式的成本对比在动手前先想明白一个问题你要的是「能跑」还是「精确到 5.7.11 这个版本号」。这决定了走哪条路。官方给 Mac 用户的开源安装方式主要三种dmg 安装包、tar.gz 免安装压缩包、Homebrew。它们对安装、升级、卸载的体验差异很大直接决定你后面几个小时的心情。方式版本精确度安装难度卸载难度适合谁dmg官方 pkg能精确到 5.7.11低双击下一步中高残留多课程指定版本、一次性装好tar.gz官方二进制能精确到 5.7.11高要手动初始化中删目录即可想完全控制目录和启动方式Homebrewmysql5.7装不到精确 5.7.11低但老版本常被归档低brew 统一管只要 5.7 系列、不想管路径我自己的经验是如果你是因为某门课或某个老项目「必须 5.7.11」优先 dmg 和 tar.gz如果你只是「项目用的是 5.7我自己电脑也装个 5.7 对齐」Homebrew 更省心。但 Homebrew 有个硬边界下面单独说。2.2 dmg 和 tar.gz 的异同安装器与免安装二进制的差别dmg 方式里你双击打开后看到的是一个 pkg 安装器。它会替你把 MySQL 装到/usr/local/mysql创建mysql用户和用户组生成数据目录/usr/local/mysql/data再往/Library/LaunchDaemons/写一个启动项 plist。也就是说装完那一刻系统已经把「开机自启」这件事安排好了你不需要知道细节但卸载的时候这些细节全都要还回来。tar.gz 是免安装的二进制包解压后就能跑。它的优势是「东西放在哪你自己说了算」比如你可以放在/usr/local/mysql-5.7.11数据目录另指到别处。代价是数据目录初始化、目录所有权、PATH、开机启动全部手动来。对于不想跟 launchd 打交道的人tar.gz 反而卸载最干脆——删目录就完事。两种方式安装出来的服务端程序行为一致差别全在系统集成度上这也是为什么我一般建议新手走 dmg、老手走 tar.gz。2.3 Homebrew 路径的硬边界mysql5.7 不等于 5.7.11Homebrew 的 formula 策略是「维护每个大版本的最新小版本」。所以你执行brew install mysql5.7时拿到的是 5.7 系列里某个较新的补丁版本可能是 5.7.42 或类似版本绝不会是 5.7.11。如果你用brew install mysql5.7.11这种写法Homebrew 会直接告诉你找不到这个版本。这不是你命令敲错而是 formula 的版本策略决定的。代码里写死了 5.7.11 的行为差异、或者运维脚本里硬编码了版本路径的人走 Homebrew 注定对不上号。反过来如果你只是需要 5.7 的 SQL Mode、JSON 函数行为那 Homebrew 装出来的版本反而更安全因为 5.7.11 有一些早期的 bug 已经被后续补丁修掉了。2.4 安装前的环境体检先把上一任 MySQL 挖出来装新版本之前最怕的是旧版本没卸干净。残留的数据目录会让新实例启动时报错残留的进程会占住 3306 端口而且在 Mac 上这些错误信息经常被系统日志吞掉看起来就像安装包坏了。所以不管你是全新安装还是替换老版本先跑下面这段体检脚本。# 检查是否已存在 MySQL 程序目录 ls -ld /usr/local/mysql 2/dev/null || echo no mysql dir # 检查 3306 端口是否被占用Mac 上查端口用 lsof lsof -i:3306 || echo port 3306 is free # 检查是否有 mysqld 进程还在跑 ps aux | grep -i mysqld | grep -v grep || echo no mysqld process # 检查 Homebrew 里是否注册过 mysql 相关服务 brew services list 2/dev/null | grep -i mysql || echo no brew mysql service这段命令第一行看程序目录在不在第二行用lsof -i:3306查端口占用这在你之后排查「端口被杀」时也是同一个工具第三行查进程用grep -v grep把命令自身过滤掉第四行查 brew 服务。只要其中任意一项有输出都说明系统里还留着上一任 MySQL 的痕迹。这时候不要直接装先回到第 4 章的卸载流程清干净否则你装完连启动日志是旧的还是新的都分不清。3. 用 dmg 把 Mysql 5.7.11 装上从双击到命令行连上3.1 安装器会替你做的事和你需要自己确认的事拿到mysql-5.7.11-macos10.12-x86_64.dmg后双击挂载里面是一个 pkg 文件再双击就进入安装向导。安装过程默认一路下一步它会写入几个关键位置程序目录/usr/local/mysql、配置目录/etc/my.cnf、数据目录/usr/local/mysql/data、启动项/Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist。这里有个容易误会的点5.7.11 的安装器在安装尾声会让你看到 root 的临时密码或者把它写进数据目录下的.err日志。很多人装完习惯性直接点完成然后去终端mysql -uroot -p密码怎么输都不对就是因为没接住这个临时密码。安装完成后先别急着连客户端确认目录所有权和版本号再启动服务。3.2 启动服务并确认 mysqld 真的起来了dmg 安装包默认会注册 LaunchDaemon理论上重启后会自动启动。但如果你在安装后又去动过my.cnf或遇到过启动失败自动拉起机制可能会失效。我一般习惯手动确认一次。# 切到 MySQL 安装目录 cd /usr/local/mysql # 用 mysqld_safe 启动指定以 mysql 用户身份运行 sudo bin/mysqld_safe --usermysql # 等几秒让进程稳定下来 sleep 5 # 确认进程是否存活 ps aux | grep mysqld | grep -v grep # 确认数据目录归属owner 必须是 mysql ls -ld /usr/local/mysql/datamysqld_safe是 MySQL 官方提供的守护启动脚本它会在 mysqld 意外退出时尝试拉起对排查启动问题很有帮助。--usermysql是强制以 mysql 用户运行如果你用当前管理员用户启动数据目录里新建的文件会把所有者和权限搞乱后面会出现各种莫名的读取失败。sleep 5是因为 mysqld 启动过程中要先做 crash recovery进程不是瞬间就稳定查太早可能误判「没起来」。3.3 数据目录初始化什么情况下才需要手动做如果你用的是一台没装过 MySQL 的干净机器安装器会顺手把数据目录初始化好。但有一种情况你必须手动初始化你在安装前手动创建过/usr/local/mysql/data或者从旧机器拷过来的数据目录里是空的。此时直接启动会报Data directory is not initialized之类的错误。# 先建好目录并赋予 mysql 用户所有权 sudo mkdir -p /usr/local/mysql/data sudo chown -R mysql:mysql /usr/local/mysql/data # 执行初始化生成系统库和 root 账户 cd /usr/local/mysql sudo bin/mysqld --initialize-insecure --usermysql \ --basedir/usr/local/mysql \ --datadir/usr/local/mysql/data--initialize-insecure表示初始化一个 root 无密码的实例这是开发机最省事的做法如果你用--initialize它会给 root 生成一串随机临时密码容易弄丢。--basedir和--datadir手动指定是为了避免 pkg 安装时把路径写进配置文件你手动跑命令时又用了别的默认路径两边对不上。初始化过程会花十几秒期间终端可能没有输出等它回到提示符就说明完成了。3.4 修改 root 密码用标准 SQL 而不是 update 语句无论你是从日志里挖到临时密码还是用--initialize-insecure初始化的空密码登录后第一件事是改密码。注意 5.7.11 里mysql.user表的密码字段已经变了以前那种UPDATE mysql.user SET PasswordPASSWORD(...)的老写法在这个版本要慎用推荐用ALTER USER。# 如果是空密码初始化直接回车进 /usr/local/mysql/bin/mysql --socket/tmp/mysql.sock -uroot # 如果在日志里找到了临时密码 # /usr/local/mysql/data/*.err 里 grep temporary password # 用那个密码登录后再执行下面的改密操作 # 进入 MySQL 后执行 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourNewPass; FLUSH PRIVILEGES; EXIT;ALTER USER是 5.7 开始推荐的改密方式它能同步更新权限缓存的元数据。IDENTIFIED WITH mysql_native_password是显式指定认证插件为mysql_native_password比默认的caching_sha2_password兼容性更好老项目的连接字符串和图形客户端工具比如老版 Navicat基本都认这个。FLUSH PRIVILEGES是刷新权限缓存执行完立刻生效。如果这里报错说密码策略太弱说明validate_password插件是启用状态密码里要包含大小写字母和数字。3.5 把客户端命令装进 PATH并验证版本号服务端起来了密码也改了最后一步是把/usr/local/mysql/bin加进 PATH。Mac 现在的默认 shell 是 zsh所以改~/.zshrc如果你还在用 bash就改~/.bash_profile。这一步不做每次都得输全路径。# 把 MySQL 客户端目录追加到 PATH echo export PATH/usr/local/mysql/bin:$PATH ~/.zshrc # 让配置立即生效 source ~/.zshrc # 验证版本号确认是 5.7.11 mysql --version # 顺便测试本地 socket 连接 mysqladmin -uroot -pYourNewPass ping这里把 PATH 追加在末尾而不是开头是为了不覆盖系统自带的/usr/bin/mysql路径优先级。版本号输出里能看到Distrib 5.7.11字样确认没有装错。最后一行mysqladmin ping是检查服务端是否响应本机 socket 请求如果输出mysqld is alive说明安装链路完全通了。4. 卸载 Mysql 5.7.11从停服务到清残留4.1 停服务顺序不对等于没停干净卸载的第一个动作是停服务但停服务也有先后顺序。最规范的做法是先卸 launchd 启动项把「下次开机自动拉起」的机制关掉再手动杀当前进程。如果你只 kill 进程不卸启动项重启后 mysqld 又会被拉起来。# 第一步卸载 launchd 启动项防止重启后自动拉起 sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist # 第二步如果是 Homebrew 装的先停 brew 服务 brew services stop mysql5.7 # 第三步兜底杀当前仍在运行的 mysqld 进程 sudo pkill -f mysqld # 第四步确认 3306 端口释放 lsof -i:3306 || echo port 3306 is freelaunchctl unload后面的-w参数会把 plist 标记为禁用防止它在下次登录时重新被加载。pkill -f mysqld匹配的是完整命令行里包含 mysqld 的所有进程比pkill mysqld的匹配范围更准。最后的lsof是卸载后自查端口的固定动作确认 3306 空了再继续下一步否则后面删了文件还会出现「端口被不知名进程占着」的灵异现象。4.2 删除程序目录主目录和数据目录一起处理停完服务就可以删文件了。这里的关键问题是「数据目录要不要一起删」。/usr/local/mysql下同时装着二进制程序和data数据目录你删整个目录库里的所有数据就没了。如果没有备份需求直接删如果还想留库先mysqldump导出再删。# 删除 MySQL 主程序目录包含默认数据目录 sudo rm -rf /usr/local/mysql # 如果你还手动装过其他版本的目录一并清理 sudo rm -rf /usr/local/mysql-5.7.11 # 删除安装器写入的配置目录 sudo rm -f /etc/my.cnf sudo rm -f /etc/my.cnf.default # 再删一遍启动项文件防止 launchctl 卸载后文件还留在磁盘 sudo rm -f /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plistrm -rf在 Mac 上遇到只读目录或 SIP 保护路径时会报Operation not permitted如果报错先检查目录所有者再考虑是不是文件被 macOS 单独加了锁。my.cnf不一定存在因为 MySQL 在 Mac 上可以走默认配置但删一下更干净。启动项 plist 文件即使已经被launchctl unload文件本身还留在磁盘上这里一并删掉。4.3 清理偏好设置面板和其他垃圾文件dmg 安装器在旧版 macOS 上还会给「系统设置」装一个 MySQL 偏好设置面板路径是/Library/PreferencePanes/MySQL.prefPane。这个面板新版 macOS 里已经不能正常加载了但文件还在磁盘上每次打开系统设置都会尝试扫描它。卸载时顺手清掉。# 删除系统设置里的 MySQL 面板 sudo rm -rf /Library/PreferencePanes/MySQL.prefPane # 扫描图书馆目录下所有 mysql 相关残留 sudo find /Library -maxdepth 3 -iname *mysql* 2/dev/null # 扫描用户目录下的配置残留 find ~/Library -maxdepth 3 -iname *mysql* 2/dev/nullfind加-iname *mysql*是大小写不敏感的模糊匹配能捞出com.oracle.oss.mysql.*.plist、日志文件这类名称含 mysql 的残留。扫描结果里逐条确认是 MySQL 相关就删不确定的留着。用户目录下的~/Library里一般是客户端工具的历史连接配置比如 Sequel Pro 或 Navicat 保存的连接记录删不删不影响系统但强迫症可以一并处理。4.4 清理 Homebrew 路径符号链接和 PATH 配置如果你曾经在 Homebrew 和 dmg 之间切换过/usr/local/opt/mysql5.7、/usr/local/var/mysql这些路径也会残留。统一清理思路是brew 的归 brew手动目录的归手动目录。# 卸载 brew 管理的 mysql5.7如果装过 brew uninstall mysql5.7 brew cleanup # 删除 brew 默认的数据目录 rm -rf /usr/local/var/mysql # 检查 PATH 里的 mysql 路径配置 grep -n mysql ~/.zshrc # 编辑 ~/.zshrc将第 3 章添加的 export 行删掉brew uninstall只删 brew 管理的文件/usr/local/var/mysql是 brew 安装方式下 mysqld 默认初始化数据的位置不删的话下次装别的版本会误认这个目录。最后用grep -n找到~/.zshrc里加过的 PATH 行手动编辑删除。卸载最后清 PATH 是很容易漏的一步因为它不影响「MySQL 能不能跑」但会让终端提示符每次都报一遍command not found。5. 安装与卸载中最容易翻车的五个坑5.1 root 密码找不到进不了控制台现象安装完成后第一次执行mysql -uroot -p输入空密码、安装器弹窗里的密码全都返回Access denied for user rootlocalhost。原因5.7.11 安装器初始化时会为 root 生成随机临时密码这个密码写进数据目录下*.err日志文件中安装界面展示过一次之后就不会再出现。很多人没意识到要去看日志。解决在终端执行cat /usr/local/mysql/data/*.err | grep -i temporary password日志里temporary password is generated for rootlocalhost: 一串字符这行就是。用这个临时密码登录然后立刻执行第 3.4 节的ALTER USER改成自己的密码。如果你是手动初始化的实例可以直接用--initialize-insecure生成空密码省去这个麻烦。5.2 卸载后 3306 端口仍然被占用现象旧的 MySQL 已经删了但新装的 MySQL 或本地 Web 服务启动时报Address already in uselsof -i:3306显示端口被一个 PID 占着。原因卸载时只删了文件没有彻底停掉还在运行的 mysqld 进程。更隐蔽的情况是launchd 启动项没卸载系统在你 delete 后将它自动重新拉起。解决先lsof -i:3306拿到占用端口的 PID再sudo kill -9 PID如果进程被杀后几秒又出现说明是 launchd 在拉起必须回到第 4.1 节先把/Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist卸载。杀完端口还不释放就检查是否有进程处于TIME_WAIT状态等它自然超时或者换端口验证。5.3 rm -rf 删不掉 /usr/local/mysql提示权限不足现象执行sudo rm -rf /usr/local/mysql后终端提示Operation not permitted或者目录删了一半就报错。尤其在较新的 macOS 版本上/usr/local的管理策略有所收紧安装器创建的_mysql用户和当前管理员用户之间的所有权关系会导致普通删除失败。原因mysql用户或_mysql拥有/usr/local/mysql下的大部分文件管理员用户虽然有 sudo 权限但在部分文件被系统标记了特殊标志位时rm命令会被直接拒绝。这与 macOS 的系统完整性保护有关尤其当路径被纳入受保护范围时。解决先执行ls -lOe /usr/local/mysql查看文件标志位。如果带restricted或uchg标志先sudo chflags -R nouchg,norestricted /usr/local/mysql清除标志位再执行sudo rm -rf。如果提示目录所有权问题先sudo chown -R $(whoami) /usr/local/mysql把所有权转给当前用户后再删。5.4 Homebrew 提示 mysql5.7 已被归档装不上现象执行brew install mysql5.7Homebrew 返回类似mysql5.7 has been archived的信息或者直接提示Error: No available formula安装失败。原因Homebrew 对不再维护的旧版本 formula 会做归档处理新版本 Homebrew 默认源里不再保留这些版本。这个问题在 Apple Silicon Mac 上尤其常见因为 mysql5.7 早期的构建脚本对 arm64 架构支持不完整。解决如果只是想要一个能跑的 5.7 系列试试brew install mysql5.7 --force强制 Homebrew 去归档源里找。要是仍然失败就别在 brew 上耗时间直接用第 3 章的 dmg 安装或 tar.gz 解压反正mysqld二进制在 Intel 和 Apple Silicon 上都有官方构建。这里要有预期Homebrew 擅长管新版本老版本考古不如手动装。5.5 升级 macOS 后旧 MySQL 实例起不来现象系统升级到新版本 macOS 后MySQL 服务启动失败日志里出现Cant open the mysql.plugin table或Permission denied用brew services start mysql5.7也报错。原因macOS 升级过程中会重置部分目录的权限和所有权/usr/local/mysql/data下的文件如果原本属于mysql用户升级后可能被改写为root或其他用户mysqld 启动时因为无法读取数据目录而崩溃。另外5.7.11 对 macOS 版本的兼容性本来就有限新版系统对临时目录的路径策略也会影响/tmp/mysql.sock的创建。解决先执行sudo chown -R mysql:mysql /usr/local/mysql/data修复数据目录所有权。再检查/etc/my.cnf中socket参数指向的路径是否存在且可写。如果数据目录没问题还起不来去日志*.err里看具体报错不要凭经验改配置。实在折腾不动的导出数据目录备份后重装5.7.11 的数据目录和安装位置在 macOS 上绑定得比较紧。6. 装完和卸载完怎么确认系统真的干净了验证这件事我习惯用三个维度同时看。查进程看有没有 mysqld 在跑查端口看 3306 有没有监听查文件看目录和配置是否残留。一套命令走下来干净不干净一目了然。# 维度一进程确认没有 mysqld 存活 ps aux | grep -i mysqld | grep -v grep # 维度二端口确认 3306 没有监听 lsof -i:3306 # 维度三文件确认主目录和配置文件已被删除 ls -ld /usr/local/mysql /etc/my.cnf /etc/my.cnf.default 2/dev/null这三条命令安装前后都可以跑。安装前跑是为了确认环境干净安装后跑是确认服务正常监听卸载后跑是确认没有遗留进程占用端口。只要三行全部没有输出系统里就真的没有 MySQL 了。如果 lsof 没输出但 ps 有输出说明进程还没死透反过来 ps 没输出但 lsof 有输出说明端口被别的程序占了需要进一步排查。日常切换 MySQL 版本时我还有一个习惯数据目录严格分开。dmg 装的 5.7.11 用/usr/local/mysql/dataHomebrew 装的 8.0 用/usr/local/var/mysql两边互不干扰。连接客户端时用 alias 区分# 在 ~/.zshrc 里定义别名避免每次输全路径 alias mysql57/usr/local/mysql/bin/mysql alias mysql80/opt/homebrew/opt/mysql8.0/bin/mysql切换版本前先brew services stop mysql8.0再mysql57 -uroot -p连另一边端口只要错开就不会打架。这个习惯帮我少踩了很多「两个版本抢数据目录」的坑也让我在同事说「删干净了但端口还占着」的时候能一眼帮他找到还挂着的进程。卸载这事看起来简单实际上删一半留一半才是最难受的。MySQL 在 Mac 上的安装路径分散在启动项、偏好面板、配置目录和数据目录里少删一个下次装新版就会被旧配置带偏。我的教训是动手之前先把第 4 章的清理清单从头到尾读一遍删完再用第 6 章的三条命令验证一次。希望你装也好、卸也好都一次干净利落不返工。本文还有配套的精品资源点击获取