
聊到数据库安装MySQL永远是被问得最多的那个。前几天群里有个朋友问了一句“MySQL 9.1.0到底能不能装装完会不会和8.0冲突”我意识到很多人对MySQL的安装流程其实一直处于“能跑就行”的状态遇到细节就抓瞎。这篇我把MySQL 9.1.0安装从头到尾拆开讲按保姆级标准来不管你是零基础新手、刚接触数据库的大学生还是要把旧MySQL换新的老开发照着做基本不会翻车。文章会覆盖Windows、Linux和Docker三种常见环境从官网下载、安装器选型、目录初始化、配置文件编写到服务注册、安全设置和常见报错排查每一步都给出可直接复制的命令和参数。1. 版本认知与安装前的准备工作1.1 先搞懂9.1.0到底是什么版本MySQL的版本线现在很多人分不清这里必须先说清楚。8.0系列做了很久的长期支持然后官方调整了策略8.0之后是8.1、8.2、8.3这些Innovation版本接着8.4变成了新的LTS长期支持版再往后是9.0、9.1也属于Innovation版本。所以你看到9.1.0的时候不要觉得它一定比8.4“高级”这两条线的定位完全不同。9.1.0是尝鲜版功能新、迭代快官方对Innovation版本的支持周期很短基本到下个Innovation发布就停止维护了8.4才是当前适合生产环境长期跑的那个。有朋友之前在评论区问“5.7.44官方为什么之后变成5.7.43了”其实那是版本线上并行发布的正常现象5.7.44的发布节点和5.7.43挨得很近数字顺序不代表什么不需要纠结。真正需要你记住的是装9.1.0之前先问自己一句“这台机器是用来干什么的”。如果是自己学习、做实验、搭个人项目9.1.0完全可以装如果是线上业务、要给客户交付那还是老老实实选8.4 LTS。9.1.0里值得提前知道的新东西包括VECTOR类型开始进入MySQL体系面向向量检索和AI应用场景EXPLAIN ANALYZE的JSON输出变得更丰富调优时能看到的执行细节更多InnoDB在并发和性能上也有些改进。这些后面在第五部分我会挑能动手试的说一下。1.2 安装前的三件事第一件事是确认系统环境。Windows这边至少要64位系统Win10/11或者Server 2016以上都行内存建议4G以上如果只是做测试1G也能跑但别开太多并发连接。Linux这边要注意glibc版本9.1的官方通用二进制包通常是基于glibc 2.28编译的如果你还在用CentOS 7这种glibc只有2.17的老系统直接解压跑大概率会报版本不兼容建议用Docker或者升级系统。第二件事是检查3306端口。装之前先在命令行确认端口有没有被占用Windows上执行netstat -ano | findstr :3306Linux上执行ss -tlnp | grep 3306。如果已经有MySQL、MariaDB、SQL Server这些东西占着要么把旧服务停掉要么后面安装时把端口改成3307不然装完服务起不来你都不知道为什么。第三件事是下载渠道。官网是 dev.mysql.com/downloads/mysql/进“MySQL Community Server”页面后认准版本号9.1.0别把8.0.x或者9.0.x当成9.1.0。官方下载在国内可能会慢可以找高校镜像或者云厂商的镜像站下载同一个文件注意比对文件名称里的版本号和系统架构就行。安装包分很多种Windows一般选MSI Installer或者ZIP ArchiveLinux选tar.xz的通用二进制包。2. Windows平台保姆级安装2.1 MSI和ZIP两种方式到底怎么选Windows装MySQL官方给了两种主流方式MSI安装器和ZIP压缩包。MSI的好处是图形化点几下鼠标就能把服务、防火墙、环境变量都配置好新手友好适合在公司电脑上快速搭环境缺点是安装过程像个黑盒出了问题不太容易定位而且它会顺带装不少你可能用不到的组件。ZIP包是绿色版解压就能用但需要你自己写my.ini、初始化数据目录、注册服务流程更底层适合开发者和运维同学尤其是你想搞清楚MySQL到底在机器上干了什么的时候。我的建议是如果你是第一次学MySQL老老实实走一遍ZIP流程把初始化、服务注册、配置这些概念过一遍之后再用MSI会觉得很轻松。如果赶时间、只想要个能用的数据库直接用MSI就行两个方法我都会给。2.2 MSI安装器流程跟着点就行下载下来的是类似mysql-installer-community-9.1.0.0.msi的文件双击运行。如果系统提示缺运行库比如Visual C Redistributable先装一遍运行库再回来这是很常见的情况。进入安装类型选择界面选“Server only”是最省事的只装数据库本体选“Developer Default”会把MySQL Workbench、各种Connector也一起装上适合你还要写代码、需要图形化工具的场景。我一般推荐Server only加另装一个Workbench或者干脆Server only之后用命令行和Navicat。接下来是“Type and Networking”配置。端口默认3306如果刚才查过端口被占用这里改成3307或3308勾选“Open Firewall port for network access”让Windows防火墙放行不然远程连不进来。然后到了很多人踩坑的地方Authentication Method。9.1默认强烈推荐“Use Strong Password Encryption”也就是caching_sha2_password认证插件这是8.0之后的默认方案。除非你有很老的项目、客户端不认这个插件否则别选Legacy Authentication。后面如果有人连不上我会在常见问题里讲解决办法这里千万别自己乱降级。设置root密码的时候要求12位以上、大小写字母数字符号都带上比如Root#2025这种。再往下是配置Windows服务建议勾选“Configure as Windows Service”服务名默认MySQL91开机自启按需勾选。最后一路Apply、Execute等它跑完配置。完成后打开“MySQL Command Line Client”输入root密码能进到mysql提示符就算成功了。2.3 ZIP包安装一条命令一条命令来ZIP方式是我个人最推荐的学习路径。先把下载的ZIP包解压到一个干净路径比如D:\mysql-9.1.0-winx64注意不要放在带中文或空格的目录里后续会出现各种莫名其妙的问题。在解压目录下新建一个my.ini配置文件内容如下。我这里直接给你一份能用的基础配置[mysqld] basedirD:/mysql-9.1.0-winx64 datadirD:/mysql-9.1.0-winx64/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci max_connections200 skip-name-resolve [client] port3306 default-character-setutf8mb4解释几个关键项basedir是MySQL安装目录datadir是数据文件存放目录这两个路径一定要写对写成反斜杠和正斜杠都行但正斜杠在配置文件里更好解析character-set-server直接固定为utf8mb4避免后面出现中文乱码skip-name-resolve是跳过域名反解析连接速度会快一点注释掉的也可以看你心情。写完后记得保存为UTF-8编码不要带BOM。打开管理员身份的CMD或PowerShell进入解压目录的bin目录执行mysqld --initialize-insecure这一步会生成一个空的data数据目录使用--initialize-insecure表示root账号初始没有密码方便你接下来直接登录再设置密码。如果执行时提示data目录已存在说明之前初始化过把data目录删掉重来一遍就行。然后注册Windows服务并启动mysqld --install MySQL91 net start MySQL91启动后登录数据库这时不需要密码直接回车就能进mysql -uroot -p进入后马上改掉root密码ALTER USER rootlocalhost IDENTIFIED BY Root#2025; FLUSH PRIVILEGES; EXIT;最后把D:\mysql-9.1.0-winx64\bin加到系统环境变量Path里这样以后在任意CMD窗口都能直接敲mysql命令。验证方法很直白新开一个CMD窗口执行mysql -uroot -p输密码后执行SELECT VERSION();能看到9.1.0的版本号就说明全部搞定。3. Linux平台安装与配置3.1 通用二进制包安装生产环境的标准动作Linux上安装MySQL常见的方式有二进制包、系统包管理器、Docker。这里先讲最通用的官方通用二进制包方式适合不用容器、要在云服务器或物理机上直接部署的场景。先创建MySQL运行需要的专用系统用户groupadd mysql useradd -r -g mysql -s /bin/false mysql然后到官网下载Linux版tar.xz包文件名一般是类似mysql-9.1.0-linux-glibc2.28-x86_64.tar.xz的形式。下载链接以官网页面实际显示的为准不要盲抄别人文章里的URL因为镜像节点和版本号后缀经常变。下载完成后解压到/usr/local并建立软链接cd /usr/local wget https://dev.mysql.com/get/Downloads/MySQL-9.1/mysql-9.1.0-linux-glibc2.28-x86_64.tar.xz tar -xvf mysql-9.1.0-linux-glibc2.28-x86_64.tar.xz ln -s mysql-9.1.0-linux-glibc2.28-x86_64 mysql接着准备数据目录和权限cd mysql mkdir -p /var/lib/mysql chown -R mysql:mysql /var/lib/mysql /usr/local/mysql然后编辑/etc/my.cnf给一份够用的配置[mysqld] datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock pid-file/var/run/mysqld/mysqld.pid usermysql port3306 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci lower_case_table_names1这里有个参数很多人会纠结lower_case_table_names1表示表名不区分大小写方便从Windows环境迁移过来的项目如果你的项目团队约定Linux上统一用大写表名可以保持默认的0提前约定好就行。初始化数据目录并创建运行目录mkdir -p /var/run/mysqld chown mysql:mysql /var/run/mysqld /usr/local/mysql/bin/mysqld --initialize --usermysql注意这里用了--initialize不是Windows教程里的--initialize-insecure它会为root生成一个临时密码。初始化完成后去日志里找这个密码位置一般是在/var/log/mysql/error.log或/var/lib/mysql/下的*.err文件搜索关键字grep temporary password /var/log/mysql/error.log找到类似A temporary password is generated for rootlocalhost: xxxxxxxx的一行这个临时密码必须拿好后面第一次登录要用。启动服务可以直接用systemdMySQL二进制包里带了启动脚本cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server systemctl enable mysql.server systemctl start mysql.server检查3306端口有没有监听ss -tlnp | grep 3306能看到LISTEN状态就说明服务起来了。然后用临时密码登录改成自己的密码mysql -uroot -pALTER USER rootlocalhost IDENTIFIED BY Root#2025;3.2 用系统包管理器的陷阱如果你图省事直接在CentOS上yum install mysql-server在Ubuntu上apt install mysql-server大概率会装上系统源里自带的MySQL版本比如8.0或者8.4甚至可能是MariaDB。系统包管理器的问题在于版本不受你控制配置文件路径和逻辑也和官方二进制包有出入。我一般只在已有内部源、批量交付的时候才用这种方式自己学习验证还是用官方二进制包最稳妥至少你能百分百确定装的就是9.1.0。4. Docker方式快速体验4.1 一条命令跑起来如果你只是想在本地快速体验9.1.0又不想污染宿主机环境Docker是最省事的方式。前提是你已经装好了Docker Engine版本20以上就行。先拉镜像docker pull mysql:9.1.0如果提示manifest not found找不到这个tag说明镜像仓库里的tag名可能有微调可以试一下mysql:9.1.0-innovation或者mysql:9.1。然后启动容器docker run -d --name mysql91 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDRoot#2025 \ -e TZAsia/Shanghai \ -v mysql91_data:/var/lib/mysql \ mysql:9.1.0这条命令里的几个环境变量和参数是重点。MYSQL_ROOT_PASSWORD会帮你在第一次初始化时设置root密码TZAsia/Shanghai解决时间时区问题不设的话容器默认UTC时间查数据时间差8小时容易懵-v mysql91_data:/var/lib/mysql是命名卷用来持久化数据容器删了重建数据都还在。启动后等多一两分钟容器第一次初始化会比较慢别急着连。用下面的命令确认状态和登录docker logs mysql91 docker exec -it mysql91 mysql -uroot -p4.2 用docker-compose管理更舒服如果这个MySQL服务要长期用或者你后面还要再起Redis、中间件这些写一个docker-compose.yml更舒服一键启动配置都固化在文件里。给你一份可直接用的services: mysql: image: mysql:9.1.0 container_name: mysql91 restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: Root#2025 MYSQL_DATABASE: testdb TZ: Asia/Shanghai volumes: - mysql91_data:/var/lib/mysql - ./my.cnf:/etc/mysql/conf.d/custom.cnf - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro volumes: mysql91_data:在文件同目录下执行docker compose up -d就能拉起服务。MYSQL_DATABASE环境变量会让容器在首次初始化时自动创建testdb这个库init.sql目录下的SQL脚本也会在首次创建数据卷时自动执行非常适合团队内部一键搭建开发库。5. 安装后的必修课安全配置与使用建议5.1 越早做越省心的安全加固很多人装完MySQL连上root就开始建表写数据这是非常危险的习惯。第一件该做的事是用自带的mysql_secure_installation脚本做一遍基础安全配置mysql_secure_installation它会一步步问你是否启用密码校验策略、是否删除匿名用户、是否禁止root远程登录、是否删除test测试库、是否立即刷新权限表。我的建议是测试环境也全部选YES唯一要注意的是“禁止root远程登录”这一步如果你需要从别的机器用root连这台数据库那单独创建业务用户来开放远程权限别把root暴露出去。日常开发也绝对不要用root账号连接业务。正确的做法是创建最小权限的业务用户CREATE DATABASE IF NOT EXISTS appdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; CREATE USER appuserlocalhost IDENTIFIED BY AppPass#2025; CREATE USER appuser% IDENTIFIED BY AppPass#2025; GRANT ALL PRIVILEGES ON appdb.* TO appuserlocalhost; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO appuser%; FLUSH PRIVILEGES;这里localhost和%的区别要理解到位前者只允许从本机连接后者允许从任意IP连接。如果你只在本机开发只要前者就够了如果应用服务器在其他机器需要连接这个数据库再开放%并且权限尽量只给这个库的增删改查。这是安全基线别偷懒。5.2 9.1.0里值得动手试的新东西装好后第一件事当然是确认版本执行SELECT VERSION();能看到9.1.0开头的版本号说明环境是干净的。然后可以看看服务端的相关参数SHOW VARIABLES LIKE character%; SHOW VARIABLES LIKE have_ssl;字符集相关的变量应该都是utf8mb4have_ssl应该是YES因为9.x默认启用了TLS支持。9.1.0的EXPLAIN ANALYZE输出比8.0更详细这是做SQL调优时很有用的功能。你可以随便准备一张表试一下EXPLAIN ANALYZE SELECT * FROM appdb.users WHERE id 1;输出的内容会告诉你每一步实际消耗的时间、扫描的行数、是否用了索引。以前调SQL都是靠猜现在有了执行成本优化方向清楚很多。VECTOR类型在9.1里也还在持续演进面向向量检索场景的如果你后面打算做AI应用、给业务数据做语义搜索可以提前看官方文档熟悉一下这个方向普通项目先不用急着用它。5.3 装完MySQL开发环境还差这几样装好数据库之后很多人下一件事就是配开发环境。Git、Node.js、Python、PyCharm这些热词里出现的工具都是数据库装完后的标准配套。比如你用Python连MySQL需要装pymysql或者mysqlclient用Java Web项目连需要JDBC驱动用Node.js连需要mysql2这个包。连接串里几个参数很容易忽略时区要写成serverTimezoneAsia/Shanghai字符集要指定utf8mb4SSL参数根据你的服务端配置来设。给个Python连接示例帮助你验证数据库能不能正常被外部程序访问import pymysql conn pymysql.connect( host127.0.0.1, port3306, userappuser, passwordAppPass#2025, databaseappdb, charsetutf8mb4 ) print(conn.get_server_info())能打印出9.1.0版本号说明应用层连接完全通了。6. 常见问题与排查技巧实录6.1 一张速查表解决80%的安装问题下面这张表是我自己安装和帮别人排障时遇到最多的问题汇总先照着表自查大多数情况能直接解决。报错现象最常见原因处理办法服务无法启动 / 1067错误my.ini中basedir、datadir路径错误或data目录不存在检查配置文件路径删除错误data目录后重新mysqld --initialize3306端口被占用之前装过MySQL或MariaDB进程残留netstat -ano | findstr :3306找到PID并结束进程或改端口中文乱码客户端、连接串、库表字符集不一致统一改用utf8mb4连接串加charsetutf8mb42058错误 / caching_sha2_password cannot be loaded客户端或驱动版本太老不认新认证插件优先升级客户端和驱动不要盲目降低服务端认证方式Connection refused服务没启动或防火墙阻断3306确认服务状态和监听端口检查防火墙放行规则SSL连接错误客户端与服务端TLS版本或证书配置不匹配按下方6.2章节步骤排查6.2 SSL连接错误怎么排查MySQL 9.x默认是启用TLS的所以SSL连接错误出现频率比老版本高。常见报错有几种SSL connection error、SSL certificate verification failed、Unknown error number。遇到这个问题先别慌按顺序排查。第一步确认客户端版本。很多老版本的Navicat、老驱动的TLS实现跟不上新版本就会在握手时报SSL相关错误。优先把客户端、驱动升级到最新版本这个能解决一大半问题。第二步看你有没有主动加SSL参数。如果你在连接串里写了ssl-modeREQUIRED或VERIFY_CA但CA证书路径没配置对一定报证书验证失败。开发环境最简单的验证方法是先临时禁用SSL连接测试mysql -h 127.0.0.1 -P 3306 -u appuser -p --ssl-modeDISABLED如果能正常连上说明数据库本身没问题问题出在你客户端SSL配置上再逐个调整证书或ssl-mode参数。第三步看服务端SSL状态SHOW VARIABLES LIKE have_ssl;如果have_ssl是DISABLED说明服务端没开TLS而客户端坚持要求SSL两者就会冲突报错。本地回环连接其实没太大必要走SSL测试环境直接禁用SSL简化排障完全合理但生产环境对外连接一定做好证书链配置。6.3 忘记root密码的重置流程忘记root密码是几乎每个人都会经历的这个流程也给你记下来。第一步停止MySQL服务。Windows执行net stop MySQL91Linux执行systemctl stop mysql.server。第二步跳过授权表启动服务Windows执行mysqld --console --skip-grant-tablesLinux执行mysqld --skip-grant-tables --usermysql 第三步另开一个命令行窗口直接登录mysql -uroot进入后执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass#2025; EXIT;最后恢复服务重启。注意--skip-grant-tables模式下数据库没有任何权限校验别人连上来也能为所欲为这个状态只允许用于本机紧急维修改完密码一定要立刻恢复正常模式重启。6.4 安装完成后的自查清单最后给你一个简单但管用的自查清单照着过一遍基本能确认这次安装是健康的。第一执行SELECT VERSION();确认版本是9.1.0第二执行SHOW VARIABLES LIKE character_set_server;确认字符集是utf8mb4第三确认服务状态是running端口已经监听第四把最终生效的my.ini或my.cnf单独备份一份下次换机器直接套用这份模版第五用命令行和外部程序各连一次数据库确认应用层能通。我个人在实际操作中的体会是安装MySQL这件事本身不复杂复杂的是装完之后你不确定自己装对没有。所以每次装完我都会多做一步执行mysqld --verbose --help | grep -i datadir这类命令确认实际生效的路径参数和我的预期一致这样能排除很多“看起来装对了实际配置没读到”的暗坑。还有如果你手头是严肃的生产业务还是建议把数据库版本切回8.4 LTS让运维团队睡个安稳觉如果是自己学习、做实验、写点小项目9.1.0完全值得装新特性玩起来确实有意思。希望这篇保姆级MySQL 9.1.0安装教程能让你少走点弯路。