MySQL安装配置全攻略:Windows/Linux双平台实战指南
装MySQL这件事说难不难说容易新手很容易在各种报错上卡一两个小时。我这些年给同事救过无数次火从Windows到Linux从MSI安装到ZIP免安装从在线yum到离线rpm几乎每种装法都踩过坑最离谱的一次是服务装好了结果死活连不上查了半天是配置文件里的路径写错了一个字母。这篇文章我把自己实际用过的安装配置流程完整整理出来覆盖Windows和Linux两个平台的常见装法以及初始化配置、远程访问、故障排查这些后续步骤目标是让一个从没装过MySQL的人照着操作也能顺顺利利把服务跑起来。1. 装之前先想清楚几个问题1.1 版本选择为什么我建议直接上 8.0很多人还在纠结装5.7还是8.0我的建议很直接没有特殊兼容性要求直接装8.0。原因有几个第一8.0的默认字符集就是utf8mb4不用像5.7那样还得手动改配置这是很多乱码问题的根源第二8.0对查询优化器做了大量改进执行计划的稳定性明显好于5.7很多慢查询在升级之后会有明显改善第三8.0支持窗口函数、公共表表达式WITH语句这些现代SQL特性日常写报表或者做数据统计会方便很多。唯一要留意的场景是如果你的项目依赖一些特定版本的ORM框架或老旧驱动可能对8.0的默认认证插件caching_sha2_password兼容不好。这个问题在后续章节会讲到其实有很简单的解决办法并不构成拒绝8.0的理由。1.2 官网下载的正确姿势MySQL的官方下载页面在dev.mysql.com/downloads/mysql/页面上有两个大区一个是MySQL Community Server也就是我们常用的开源免费版另一个是MySQL Enterprise商业付费版一般不用管。在Community Server里选择操作系统时Windows直接选Windows (x86, 64-bit), ZIP Archive即可Linux可以选对应发行版的RPM Bundle或者直接下载通用的Linux Generic。这里提醒一下新手别下载带debug后缀的包。曾经就有同事图省事直接点了页面上最大的那个按钮装完发现是带调试符号的版本性能和稳定性都差不少。正确做法是认准“MySQL Community Server 8.0.x GA”字样GA代表稳定版另外留意版本数字后面带rc字样的是Release Candidate候选版别在生产环境用。1.3 安装方式怎么选Windows平台有两种主流装法MSI安装包和ZIP免安装版。MSI方式有图形界面适合一次点点点就完事ZIP方式更灵活适合需要在多台机器上快速部署、或者想自定义安装路径的情况我个人其实更推荐ZIP主要原因是好卸载、好迁移换个目录改下配置就能用。Linux平台则分为在线安装和离线安装两类。在线安装用yum或apt配合官方源优点是自动处理依赖离线安装适合内网环境或者源访问速度不佳的情况优点是可控性强缺点是依赖关系需要自己理清。我会分别给出完整步骤大家按自己环境挑一个用就行。2. Windows安装MSI与ZIP两种装法2.1 MSI安装包方式MSI方式比较简单我简单说一下关键节点。运行安装程序之后第一步会问选择安装类型有Developer Default、Server Only、Full等几个选项。如果你只是装个数据库用来学习和开发选Server Only就行能少装一堆用不上的组件。接下来选择安装路径建议和数据目录分开比如程序装在D:\MySQL\数据目录单独指定在D:\MySQLData\这样后续备份数据、重装系统都方便很多。中间有个步骤会要求设置Root密码和认证方式默认推荐Use Strong Password Encryption这个选项对应的就是8.0默认的caching_sha2_password认证插件如果后续要用老版本工具连接可以选Legacy Authentication。设置完密码后会有一个配置Windows Service的页面建议把服务名改成MySQL80这种有辨识度的名字并勾选Start at System Startup之后开机自启就不用管了。整个过程有图形界面兜着出错概率不高大多数问题反而出在ZIP装法上。2.2 ZIP免安装版配置流程ZIP装法是我在Windows上最常用的方式步骤看着多一点但每一步都可以复现。先把下载的mysql-8.0.x-winx64.zip解压到目标目录比如D:\mysql-8.0.x-winx64。解压之后不要急着启动先在解压目录下创建一个my.ini配置文件[mysqld] basedirD:/mysql-8.0.x-winx64 datadirD:/mysql-8.0.x-winx64/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections200这里有几个细节要注意。第一路径分隔符建议用正斜杠/虽然在Windows里反斜杠也能用但在INI文件里如果写成反斜杠某些情况下会被转义解析新手很容易在这里埋坑。第二datadir指向的data目录不用提前创建初始化命令会自动生成但你要保证basedir目录本身有写入权限。第三port默认是3306如果你本机已经有别的数据库占了3306就先改成3307之类的端口免得后面服务起不来。2.3 初始化数据目录与服务注册配置文件就位之后以管理员身份打开命令提示符Windows下强烈建议用管理员的PowerShell或者Cmd否则后面几个命令都会失败。然后进入bin目录执行初始化命令cd /d D:\mysql-8.0.x-winx64\bin mysqld --initialize-insecure这条命令会在数据目录生成一套完整的系统表--initialize-insecure参数的含义是root账号初始密码为空方便我们第一次登录后自己设置密码。对应的如果去掉insecure也就是直接执行mysqld --initialize系统会生成一个随机临时密码并写进错误日志文件需要自己去data目录下找.err日志才能拿到。我给新手的建议是用--initialize-insecure省去翻日志这一步反正本地测试环境密码本来就该立刻改。初始化完成之后把MySQL注册成Windows服务mysqld --install MySQL80这里有一点非常关键服务名是你自己指定的后面net start时用的名字必须和这里保持一致。如果你执行的是mysqld --install MySQL80那就应该运行net start MySQL80而不是net start mysql。可能有部分教程里用的服务名就是mysql所以不少人跟着教程抄最后发现服务不存在其实就是服务名没对上。注册成功后启动服务net start MySQL80看到服务启动成功的提示后用下面命令登录mysql -u root -p因为初始密码为空提示输入密码时直接回车就行。进去之后第一件事就是改密码SQL如下ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;到这里ZIP装法的核心流程就全部走通了。后续如果想把bin目录加入系统环境变量可以在系统属性的Path里追加D:\mysql-8.0.x-winx64\bin这样以后在任何路径下都能直接敲mysql、mysqldump这些命令。3. Linux安装在线源与离线RPM都能搞定3.1 CentOS/RHEL系列在线安装在CentOS上装MySQL最规范的做法是先添加MySQL官方软件源再通过yum安装。系统自带的AppStream源里虽然也有mysql但版本往往是老版本或者MariaDB分支不建议直接用。官方源的安装方法是在官网找到对应系统的yum repository rpm包地址然后执行yum install -y https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm注意链接里的el9要换成你系统实际的版本比如CentOS 7用el7CentOS 8用el8Rocky Linux 9用el9。安好源之后直接yum install -y mysql-community-server这会把server、client、common、libs等一系列组件一次装齐依赖关系由yum自动解决省心很多。如果你所在网络访问官方源比较慢可以把repo文件里的baseurl换成国内镜像源比如清华、阿里云的MySQL镜像路径操作方式大同小异这里就不展开了。安装完成后启动服务systemctl start mysqld systemctl enable mysqldCentOS/RHEL上用rpm方式安装的MySQL初始root密码不会为空而是随机生成的一个临时密码记录在日志文件里。用下面命令取出来grep temporary password /var/log/mysqld.log执行结果会输出类似2024-01-01T12:00:00.000000Z 8 [Note] A temporary password is generated for rootlocalhost: xxxxxxxx这样一行冒号后面的就是临时密码。用这个密码登录后系统会强制要求先修改密码才能继续操作执行ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;3.2 Ubuntu/Debian系列在线安装Ubuntu上官方推荐用apt源方式安装。先下载并安装MySQL官方提供的apt配置包wget https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb dpkg -i mysql-apt-config_0.8.29-1_all.deb安装过程中会弹出一个图形化配置界面选择MySQL Server版本通常默认选8.0即可。配置完成后更新本地包索引apt update然后安装apt install -y mysql-serverUbuntu安装器在安装过程中一般会直接弹窗要求设置root密码这个交互体验比CentOS好很多不需要去翻临时密码。装完启动服务systemctl start mysql systemctl enable mysql这里注意一下服务名Ubuntu上MySQL服务不叫mysqld而是mysql和CentOS的习惯不一样systemctl操作时别写错了。3.3 离线RPM安装顺序如果需要离线安装也就是没有外网或者网速很差的环境可以用RPM Bundle离线包。到官网下载mysql-8.0.x-1.el9.x86_64.rpm-bundle.tar解压出多个rpm文件。这里最大的坑是依赖顺序我建议按这个顺序装rpm -ivh mysql-community-common-8.0.x-1.el9.x86_64.rpm rpm -ivh mysql-community-libs-8.0.x-1.el9.x86_64.rpm rpm -ivh mysql-community-client-8.0.x-1.el9.x86_64.rpm rpm -ivh mysql-community-server-8.0.x-1.el9.x86_64.rpm先装common再装libs因为libs依赖common然后client最后server。顺序反了会提示缺少依赖某些教程喜欢把libs和libs-compat一起装如果你的系统以前装过MariaDB经常会报libmysqlclient.so相关的依赖冲突这时候要先卸载系统自带的MariaDB相关包yum remove mariadb-libs这个命令会同时移除一些依赖mariadb-libs的系统组件如果有影响需要你判断一下。卸载后重新按顺序执行rpm安装命令一般就能成功。之后同样用systemctl start mysqld启动再按之前的流程设置密码即可。4. 配置文件与核心参数优化4.1 my.cnf常用参数详解Linux下MySQL的主配置文件位于/etc/my.cnfWindows的ZIP装法则在解压目录下的my.ini两者格式一致都是INI风格。我把日常使用频率最高的参数挑出来逐个说明方便你装完后按需调整。[mysqld] port3306 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections500 innodb_buffer_pool_size1G sql_modeSTRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTIONport不用多说就是服务监听端口。datadir是数据目录生产环境建议单独放在数据盘上比如/data/mysql而不是默认的/var/lib/mysql原因很简单系统盘通常空间有限数据增长是不可控的放在独立数据盘上更安全。socket是Unix域套接字路径本地连接mysql命令行的时候必须和实际路径一致如果改了默认位置客户端连接时也要指定对应socket文件。4.2 字符集与大小写敏感的坑字符集这个坑我见过不少次尤其是从5.7或更老版本升级过来的项目。8.0默认就是utf8mb4理论上不用改但如果你是从5.7迁移过来原来的库表很多是utf8创建迁移后写入emoji或者生僻字仍然可能报错这是因为表级别的字符集没跟着变。我的建议是在配置里直接锁定这两个参数让新建的库表都走utf8mb4。如果老表已经是utf8需要做一次ALTER TABLE转换这个属于数据库迁移的事情这里先不展开。另外要格外注意lower_case_table_names参数。Windows默认对表名大小写不敏感值固定为1Linux默认是0也就是表名区分大小写。如果你在Windows开发线上却是Linux很容易出现本地建表User线上查询user表报表不存在的诡异问题。要避免这个坑要么在Linux的my.cnf里显式设置lower_case_table_names1要么开发时统一用全小写表名。有一点必须强调这个参数必须在MySQL初始化之前设置初始化之后再修改会导致整个数据目录不可用属于没法轻易改的配置。4.3 连接数与日志参数max_connections这个参数很多人的理解有偏差它不代表越多越好。如果设置过大每个连接都会占用一定的内存和文件描述符反而拉低整体性能。实践中我会结合应用层的连接池一起考虑比如你的应用用了HikariCP或者Druid连接池最大连接数设为50数据库的max_connections设成200到500就完全够用预留出运维连上来排查问题的余量就够了。还有一个常被忽略的参数是slow_query_log和long_query_time。生产环境建议开启慢查询日志把阈值设成2秒或者3秒slow_query_log1 slow_query_log_file/var/log/mysql-slow.log long_query_time2很多人在装完MySQL之后只关心能不能连上从来不关心慢查询等线上接口变慢了才回来补日志那时候已经晚了。后续凡是优化SQL都需要这个文件来定位问题。5. 安全设置与远程访问5.1 修改root密码和认证插件无论哪种方式装好的MySQL第一项安全操作都是修改root密码这个前面已经提过SQL是ALTER USER rootlocalhost IDENTIFIED BY 新密码;这里多说一句密码策略。MySQL 8.0默认有一个validate_password组件它会检查密码长度和复杂度要求至少8位且包含大小写字母、数字和特殊字符。如果你只是想本地测试嫌麻烦可以调低校验级别SET GLOBAL validate_password.policy LOW; SET GLOBAL validate_password.length 6;不过个人经验本地测试也尽量别设太简单的密码因为很多测试库最后直接就成了线上库密码复杂度太弱等于给自己埋雷。学习阶段可以调到LOW但起码6位以上。有些老工具比如旧版Navicat、老旧Java驱动连8.0默认的caching_sha2_password认证会报认证失败解决思路有两种一种是把全局默认认证方式改回mysql_native_password不推荐安全性和新特性都会打折扣另一种是为特定账号指定旧认证插件CREATE USER oldclient% IDENTIFIED WITH mysql_native_password BY 密码;这样老工具还能用新库的安全性也不受影响是我比较推荐的做法。5.2 创建专用账号并授权生产环境绝对不要用root账号来跑业务应用这是基本安全底线。实际项目里我会单独创建一个应用账号只授权它需要的那个库CREATE USER app% IDENTIFIED BY AppPassw0rd!; GRANT ALL PRIVILEGES ON mydb.* TO app%; FLUSH PRIVILEGES;这里的%表示允许从任意主机连接如果应用和数据库部署在同一台机器更稳妥的写法是限定为localhost或者应用服务器的内网IP比如app192.168.1.100这样即使账号密码泄露外部也没法直接连接。特别强调一下GRANT ALL PRIVILEGES后面一定要跟上ON mydb.*意思是只对mydb这个库生效不要图省事直接用ON *.*给所有库的权限否则以后这个账号被攻破整个实例就完蛋了。5.3 防火墙放行3306端口Linux上装完MySQL之后很多远程连不上的问题不是MySQL配置错了而是防火墙没放行端口。CentOS/RHEL上执行firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reloadUbuntu上执行ufw allow 3306/tcp顺手提醒一下修改完配置后可以用netstat -tlnp | grep 3306或ss -tlnp | grep 3306确认MySQL确实在监听。如果看到监听地址是127.0.0.1:3306说明MySQL只监听了本地回环地址外部肯定连不上。这种情况需要在/etc/my.cnf里加上bind-address0.0.0.0并重启服务让MySQL监听所有网卡。6. 装完之后的常见问题与排查实录6.1 net start服务无法启动Windows上net start MySQL80报服务无法启动是我在本地被问到最多的问题。排查顺序一般是第一步看错误日志打开数据目录下的主机名.err文件拉到最末尾看报错原因第二步检查my.ini里的路径是否正确尤其是datadir路径是否存在且有写权限第三步检查端口是否被占用用netstat -ano | findstr 3306看有没有其他进程占用了3306。很多情况下错误日志里写的明明就是“Cant create/write to file”这类权限问题直接把MySQL解压目录和数据目录的权限设置为当前用户完全控制就能解决。如果错误日志里出现类似“unknown variable”的提示多半是my.ini里写了不认识的参数。还有一种比较隐蔽的情况MySQL 8.0初始化时如果传入了不支持的参数组合虽然能初始化但服务启动时反而失败。遇到这类问题别在服务管理器里反复点重试先把数据目录里的.err文件从头到尾翻一遍80%的问题答案都在里面。6.2 端口被占用怎么办端口被占用又分两种情况一种是MySQL已经装过一次旧实例还在跑另一种是3306被其他程序占用比如有人装了XAMPP或者本机调试用的MariaDB。处理方式很简单要么杀掉占用进程要么改MySQL端口。如果是自己机器上有多个数据库共存我给的建议是手动改端口比如在my.ini里改成3307同时确保客户端连接时指定-P 3307。这里再补充一个极容易忽略的点Linux下如果你改了端口防火墙放行的节点也要跟着改比如firewall-cmd --add-port3307/tcp否则关了防火墙的应用远程照样连不上。6.3 忘记root密码的处理忘了root密码也是高频事故。Linux下处理办法是跳过权限校验启动MySQL。先停掉服务systemctl stop mysqld然后在my.cnf的[mysqld]段临时加上skip-grant-tables重新启动服务systemctl start mysqld此时直接输入mysql -u root就能免密进入。进去后执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码;改完一定记得把my.cnf里的skip-grant-tables那行删掉再重启服务否则数据库一直敞开着大门被黑只是时间问题。Windows下的处理思路完全一致只不过服务操作命令对应换成net stop MySQL80和net start MySQL80。6.4 SSL连接错误与客户端异常MySQL 8.0默认启用SSL连接但默认配置下SSL证书是自动生成的。如果你用本地客户端连接时报SSL连接错误最常见的提示是ERROR 2026 (HY000): SSL connection error: SSL is required原因通常是客户端没有正确支持SSL或者证书链有问题。解决办法有两条路如果确认是本地开发环境可以在连接串里显式关闭SSL比如mysql命令行加--ssl-modeDISABLEDJava JDBC连接串加useSSLfalse但生产环境我建议不要关而是把客户端驱动升级到支持SSL的版本并配置正确的证书路径。另外热词里出现过的e0434352错误这里多提一句。这个错误码其实是Windows上.NET运行时抛出的异常代码并不是MySQL本身的报错。当你看到某个MySQL客户端工具报e0434352时通常意味着这个客户端程序的.NET组件出了故障或者是系统缺少对应的.NET运行库和数据库服务端基本没有关系。解决办法是修复或重装客户端工具或补装对应版本的.NET运行库。最后补充一点个人经验在不同环境下反复重装MySQL之后我最深的体会是遇到问题先别急着删了重装一定要先看日志。很多初学者一看到错误提示就慌了直接把目录删掉重来一遍结果同一个坑踩两三次。MySQL的错误日志写得非常细致路径、权限、端口、配置参数都会明确告诉你问题出在哪。如果非要给一句总结把日志读明白安装MySQL就是一道一次性的送分题。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →