ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL安装卸载全指南:Windows/Linux/macOS避坑实战

MySQL安装卸载全指南:Windows/Linux/macOS避坑实战 安装MySQL这个事看着简单实际上栽跟头的人真不少。尤其是有几年经验的开发或运维换新电脑、部署新服务器十次里有八次要卡在“服务起不来”“root连不上”“卸载后重装失败”这老三样上。很多教程只告诉你“点下一步、点完成”但从来不解释为什么别人的电脑能跑通你的电脑就报错。这篇东西我不打算写成一章式的安装手册而是把Windows、Linux、macOS三个平台的安装和卸载逐个拆开讲把背后的机制、容易踩的坑、以及我踩过之后才明白的道理都说清楚。无论你是刚接触MySQL的新手还是要给服务器做环境迁移的老手照着这篇文章的思路走能省下大把排查时间。1. 先想清楚装哪个版本、用哪种方式1.1 版本选择8.0和5.7差了不止一个数字很多人的第一个误区就是“随便装个最新版”。MySQL 8.0是现在的长期支持版本5.7虽然还在用但已经进入EOL停止维护阶段官方不再提供常规更新。如果你在2023年以后新部署环境我建议一律选择8.0.x的GA版本不要用5.7。原因不只是性能提升更重要的是8.0默认的密码插件改成了caching_sha2_password这玩意直接影响你后面能不能用Navicat、DBeaver这些GUI工具连上数据库。很多新手装完8.0之后说“密码明明对了但连接报错”八成是碰到了这个加密插件的兼容性问题这个细节我后面专门讲。如果你是在老项目里做维护需要保持和线上一致的版本那5.7也完全能用。但安装时要注意5.7和8.0的初始化过程不一样5.7用mysqld --initialize生成临时密码8.0虽然也可以用--initialize但更推荐用--initialize-insecure先免密进入再马上改密码。我见过好多人在5.7上用--initialize后满屏找那个日志里的临时密码其实那个密码经常藏在/var/log/mysql/error.log或者Windows的data目录下的.err文件里找不到就疯了。这里我的建议是开发环境直接用--initialize-insecure后面自己用ALTER USER改密码省事得多生产环境才需要用--initialize把随机密码打印到日志里提高安全性。1.2 安装包形态zip、msi、rpm、tar.gz怎么选MySQL官方给不同平台提供了好几种安装包这是大多数人第一次迷惑的地方。以Windows为例有.msi图形安装包、有.zip免安装压缩包Linux下有.rpm、.deb还有通用二进制包.tar.gz。它们没有本质好坏只分场景。.msi适合个人电脑它会自动帮你注册Windows服务、创建初始配置文件图形化界面点几下就好对新手最友好。但缺点是它会在系统里装一堆你用不上的组件比如MySQL Installer、MySQL Router、MySQL Workbench而且卸载并不干净。.zip模式则是我个人最推荐的尤其是自己办公的机器解压、改配置、初始化、注册服务全程可控出了问题也知道去哪找卸载时直接删目录加删服务就行。很多人说zip方式“太麻烦”其实只是每一步都糊里糊涂搞明白了之后五分钟能装完。Linux下rpm和deb的优势是用包管理器来做依赖管理、升级和卸载比如yum install mysql-server一条命令搞定。但要注意发行版自带的MySQL源往往版本很旧尤其CentOS 7默认给的是5.6甚至更老所以更推荐用MySQL官方提供的Yum/Apt仓库把官方仓库地址配好之后装出来就是8.0。通用二进制包.tar.gz适合那种没有root权限、需要装到自定义目录的场景但这种方式需要你自己搞定ld配置、systemd服务文件比较折腾新手不建议碰。1.3 平台差异Windows/Linux/macOS的“安装逻辑”完全不一样一个很重要但不常有人讲的点三个平台安装MySQL的难度差异不在于MySQL本身而在于操作系统的服务管理机制。Windows下MySQL是一个Windows服务用net start mysql或sc命令控制启停安装服务的核心命令是mysqld --install。Linux下MySQL通常由systemd管理systemctl start mysqld、systemctl enable mysqld设置开机启动安装包内部自带mysqld.service文件。macOS用Homebrew安装时brew会提示你用brew services start mysql来注册LaunchAgent也可以手动用mysql.server start临时启动。看不懂这些区别就会反复出现“我明明启动了但系统说没有”“我点了安装但服务列表里没有MySQL”“重启电脑又连不上”之类的困惑。本质上你是在跟操作系统打交道不是在跟MySQL打交道。理解了这一点后面所有操作都会变得顺畅很多。2. Windows平台从零安装到服务可用2.1 zip免安装版的核心步骤附my.ini模板我这里直接给出Windows下zip方式最稳的一条路。先从MySQL官网下载mysql-8.0.x-winx64.zip找Windows (x86, 64-bit), ZIP Archive那个包就行不用管带不带Debug字样。解压到比如C:\mysql-8.0.36-winx64这个目录就是你的basedir。下一步在解压目录里新建一个my.ini配置文件注意不是my.cnfWindows下叫my.ini。下面是我一直在用的模板适合开发机可以直接抄[mysqld] # 基础路径 basedirC:/mysql-8.0.36-winx64 datadirC:/mysql-8.0.36-winx64/data # 端口与连接 port3306 bind-address0.0.0.0 max_connections200 # 字符集强烈建议utf8mb4 character-set-serverutf8mb4 collation-serverutf8mb4_general_ci # 默认存储引擎 default-storage-engineInnoDB # 跳过权限验证仅在重置密码时临时开启用完必须关掉 # skip-grant-tables [client] default-character-setutf8mb4 [mysql] default-character-setutf8mb4这里注意几个细节。第一basedir和datadir里的路径分隔符建议用正斜杠/虽然Windows也能识别反斜杠\但在配置文件里反斜杠容易因为转义问题出幺蛾子。第二collation-server我选的是utf8mb4_general_ci而没有选8.0默认的utf8mb4_0900_ai_ci简单说就是为了老客户端兼容和排序习惯。如果你用的是Navicat 15以前的老版本默认的utf8mb4_0900_ai_ci可能会让部分字符判断出现异常。第三max_connections不要上来就设成1000MySQL在Windows上每个连接都要消耗线程资源200是开发环境比较稳妥的数字。2.2 初始化与服务安装两条命令解决90%问题配置文件写完之后以管理员身份打开PowerShell或CMD先切到MySQL的解压目录然后执行下面的命令cd C:\mysql-8.0.36-winx64 mysqld --initialize-insecure--initialize-insecure的意思是初始化数据目录也就是创建data文件夹和系统表并且让root用户暂时没有密码。这一步做完你的datadir里会生成一堆文件包括mysql、performance_schema、sys这些系统数据库。接着注册Windows服务并启动mysqld --install mysql net start mysql--install mysql后面的mysql是服务名可以改成任意名字比如mysql80。如果你之前装过MySQL并卸载不干净报“服务名无效”或“服务已存在”那就需要先删服务再安装sc delete mysql mysqld --install mysql启动成功之后用mysql -u root进入命令行此时不需要密码然后立刻改密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;这里多说一句8.0的root用户默认只允许从localhost连接。如果你要远程访问需要另建用户或者改root的host字段后面再细说。2.3 让MySQL开机自启和手动启停的实操细节不用额外配置mysqld --install注册的服务默认是“自动”启动类型Windows开机时服务管理器会自动拉起MySQL。如果你不希望它开机自启可以手动把服务改成“手动”或者在CMD里执行sc config mysql start demand注意start后面必须有个空格这是sc命令的一个老坑少了空格就是语法错误。想完全停掉服务用net stop mysql但“停止”和“卸载”是两回事卸载意味着删掉服务注册信息和程序文件停止只是临时不跑。如果你在Windows上遇到“服务启动后又自动停止”的情况最常见的两个原因是my.ini里的datadir路径不对或者data目录权限不足。我建议先看data目录下生成的计算机名.err日志里面会直接告诉你“unknown variable”或“failed to open directory”这样的具体错误。很多人在这一步反复重启机器其实看日志三分钟就能定位。3. Linux平台rpm与apt的安装和彻底卸载3.1 安装官方仓库 vs 发行版自带源Linux下装MySQL最忌讳直接用发行版自带的源比如CentOS的base源里的mysql、Ubuntu源里的mysql-server因为这些源为了保证稳定性版本往往落后很多年。比如在Ubuntu 20.04里apt install mysql-server装的是8.0但配置比较旧在CentOS 7里yum install mysql-server甚至会装到MariaDB而不是MySQL因为RedHat系把MySQL替换成了MariaDB作为默认的兼容实现。如果你确定要装MySQL优先走官方仓库。以CentOS/RHEL为例先装官方仓库包rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm装完之后直接yum install mysql-community-server装出来的就是官方构建的MySQL 8.0。Ubuntu/Debian则是用dpkg -i安装官方提供的.deb仓库包然后apt update apt install mysql-server。这里有个很多人忽略的事装了官方仓库之后系统里mysql命令默认指向的是/usr/bin/mysql还是/usr/local/mysql/bin/mysql其实是跟包的路径走的。官方rpm包装出来二进制在/usr/sbin/mysqld客户端在/usr/bin/mysql服务管理还是走systemd的mysqld.service。启动命令统一为systemctl start mysqld systemctl enable mysqld首次启动后root密码会自动生成并写到/var/log/mysqld.log里用grep temporary password /var/log/mysqld.log看一下就能拿到。然后用这个密码登录强制改密。如果你忘了看日志直接重启服务再来一遍也行。3.2 卸载为什么删了包还是会残留Linux卸载MySQL比安装更容易出问题。很多人yum remove mysql-server之后发现再用mysql命令还有输出或/etc/my.cnf还在甚至重装的时候提示“MySQL configuration file already exists”这就是卸载不彻底。根本原因在于rpm/deb包只负责删除它自己打包进去的文件而MySQL运行时生成的数据文件、配置目录、日志文件、pid文件以及服务自启的systemd单元是在安装之后由程序自己创建的包管理器根本不管。工程的类比就是你把房子主体拆了但地基、化粪池、石板路都还留在原地。所以完整卸载必须先停服务、再删包、最后手动清理残留目录。建议按这个顺序操作systemctl stop mysqld yum remove -y mysql-community-server mysql-community-client mysql-community-common mysql-community-libs rm -rf /var/lib/mysql rm -rf /etc/my.cnf /etc/my.cnf.d rm -rf /var/log/mysql /var/log/mysqld.log rm -rf /usr/share/mysql rm -rf /tmp/mysql.sock /tmp/mysql.sock.lockUbuntu/Debian系用apt purge mysql-server可以连配置文件一起清掉但/var/lib/mysql数据目录默认还是会保留需要手动删。3.3 彻底卸载清单目录、配置、日志一个都不留判断一台Linux机器上MySQL是否卸载干净我习惯用三条命令which mysql mysqld rpm -qa | grep -i mysql find / -name *mysql* -type d 2/dev/null第一条看命令是否还在PATH里第二条看rpm列表里是否还有mysql相关包第三条把系统里所有名字带mysql的目录都列出来。最后一条可能输出很多但重点看/var/lib/mysql、/etc/mysql、/usr/local/mysql、/opt/mysql这几个位置。有一个容易被忽视的残留是/etc/ld.so.conf.d/mysql.conf或者/etc/profile.d/mysql.sh它们会把MySQL的库路径和PATH写进系统环境。删包时这两个文件不会被动到导致卸载后执行mysql还是能找到某个路径下的二进制。处理方法是手动删除文件并执行ldconfig刷新库缓存。Ubuntu的“显卡驱动卸载不掉”这类问题本质也是同一回事系统里软件卸载的语义从来都不等于删除所有相关文件。掌握“先停服务-删包-清理残留-刷新缓存”这套流程不管卸载什么软件思路都是通用的。只是MySQL因为涉及数据目录和安全配置残留危害更明显下一次安装多半会初始化失败。4. macOS平台Homebrew安装与卸载残留处理4.1 用brew安装MySQL的正确姿势macOS下装MySQL最主流的方式是Homebrew命令很简单brew install mysql它通常会装最新版MySQL 8.0依赖包比如openssl、protobuf也会一并处理。装完之后brew会提示两种启动方式用brew services start mysql后台常驻开机自启或者用mysql.server start临时启动重启失效。我个人建议开发机用brew services start mysql省心。但注意brew services的原理是在~/Library/LaunchAgents目录下生成一个homebrew.mxcl.mysql.plist文件这个文件才是真正让macOS自动拉起MySQL的LaunchAgent。如果你不想要开机自启除了brew services stop mysql最好把那个plist文件也删掉否则重新加载service的时候它还会出现。macOS下MySQL的配置文件位置跟Linux不同默认是/usr/local/etc/my.cnfIntel芯片或/opt/homebrew/etc/my.cnfApple Silicon。如果你要对字符集、端口做修改直接编辑这个文件就行不用像Windows那样自己建。数据目录则在/usr/local/var/mysql或/opt/homebrew/var/mysql。4.2 卸载后残留文件都藏在哪里附排查命令我用Homebrew卸载MySQL时踩过一次很大的坑brew uninstall mysql执行完后端口3306竟然还有进程在监听一查发现是之前brew services start mysql生成的LaunchAgent还在起作用MySQL被自动拉起了即使二进制都没了系统还是报错。这个情况和Windows的“卸载了服务但服务项还在”是同一个套路。macOS彻底卸载MySQL的清理路径我整理如下brew uninstall mysql brew cleanup # 删除数据目录最重要的一步 rm -rf /usr/local/var/mysql # 删除配置文件 rm -f /usr/local/etc/my.cnf # 删除LaunchAgent如果你用过brew services rm -f ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist # 删除Mysql官方dmg方式可能留下的目录如果之前用过dmg安装包 rm -rf /usr/local/mysql rm -rf /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist如果系统提示“No such file or directory”不代表清理完成而是路径不对。Apple Silicon机器上要把/usr/local换成/opt/homebrew。用lsof -i :3306查看端口占用是验证是否清理干净的最直接方法。4.3 一个小技巧手动管理LaunchAgent避免开机自启如果你不希望MySQL常驻后台、只想在需要时手动启动可以用一个绕开brew services的办法直接用mysql.server start启动用完再mysql.server stop。mysql.server脚本在/usr/local/opt/mysql/bin下它本质上调用的是mysqld_safe好处是启动日志会显示在终端出了问题能立刻看到。但mysql.server有一个坑如果你之前用brew services start mysql设置过自启再手动mysql.server start时可能被LaunchAgent抢先拉起导致双实例冲突。解决方法是先执行brew services stop mysql并删掉plist文件然后再手动管理。这里的经验是同一台机器上只保留一种启停方式不要混用。我在之前处理“Homebrew卸载残留”的问题时发现好多用户反复卸载不干净就是因为在brew services和手动启动之间来回切换系统里留下了多个控制入口。5. 装好之后最容易踩的坑连接、密码与字符集5.1 1045与2059root密码和加密插件问题安装成功后你先碰到的多半是连接问题。错误码1045“Access denied for user root”是密码没配对处理办法是确认密码、或者用skip-grant-tables跳过权限验证重置密码。在Windows下你可以在my.ini的[mysqld]段临时加一行skip-grant-tables然后重启服务再用mysql -u root无密码进入执行完修改后再删掉这行并重启。而错误码2059就麻烦一些它只在MySQL 8.0上出现报错内容大概是“Authentication plugin caching_sha2_password cannot be loaded”。这是因为8.0默认的密码插件是caching_sha2_password而老版本的Navicat、DBeaver或一些旧驱动比如PHP 7.1之前的pdo_mysql只支持mysql_native_password。解决方法是把用户的插件改回老的ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;但我不建议一刀切全改回去因为8.0的高安全密码插件在很多场景下是有意义的。更合理的做法是新开发项目用最新版工具根本不会触碰2059老项目必须用老客户端时就只把连接用的那个账号改成mysql_native_password不影响服务端整体安全性。5.2 SSL连接错误多半不是证书问题MySQL 8.0默认是开启SSL传输的客户端也可以不指定SSL要求进行普通连接。但有些场景下连接会报SSL connection error: unknown error number或者ERROR 2026 (HY000): SSL connection error。遇到这个很多人第一反应是证书没配好其实八成不是。常见原因有三个一是系统时间离标准时间偏差太大导致SSL证书校验失败尤其虚拟机里时间漂移后最容易出现二是客户端连接串里写了sslmodeREQUIRED但服务端没有正确启用SSL或者使用的是自签名证书但客户端没有信任三是服务器的主机名和证书中的CN不匹配如果你用了自己的证书。排查思路是先用命令行不加密方式连接试试mysql --ssl-modeDISABLED -u root -p如果这样能连上说明网络和密码都没问题问题集中在SSL参数上。开发环境时间不同步的用NTP同步时间后重试连接串里强制SSL的去掉sslmodeREQUIRED或改为PREFERRED。如果你还想保留SSL安全就为服务器配置正确的证书并把CA证书加入客户端的信任列表。5.3 utf8mb4与排序中文乱码的根源“数据库增删改查”看着正常但一插入中文、一排序就乱了这是很多人装完MySQL后遇到的另一座山。核心原因在于字符集。MySQL 8.0默认字符集已经是utf8mb4了但如果你在配置阶段没有显式指定并且创建数据库和表时沿用了老默认可能出现utf8mb3也就是以前所谓的utf8而utf8mb3存不了emoji和一些扩展字符。强烈建议在建库时就指定CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;泛谈排序时中文按拼音排序在MySQL里默认是不准确的一系列问题本质上是排序规则collation的选择。utf8mb4_general_ci是老的通用排序比较宽松性能较好utf8mb4_0900_ai_ci是8.0新增的基于Unicode 9.0更规范。对中文场景如果单纯按二进制比较utf8mb4_0900_ai_ci在处理一些特殊字符时更符合直觉但如果你的业务历史表都建在了general_ci下也不要贸然切换排序规则因为索引排序的顺序会被打乱可能导致部分查询结果不同。6. 常见问题排查与速查表6.1 服务起不来、端口被占用这类启动故障排错的第一步永远是看日志不要瞎猜。Windows看data目录下的.err文件Linux看/var/log/mysqld.logmacOS看/usr/local/var/mysql/*.err。日志的关键字段其实就几个unknown variable配置文件里写了个不认识的参数、Cant create/write to file权限问题、[ERROR] Aborting初始化或启动中途失败、port相关端口被占用。端口被占用的排查方式Windows下用netstat -ano | findstr 3306Linux/macOS用lsof -i :3306。如果发现另一个MySQL实例或其它应用占着3306要么改新实例的port要么先干掉占用进程。开发机上常有老版本的MySQL服务还开着新版本起不来就是端口冲突。如果你改了my.ini之后服务启动失败很多情况下是配置文件里写了错误参数。验一招直接在命令行前台运行mysqld --console不用服务方式让MySQL把错误直接打在屏幕上定位会比翻日志快得多。6.2 工具连接故障Navicat、命令行、连接池命令行能连、GUI工具连不上这种分裂现象很常见原因多出在工具默认配置上。Navicat连不上8.0优先排查2059密码插件问题解法参考5.1节。新版Navicat基本没这个问题老版本要么升级、要么给账号改回mysql_native_password。连接池报错时常见信息是“Could not create connection to database server”或“Communications link failure”。这类问题十有八九不是MySQL本身故障而是连接池配置和MySQL的wait_timeout、max_connections不相匹配。比如数据库空闲连接超过8小时被服务端断开连接池不知道还在一直用就会抛异常。解决思路是让连接池测试空闲连接如配置testOnBorrow为true或设置maxLifetime小于MySQL的wait_timeout同时把max_connections调大到并发峰值别让“Too many connections”出现。# 查询当前连接数和上限 SHOW VARIABLES LIKE max_connections; SHOW STATUS LIKE Threads_connected;6.3 我踩过的坑与最后的建议安装卸载这件事做到最后本质上考的是对操作系统机制的理解不是对MySQL的理解。我印象最深的一次是帮同事排查一台CentOS服务器MySQL启动报错翻日志找到Cant open the mysql.plugin table后来发现是上次卸载时把/var/lib/mysql删了但这次装的是同一个版本数据目录虽然会自动重建系统表却没有正确导入最后靠mysqld --initialize重建才解决。如果你只是自己学习用我的建议是用官方Docker镜像跑MySQL连安装卸载都省了docker run -e MYSQL_ROOT_PASSWORD... -d mysql:8.0一条命令搞定。但如果你在服务器环境或者离线环境又不想用Docker那静态zip/rpm安装和以此为基础的卸载流程依然是你必须掌握的基本功。还有个小技巧值得分享在任何一个平台安装前先执行mysqld --version确认系统中是不是有旧版本卸载后用find扫一遍相关目录再开始装新的。磨刀不误砍柴工能避免80%的“重装还报错”。祝装库顺利SDK别崩别成为“又卡在安装第一步”的那个人。
返回列表