在写这篇东西之前,我其实犹豫了一下。MySQL的大版本号已经走到9.x了吗?是的,9.1.0已经发布了,而且网上的中文教程还停留在8.0甚至5.7时代的思路,让不少跟着老教程硬装9.1.0的人卡在初始化或者服务启动那一步,问出来的问题五花八门,归根结底是没搞懂新版本在安装环节的变化。这篇就打算从零完整走一遍,把Windows和Linux两条主流路径都写透,顺手把那些最容易翻车的坑提前给你挖出来。
这篇教程适合谁?第一次装MySQL、对命令行不熟、想搞明白每一步在干什么的人;以及在开发机、测试环境里需要快速跑起9.1.0,又不想被网上碎片化教程坑的人。你要是追求生产环境的高可用、主从复制,这篇只能帮你打好安装基础,后面的架构问题还得另开一篇。
1. 动手之前:先搞清楚9.1.0的版本属性和安装方式
1.1 9.1.0是Innovation版本,别和生产环境较劲
很多人一看到"9.1.0"就想当然认为它肯定比8.0更稳定、更该用。这是个非常危险的误解。MySQL从8.0之后调整了发布策略,官方把版本分成两条线:一条是长期支持版(LTS),比如8.0和8.4;另一条是创新版(Innovation),9.0、9.1这些都属于这条线。创新版的特点是功能迭代快、新特性先上,但支持周期很短,下一个创新版一出来,老版本基本就不再提供长期保障了。
所以9.1.0的定位是给那些想尝鲜、做功能验证、跑开发测试的人用的。我见过有人直接在核心业务库上装9.x,没过多久发现一个插件不兼容,回滚成本高得吓人。安装之前先记住一句话:生产环境老老实实用LTS版本,9.1.0拿来学习、试用、验证新功能是极好的,别拿它当压舱石。
1.2 安装方式怎么选:MSI、ZIP、官方源还是通用二进制包
MySQL的安装方式多,恰恰是新手最容易懵的地方。同一套逻辑在不同平台上有不同载体,我把常见的选择拉出来对比一下:
| 安装方式 | 适合场景 | 优点 | 需要留意的地方 |
|---|---|---|---|
| Windows MSI安装包 | 新手快速上手 | 图形界面,全程点点点 | 自定义程度相对低,版本更新不灵活 |
| Windows ZIP解压包 | 喜欢自己掌控一切 | 干净无残留,配置全在自己手里 | 手动操作多,初始化、注册服务都得自己来 |
| Linux官方APT/Yum源 | Debian/Ubuntu或CentOS/RHEL用户 | 安装方便,后续升级也顺 | 源里版本可能滞后,要先把官方源配置对 |
| Linux通用二进制tar包 | 绝大多数Linux发行版 | 统一流程,不依赖包管理器,好排查 | 需要手动创建用户、配置目录权限 |
| Docker镜像 | 容器化环境 | 秒级启动,环境隔离 | 数据持久化、网络模式要单独理解 |
这篇教程里Windows平台我会把ZIP解压版和MSI都讲一遍,Linux平台重点走官方二进制tar包。Docker方式其实也很常用,但它的逻辑跟原生安装完全不一样,塞进这一篇会冲淡重点,改天单独写。
2. Windows平台保姆级安装:两种方法都走一遍
2.1 方法A:ZIP解压包,适合喜欢掌控一切的玩家
我自己的开发机用的是ZIP方式,别问为什么,就是喜欢那种"所有文件都在自己眼皮底下"的感觉。你从官网下载mysql-9.1.0-winx64.zip之后,先确认一件事:官方ZIP包解压后是没有my.ini配置文件的,第一次启动前必须自己写,否则你会发现MySQL用默认参数启动,字符集、端口、数据目录全在碰运气。
解压到某个路径,比如D:\mysql-9.1.0,然后用记事本或者VS Code在根目录新建my.ini,这是我常用的最小可运行配置:
[mysqld] # 端口号,机器上装了旧版MySQL的注意别冲突 port=3306 # 数据目录,解压包不会自动建,需要手动创建 datadir=D:/mysql-9.1.0/data # 安装根目录 basedir=D:/mysql-9.1.0 # 字符集 character-set-server=utf8mb4 # 认证插件,9.x默认已经很强,不用刻意选 [client] default-character-set=utf8mb4提醒你一句:datadir指向的目录,手动建好它,别指望MySQL帮你生成。之后打开命令提示符(管理员模式),进到bin目录,先执行初始化命令。这里有个极其关键的差别:老教程动不动就是mysqld --initialize-insecure,意思是初始化时不生成临时密码,root用户空密码直接进。9.1.0里这条命令仍然可用,但我不推荐。
我更推荐用正正经经的--initialize。它会生成一个带临时密码的root账号,临时密码写在错误日志里,虽然第一次打开有点费劲,但逼迫你走一遍"用临时密码登录、再改密码"的流程,能让你把所有账号状态掌握在自己手里。初始化命令做完之后,再执行安装Windows服务:
D:\mysql-9.1.0\bin\mysqld --install MySQL91 net start MySQL912.2 方法B:MSI安装包,适合快速上手
MSI这条路就简单很多。双击运行,Setup Type里我建议直接选Server only,别选什么Developer Default,全组件安装一大堆暂时用不到的东西,还会顺手装各种测试框架、额外工具,没意义。后面几步里会让选择端口和数据目录,保持默认3306和系统路径就行,重点记住设置root密码那一步。
MSI安装器在设置密码那里会顺便让你添加Windows服务名,默认是MySQL91,这一步没问题。很多人卡在"为什么装完了连不上",十有八九是安装过程中防火墙弹窗点了取消。Windows防火墙会拦截mysqld.exe的入站连接,必须允许,否则你自己这台机器连本机3306可能没事,局域网里其他机器一访问就超时。
2.3 服务启动失败先检查Windows事件日志
如果net start MySQL91报错,别急着反复重装。错误信息经常只说"服务无法启动",实际原因藏在Windows事件查看器里。打开事件查看器,找到Windows日志下的Application,找来源为MySQL的Error记录,连不上日志文件、端口被占用、路径解析失败,都会明明白白写出来。
端口被占用是Windows下最高频的坑。3306被旧版MySQL或者某些套件占用时,mysqld会直接退出。排查命令也很简单:
netstat -ano | findstr :3306看到有LISTENING的PID后,用tasklist | findstr PID确认是谁占用的。该停的停,或者干脆换端口。
3. Linux平台命令行安装:以官方二进制包为例
3.1 下载、解压与系统用户准备
Linux下我推荐用官方通用二进制包,因为不管你是CentOS、Ubuntu还是其他发行版,流程一致的,排查问题也方便。先创建一个专用的系统用户,MySQL服务不建议用root身份运行,安全风险太大:
groupadd mysql useradd -r -g mysql -s /bin/false mysql然后把下载好的mysql-9.1.0-linux-glibc2.28-x86_64.tar.xz上传到服务器,解压。你可能会问,解压到哪个目录?通常放在/usr/local下面,顺手加个软链接方便升级:
tar -xf mysql-9.1.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local ln -s /usr/local/mysql-9.1.0-linux-glibc2.28-x86_64 /usr/local/mysql cd /usr/local/mysql记得把目录归属权交给之前创建的mysql用户。这一步很多人漏掉,结果后面初始化时因为目录权限问题直接报错,而且错误信息还不能一眼看出是权限问题。
mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chown -R mysql:mysql /usr/local/mysql3.2 my.cnf配置和目录归属
Linux环境的配置文件是/etc/my.cnf,不像Windows那样跟解压目录放一起。这里有一个需要注意的地方:MySQL会按固定顺序寻找配置文件,/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf这些都会按优先级加载。如果你系统里存在多个配置文件,后面的会覆盖前面的同名参数。
下面是我在测试环境里常用的最小配置:
[mysqld] datadir=/data/mysql socket=/tmp/mysql.sock port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_0900_ai_ci # 建议开发测试环境开启,生产环境改成127.0.0.1 bind-address=0.0.0.0 [client] socket=/tmp/mysql.sock default-character-set=utf8mb4注意bind-address这一项。默认情况下MySQL只监听本机,你写0.0.0.0意味着允许任何网卡上的连接进来,配合远程访问授权使用。如果只做本地开发,强烈建议别开0.0.0.0,保持127.0.0.1,降低被扫到端口的概率。
3.3 初始化与systemd管理
初始化命令和Windows一致,但Linux下必须注意以mysql用户的身份执行,否则生成的数据文件owner会是root,后续mysqld进程就没法正常读写数据了:
/usr/local/mysql/bin/mysqld --initialize --user=mysql这条命令执行完,屏幕上不会有"初始化成功"的提示,别慌。临时密码被写到了错误日志里,通常是/data/mysql/hostname.err这个文件。用下面的命令找到那段随机密码:
grep 'A temporary password' /data/mysql/*.err接着启动服务。手动方式最直接:
/usr/local/mysql/bin/mysqld_safe --user=mysql &但每次都手动太累,建议注册成systemd服务。在/etc/systemd/system/mysql.service里写入如下内容:
[Unit] Description=MySQL Server 9.1.0 After=network.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld [Install] WantedBy=multi-user.target之后执行systemctl daemon-reload,再systemctl start mysql,就能用systemd统一管理了。
4. 初始化细节和安全配置:决定数据库能否被正常使用
4.1 临时密码到底在哪,为什么我找不到
这个环节翻车率极高。很多人执行完mysqld --initialize --user=mysql之后,兴冲冲去日志文件里找A temporary password is generated for root@localhost,结果发现根本搜不到。原因无非两个:一是你看错了日志路径,Linux默认错误日志在数据目录里,文件名是主机名.err;二是你初始化时用了--initialize-insecure,它不会生成临时密码,因为root账号默认是个空密码。
如果你误用了--initialize-insecure初始化,也别慌,开始装服务之前可以直接用空密码登录:
mysql -uroot --skip-password进去了之后立刻修改密码。但最理想的情况还是按照官方推荐的--initialize走一遍,这是了解初始账号状态最清晰的路径。
4.2 修改密码与validate_password策略的博弈
用临时密码登录后,MySQL会强制要求你先改密码才能执行其他操作:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';这里很多人会遇到一个新麻烦:新密码设置得太简单,比如123456,MySQL会直接拒绝,报错信息指向validate_password组件。9.x默认开启了密码强度校验,这由validate_password组件控制,它要求密码至少8位,且包含大小写字母、数字和特殊符号。要临时放开限制可以执行:
UNINSTALL COMPONENT 'file://component_validate_password';但我不建议你这么干,生产环境更不要。开发机如果确实验证一些临时逻辑,可以改策略级别,而不是彻底卸载校验组件:
SET GLOBAL validate_password.policy = LOW;4.3 远程访问:授权、bind-address和防火墙三件事
数据库装好、密码改完,很多人想从别的机器连上来,这时候会碰到一条经典报错:Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server。这是因为MySQL的账号权限默认只允许localhost登录。远程访问需要三步配合:
第一步,授权一个远程root账号或独立账号:
CREATE USER 'dev'@'%' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%'; FLUSH PRIVILEGES;第二步,确认my.cnf里的bind-address不是127.0.0.1,改完之后必须重启服务才生效。
第三步,检查操作系统自带的防火墙。CentOS用firewall-cmd --permanent --add-port=3306/tcp,Ubuntu用ufw allow 3306/tcp,这步漏掉的话,外部客户端连接会一直卡在超时。
这三件事单独做了哪一件都不行,必须同时满足,我排查远程连不上的问题时就见过不少只做了授权就以为完事的人。
5. 验证一套标准动作和常见故障排查
5.1 安装完成后的标准验证动作
服务起来、密码改完,别急着写业务代码,按照下面这套动作过一遍,能确定你的MySQL真的处于健康状态:
# 进程状态 systemctl status mysql # 或者Windows下用 tasklist | findstr mysqld # 端口监听状态 netstat -tlnp | grep 3306 # 登录测试 mysql -uroot -p # 登录后执行 SELECT VERSION(); SHOW DATABASES;SELECT VERSION()能确认你是真的连到了9.1.0,而不是机器上残留了别的版本。SHOW DATABASES会看到默认的information_schema、mysql、performance_schema、sys这几个库,这是正常的。
5.2 高频报错到底是什么原因
这里把新人在安装阶段最容易撞上的报错集中梳理一遍,给你一个排查路径,而不是头疼医头:
Can't connect to local MySQL server through socket '/tmp/mysql.sock':基本可以断定mysqld进程没起来,先查systemctl status mysql或Windows事件日志,然后去看错误日志文件里的真实崩溃原因。Access denied for user 'root'@'localhost':密码不对,或者你完全忘了临时密码。如果确认是密码问题,就得通过跳过授权表方式先进入,重置密码后再回到正常模式,这一步要谨慎操作,不得万不得已别用。[ERROR] [MY-000199] InnoDB: Operating system error number 13 in a file operation:Linux下典型的表现,目录权限不对,chown -R mysql:mysql /data/mysql重新设置一遍。[ERROR] Port 3306 is already in use:老规矩,lsof -i:3306看占用进程,杀掉或者改端口,没有别的捷径。
5.3 日志是我排查问题的第一选择,而不是百度
再念叨一遍,MySQL的日志信息其实说得非常清楚,只是很多人不看。Windows下日志在安装目录的data文件夹里,Linux下在配置的datadir下面。初始化时的临时密码、启动失败的具体错误、InnoDB的异常信息,全部都能在*.err文件里找到。下次报错,第一步永远是打开错误日志,看末尾的扩展信息,而不是直接复制一段报错去网上搜。这个习惯能帮你节省大量时间。
写在最后
装完9.1.0只是第一步,我自己的体会是,真正让你熟练起来的还是后面日复一日的使用和排障。比如密码策略怎么调、远程访问怎么放行、目录权限怎么设置这些,其实每一条都是你实际操作中踩过一脚之后才记得住的。上面讲的这套流程,我已经在几台环境完全不同的机器上跑过了,不敢说通吃一切场景,但覆盖新手安装时碰到的主流问题绰绰有余。你按顺序走,碰到岔路就用日志讲话,大概率能顺利把服务跑起来。