新换了一台工作机数据库环境全部重装一遍顺手就把 MySQL 9.0 在 Windows 上的安装流程完整走了一遍。这篇文章不是临时翻文档写出来的而是我实际踩完坑之后的完整记录。MySQL 9.0 在下载渠道、初始化方式、默认认证配置上和之前写过的 8.0 安装有一些细节差异先说明清楚后面安装就不会卡壳。这篇内容主要给两类读者一类是刚接触 MySQL、想在 Windows 上快速把环境搭起来的学习者另一类是已经用了多年 8.x 或 5.7、准备看看 9.0 新特性的老手。安装方式我会讲两条路线MySQL Installer 图形化安装和免安装 ZIP 包手动配置两条都会带完整步骤和解释为什么这么做。1. 安装前的准备与版本选择1.1 MySQL 9.0 的版本定位为什么它和 8.4 不一样MySQL 从 8.1 开始调整了版本发布策略区分成了LTS 长期支持版和Innovation 创新版。8.4 是 LTS适合生产环境稳扎稳打9.0 是 Innovation发布时间更激进带了一些新功能但也意味着它的迭代节奏更快后续还会有 9.1、9.2 陆续出来。9.0 最吸引我的是两个点一是内置了VECTOR 数据类型在做向量检索实验的时候可以直接存 embedding不用再额外架构外部数据库二是开始支持用JavaScript 编写存储程序这个需要 GraalVM 运行时配合普通 Windows 安装场景基本用不到但在 AI 应用开发里算是给数据库能力打开了口子。除此之外9.0 还删掉了一批被废弃的老配置项安全默认值也比以前更严格。所以如果你是在生产环境用 MySQL我的建议还是老老实实装 8.4 LTS不要图新。如果你和我一样想在本地拿一个新版本跑实验、写测试代码、学习最新特性那 9.0 很合适。后面所有步骤我都基于 Windows 10/11 64 位系统实测。1.2 用户场景与两种安装方式的取舍Windows 上装 MySQL 9.0主流方式就两条MySQL Installer 图形化安装和ZIP 免安装包手动配置。MySQL Installer 是官方提供的图形界面安装工具交互式点选自动处理依赖、服务注册、root 密码设置这些事特别适合新手或者想快速把环境跑起来的人。缺点也很明显安装器本身比较重步骤多而且它会顺带加载一系列官方组件比如 Workbench、Router、ODBC 驱动如果你只想要一个数据库服务会觉得有点啰嗦。ZIP 包手动配置则是把所有步骤摊开在你面前解压到指定目录、自己写 my.ini、命令行初始化数据目录、手动注册 Windows 服务。这种方式更透明出问题的时候你能清楚知道是哪一步挂了同时占用的系统文件也更少。如果你之后想做一个绿色版 MySQL 随身携带也基本是走这条路线。我把两者对比放在一张表里方便你根据自己情况做决定对比维度MySQL Installer 图形化ZIP 包手动配置上手难度低全程点按钮中需要命令行操作安装速度3~5 分钟包含依赖检查和组件下载5 分钟以内可控性依赖安装器逻辑隐藏了部分细节完全可控每一步都看得见适合场景新手、快速开发环境定制化部署、绿色版、学习原理排障友好度一般报错直接弹窗信息有限高可以精确到日志和参数我个人在开发机上的选择是 ZIP 方式因为可控而且这次要写教程走一遍能验证每个命令的细节。如果你只是想快速用起来可以直接跳到第 2 章。2. 获取安装包与 MSI 图形化安装2.1 从官网正确获取 MySQL 9.0 安装包无论走哪条安装路线安装包都得从官方渠道拿。MySQL 的下载页是MySQL Community Downloads进去以后选MySQL Community Server在版本下拉框里选择 9.0 系列然后根据系统选Windows (x86, 64-bit)。推荐优先走官方下载页因为国内很多第三方下载站会给 MySQL 包塞私货或者捆绑浏览器插件不划算。官网下载速度如果慢可以用页面里提供的镜像站点选一个离你近的镜像即可。注意官网下载区同一个版本会提供三种格式MSI Installer、ZIP Archive、以及带调试符号的包。普通用户只需要前两种。MSI 适合走图形化安装ZIP Archive 适合手动解压部署。我的建议是要省事就下载 MSI要干净就下载 ZIP不要两个都下没意义。下载过程中有一点容易忽略MSI 分两种安装包一个是mysql-installer-community-9.0.0.msi完整安装器一个是mysql-server-9.0.0-winx64.msi仅服务器内核。前者会引导你装组件和配置服务后者只是把数据库核心文件装进去后续还得自己初始化。我这次用的前者对新手最友好。2.2 MSI 图形化安装操作详解双击运行 MSI 后按照下面的顺序操作基本不会出幺蛾子选择安装类型安装器会列出 Developer Default、Server only、Custom 等选项。我只推荐选Server only。Developer Default 看着方便实际上会拉进来一堆你用不到的东西比如 MySQL Router、ODBC 驱动、Python 连接器装完以后占用大卸载也麻烦。检查系统依赖安装器会检查当前环境是否满足要求比如缺 Microsoft Visual C Redistributable 会提示你先装。这一步直接点 Execute 让它自动装即可。Type and Networking这里保持默认就行端口默认3306。如果你的机器上已经跑着别的 MySQL 或其他服务占用了 3306记得在这里换一个端口后面所有客户端连接都要跟着改。认证方式MySQL 9.0 默认使用caching_sha2_password这是官方推荐的认证插件安全性更好。如果你只在本地开发测试不需要额外调整直接下一步。但如果你的同事或旧客户端用的是老驱动这一步可以考虑选择 Use Legacy Authentication对应 mysql_native_password否则后面可能会报驱动不支持 caching_sha2_password 的错误。老驱动的情况我在第 5 章会展开讲。设置 root 密码这是安装过程中最关键的步骤。输入一个你记得住的强密码比如至少 8 位、包含字母数字和特殊符号。同时可以顺手添加一个普通业务账号用于平时连接避免所有应用都拿 root 操作。Windows Service 配置勾选 Configure MySQL Server as a Windows Service服务名保持默认的MySQL90启动类型选Automatic这样 Windows 开机后数据库会自动后台运行不用每次手动敲 net start。Apply Configuration安装器开始写入配置、初始化数据目录、启动服务。这一步如果报错别急着重装先看它卡在哪一步。大部分情况是端口被占或权限不足去系统事件查看器里能看到更多细节。完成全部打勾通过以后MSI 方式就算搞定了。你可以直接在命令行执行mysql -u root -p测试连接。MSI 方式把最复杂的初始化、服务注册都封装掉了装完即用对新手确实友好。但如果你想完全掌握 MySQL 在 Windows 上的运行机制我还是建议接着往下看 ZIP 方式理解底层逻辑。3. ZIP 免安装包手动初始化与注册服务3.1 解压与目录规划ZIP 方式的起点是官网下载的mysql-9.0.0-winx64.zip解压以后你会得到一个和包名相同的目录里面默认只有 bin、include、lib、share 等子目录。注意这个状态下还没有data目录也没有my.ini不能直接运行 mysqld 启动数据库必须先完成初始化和配置。解压路径有几个讲究路径不要含中文不要含空格否则后面注册服务和读取配置时容易出现诡异的问题。建议放在一个短路径下比如C:\mysql\mysql-9.0.0-winx64。我见过有人放C:\Program Files\MySQL\Server\9.0虽然也能跑但命令行操作时路径太长敲起来很痛苦。解压完成后确认 bin 目录下能看到mysqld.exe和mysql.exe这是核心程序。我习惯把压缩包里的目录重命名成C:\mysql\mysql-9.0.0-winx64这样路径短后续所有命令都清晰。如果你自己规划了别的路径下面的命令里所有路径都要同步替换别漏。3.2 编写 my.ini 配置ZIP 包默认没有配置文件需要自己建一个my.ini放在解压后的根目录下。MySQL 在 Windows 上启动时会按顺序查找配置文件常见查找位置包括系统目录、当前工作目录、basedir 目录但为了精确可控我建议在注册服务时用--defaults-file参数显式指定配置文件路径而不是赌它默认扫到哪个文件。我的开发机上一个最精简的my.ini长这样[mysqld] basedirC:/mysql/mysql-9.0.0-winx64 datadirC:/mysql/mysql-9.0.0-winx64/data port3306 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci max_connections200 [client] default-character-setutf8mb4这里几个参数的作用值得解释清楚basedirMySQL 的安装根目录程序文件所在位置。datadir数据文件目录表数据、日志、错误日志都放这里。这个目录可以不在 basedir 下面但路径必须存在并且是绝对路径。port监听端口默认 3306。如果被占用就改别的比如 3307。character-set-server和collation-server数据库默认字符集和排序规则。统一设成 utf8mb4 是为了避免中文乱码这个在第 5 章会展开说。max_connections最大连接数。开发机设 200 足够如果只是个人测试也可以不写用默认值。写配置文件时有一个非常容易踩的坑Windows 记事本默认编码是 UTF-8但如果里面有中文注释MySQL 在解析 my.ini 时可能因为编码问题读到异常内容导致配置静默失效甚至服务起不来。我的习惯是配置文件里全程用英文不用任何中文注释彻底避开这个坑。3.3 初始化数据目录与注册 Windows 服务配置文件写好后打开一个管理员权限的 CMD开始菜单里搜 CMD右键以管理员身份运行然后依次执行下面的命令。解释一下每个命令的目的第一步进入 bin 目录cd /d C:\mysql\mysql-9.0.0-winx64\bin第二步初始化数据目录mysqld --defaults-fileC:/mysql/mysql-9.0.0-winx64/my.ini --initialize-insecure --console--initialize-insecure的意思是以安全模式初始化数据目录生成的 root 用户密码为空方便首次进入后再改密码。加上--console是确保初始化信息直接输出到当前命令行窗口而不是写入日志文件这样你能直接看到有没有报错。如果初始化成功bin 同级的目录下会出现一个data文件夹里面有一个auto.cnf和以机器名命名的.err日志文件。如果不用--initialize-insecure而用--initializeMySQL 会生成一个随机临时密码并且输出到控制台。这么做的安全性更高但你必须马上记下那串临时密码。第一次没经验的时候我没注意窗口一关就找不到了最后只能删除 data 目录重新初始化白折腾十分钟。第三步注册 Windows 服务mysqld --install MySQL9 --defaults-fileC:/mysql/mysql-9.0.0-winx64/my.ini--install表示把 MySQL 注册成系统服务服务名叫MySQL9。注册成功会提示Service successfully installed。这里指定--defaults-file能让服务启动时精确读取你写的配置避免它去别的路径扫到一堆乱七八糟的配置文件。第四步启动服务net start MySQL9如果启动成功命令行会显示MySQL9 服务正在启动然后服务已经启动成功。此时可以顺手验证一下mysql -u root -p因为刚才初始化用的是--initialize-insecureroot 密码为空所以这一步直接回车就能进到 MySQL 命令行看到mysql提示符。进去以后马上改密码这一步放到第 4 章讲。如果net start报错别慌绝大多数是配置或权限问题对应的排查方法在第 5 章。3.4 服务停止、删除与日常工作命令手动安装之后日常的启停命令也顺便列一下以后会频繁用到net stop MySQL9 net start MySQL9如果要彻底卸载服务mysqld --remove MySQL9删除服务前一定先确保服务处于停止状态否则会提示服务正在运行无法移除。还有一个细节mysqld --install注册的服务在 Windows 服务管理器里显示的是本地系统账户运行如果你想指定一个低权限的 Windows 用户来跑 MySQL要在安装服务时加--local-service参数生产环境建议这么做开发机直接用默认本地系统就行。4. 环境变量、root 密码与日常连接4.1 配置环境变量告别每次敲全路径ZIP 方式装完以后你每次想执行mysql命令都得先cd到C:\mysql\mysql-9.0.0-winx64\bin或者敲全路径C:\mysql\mysql-9.0.0-winx64\bin\mysql.exe这太难受了。正确做法是把 bin 目录加入系统 PATH 环境变量。操作路径是右键此电脑 → 属性 → 高级系统设置 → 环境变量 → 找到系统变量里的Path→ 编辑 → 新建 → 填入C:\mysql\mysql-9.0.0-winx64\bin。确认保存后重开一个 CMD 窗口执行mysql --version如果输出了类似mysql Ver 9.0.0 for Win64 on x86_64的信息说明环境变量生效了。以后在任意目录下都能直接输入mysql、mysqldump等命令不用再拼路径。这里有一个容易忽略的点环境变量的修改只对新的命令行窗口生效。如果你改了 PATH 之后还在旧窗口里测试大概率提示不是内部或外部命令这时不是配置错了而是窗口没重开。4.2 设置和重置 root 密码的两种方式ZIP 方式初始化完root 密码为空必须马上设置否则数据库裸奔在网络上是很危险的。进入 MySQL 命令行后执行ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;执行完后用FLUSH PRIVILEGES;刷新权限缓存然后EXIT退出再用mysql -u root -p重新登录验证密码是否生效。这一步验证别偷懒我经常看到有人设置完就以为完事了结果重启后连接不上才发现密码写错了。如果密码设置完之后忘了也别慌Windows 下可以通过跳过权限表的方式重置停止 MySQL 服务net stop MySQL9。在命令行窗口前台启动跳过权限检查的模式mysqld --defaults-fileC:/mysql/mysql-9.0.0-winx64/my.ini --skip-grant-tables --shared-memory--shared-memory是 Windows 专属参数让 MySQL 通过共享内存方式监听避免网络端口冲突。注意这个窗口会一直占着不要关另开一个新的 CMD。新窗口执行mysql -u root进入后执行FLUSH PRIVILEGES;然后ALTER USER rootlocalhost IDENTIFIED BY 新密码;。回到第一个窗口按 CtrlC 停止这个临时 MySQL 进程再用net start MySQL9正常启动服务。这个重置思路在 8.x 上也一样适用9.0 没有本质变化。注意--skip-grant-tables模式下任何本地用户都能无密码连上数据库操作完一定要立刻停掉这个进程不能在开放网络环境下开着。4.3 选择顺手的连接工具MySQL 装好以后日常操作不一定非要在黑窗口里。常用的连接工具有这些命令行 mysql最基础、最可靠适合快速查询和管理。DBeaver免费的通用数据库客户端支持连接多种数据库对新手很友好UI 直观。MySQL Workbench官方出品的图形化管理工具MSI 安装时如果选了 Developer Default 会一起装功能全但界面稍微有点笨重。Navicat商业软件界面好看功能强大适合不差钱或公司用正版的情况。我的建议是日常开发连 MySQL用 DBeaver 或者自己习惯的 IDE 插件比如 VS Code 的 Database Client就够了命令行作为兜底工具必须会。另外如果你的开发语言是 Java 或 Python连接 MySQL 9.0 时驱动版本都要跟上Java 的 JDBC 驱动至少要用 mysql-connector-j 8.0.11 以上版本否则默认认证插件caching_sha2_password会握手失败。Python 的 PyMySQL 或 mysql-connector-python 尽量装新版老版本可能会报Authentication plugin caching_sha2_password is not supported。这两种情况本质都是认证插件兼容性问题不是数据库装坏了换掉驱动就行不要硬改数据库认证配置。5. 常见安装问题与排查技巧5.1 服务启动失败1067 错误与 .err 日志Windows 下 MySQL 启动失败最常见的就是服务管理器的错误 1067进程意外终止。这个错误信息非常笼统只告诉你进程挂了没告诉你为什么挂。这时候真正的排障入口是错误日志。错误日志的位置就在datadir目录下文件名是机器名.err。找到它打开最后几十行绝大多数情况下真相都在那里。我这次安装过程中实际上也踩了启动失败的坑日志里显示[ERROR] [MY-010187] Cant create directory C:\mysql\mysql-9.0.0-winx64\data\原因是 data 目录的权限不足。MySQL 服务是以本地系统账户运行的理论上对C:\mysql应该有完全控制权但如果你解压 ZIP 时用了某个受限账户可能会导致目录 ACL 异常。解决办法是右键C:\mysql\mysql-9.0.0-winx64目录 → 属性 → 安全 → 编辑 → 给 Users 或 SYSTEM 添加完全控制权限。生产环境更严谨的做法是只授权给服务运行账户开发机直接 Everyon 完全控制虽然省事但不推荐。其他常见启动失败原因my.ini中basedir和datadir路径写错尤其是把反斜杠\写少了或者路径末尾多了个空格MySQL 解析时会直接报无法找到文件。datadir指向了一个已经有内容的非空目录初始化时不会自动覆盖会报directory isnt empty。端口被占cant bind to address用netstat -ano | findstr 3306查谁占用了端口。排查顺序我总结成一个清单打开data\机器名.err日志先看最后 20 行有没有明确[ERROR]。验证 my.ini 路径是否正确路径里的斜杠建议统一用/Windows 的 MySQL 也是认这个的。确认端口没有被占用。检查目录权限。5.2 连接被拒绝与 root 密码错误连接时最常见的两个报错ERROR 1045 (28000): Access denied for user rootlocalhost这个报错是密码不对或用户不存在。如果是密码不对重新走一遍 4.2 的重置流程。如果确认密码没错但还是连不上检查一下 root 用户的 host 字段localhost和127.0.0.1在 MySQL 的账号体系里是两个不同的登录入口。ERROR 2003 (HY000): Cant connect to MySQL server on localhost:3306这个报错是根本连不到服务可能原因有MySQL 服务没启动先net start MySQL9。端口不对你用了 3307 启动却拿着 3306 连接修改-P参数即可。防火墙拦截本地连接一般不会远程连接大概率是这个原因。解决方法是添加一条入站规则放行 3306 端口或者用命令行netsh advfirewall firewall add rule nameMySQL3306 dirin actionallow protocolTCP localport3306这条命令要以管理员身份运行。注意放开端口后 MySQL 也直接暴露在网络上建议 root 只允许 localhost 登录业务账号按需授权。ERROR 2059 (HY000): Authentication plugin caching_sha2_password cannot be loaded这个报错基本只出现在旧版客户端工具或旧驱动上。MySQL 9.0 默认认证插件是caching_sha2_password如果你的客户端版本太老、只认识mysql_native_password就会报这个错。正确做法是升级客户端驱动或工具如果实在不行可以单独创建一个使用mysql_native_password认证的账号来适配老客户端但不要为了兼容把整个数据库的默认认证方式都改回老协议。5.3 命令行中文乱码与字符集问题Windows 下装 MySQL另一个高发问题是中文乱码。你往表里插入中文查出来变成??或者浣犲ソ这种看不懂的字符。原因一般有三层数据库层面的字符集没设置对。表或库的默认字符集不是 utf8mb4导致存入的中文没法正常编码。排查方式是在 MySQL 里执行SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE character_set_database;如果返回的不是utf8mb4在 my.ini 的[mysqld]段加上character-set-serverutf8mb4并确保建库时指定字符集CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;客户端连接时字符集不对。命令行连接时MySQL 客户端的默认字符集可能被系统代码页影响连接后执行SET NAMES utf8mb4;能临时解决。一劳永逸的办法是在 my.ini 的[client]段落加default-character-setutf8mb4或者在命令行启动时加--default-character-setutf8mb4。Windows 命令行代码页问题。CMD 默认代码页可能是 936GBK或者 437这会导致显示中文时乱码。先在命令行执行chcp 65001再启动 mysql显示就正常了。还有一个容易忽略的地方如果你用 Java 程序连 MySQL连接字符串里一定要加characterEncodingutf8和serverTimezoneAsia/Shanghai否则即使数据库端字符集没问题应用层写入时也会编码错乱。Python 连接器则多用charsetutf8mb4参数。5.4 快速定位配置文件的技巧最后分享一个我压箱底的排查技巧装完 MySQL 后如果发现改动的配置参数没生效八成是配置文件读的不是你以为的那个文件。在命令行里执行mysqld --verbose --help | findstr my.iniMySQL 会把当前实例实际读取的配置文件路径打印出来。我见过有人在 C 盘根目录遗留了一个旧版本的 my.ini导致新装的 MySQL 9.0 始终读不到解压目录下的配置折腾了大半天。用这个命令一查立刻定位到问题。这个技巧同样适用于 8.x 和更早版本Windows 和 Linux 都适用。6. 安装完成后的几个必要检查6.1 确认服务、端口与防火墙状态MySQL 装完能连上并不代表万事大吉。我建议花两分钟做一次状态确认net start | findstr MySQL9 netstat -ano | findstr 3306net start会列出当前运行的系统服务确认 MySQL9 在启动状态。netstat能看到 3306 端口是否在监听。如果 Windows 服务管理器显示服务自动启动但开机后还是连不上大概率是防火墙拦截导致服务启动时网络初始化失败。如果希望局域网内其他机器也能访问这台机器的 MySQL在防火墙放行端口后还要检查 MySQL 用户的 host 是否允许远程登录。默认 root 只允许localhost远程连过来会直接Access denied。正确做法是创建专用账号CREATE USER dev192.168.% IDENTIFIED BY 强密码; GRANT ALL PRIVILEGES ON *.* TO dev192.168.%; FLUSH PRIVILEGES;把 host 设置成%也能用但等于所有机器都有这个账号的登录权限风险大能精确到网段就精确到网段。6.2 统一字符集、时区与默认存储引擎连接上 MySQL 后执行这条 SQL 快速体检SELECT VERSION(); SHOW VARIABLES LIKE character_set_server; SHOW VARIABLES LIKE time_zone; SHOW VARIABLES LIKE default_storage_engine;character_set_server应该是utf8mb4如果不是检查 my.ini。time_zone默认是SYSTEM一般跟随 Windows 系统时区问题不大。但如果是 Java 应用连接串里务必加serverTimezoneAsia/Shanghai否则 JDBC 驱动可能因为拿不到时区直接报错。default_storage_engine在 9.0 里默认是InnoDB这个保持不变不用改。另外MySQL 9.0 对底层数据字典的约束比 8.0 更严格一些老的 MyISAM 做法的表尽量在建表时显式指定ENGINEInnoDB后续运维会省不少事。6.3 别忘了备份与版本策略提醒最后提醒一句MySQL 9.0 是 Innovation 版本不是 LTS官方对它的维护支持周期会比较短。你可以把它当玩具、当测试环境、当新特性体验场但别在重要生产业务里长期依赖它。等 8.4 LTS 的下一个大版本 LTS 出来以后再考虑迁移。我个人的建议是开发机可以大胆用 9.0公司的关键业务数据库继续跑 8.4两边都不耽误。如果你的机器上之前装有旧版 MySQL升级前一定先mysqldump备份数据最好在另一台机器上模拟升级一遍。Windows 上升级 MySQL 的过程其实不复杂但要是没备份就直接替换 data 目录或者跑升级命令数据损坏的风险是实打实的。结语与一点个人体会我实际在 Windows 上装完 MySQL 9.0 之后最直接的感受是初始化方式更规范了数据目录管理也更严格。如果之前已经在用 8.x平滑迁移成本不大如果是全新安装我更建议先走一遍 ZIP 手动方式因为能看到每一步到底做了什么后面遇到问题排查起来心里有数。等你把 ZIP 方式彻底跑通再用 MSI 方式装其他环境速度会快很多因为你已经知道每一步背后在干什么了。最后再分享一个小技巧给 MySQL 单独建一个专用目录比如C:\mysql把安装包、解压目录、配置文件、备份脚本都放在一起命名统一。别小看这类整理工作我见过太多人几个月后连自己当初把数据库装在哪里都找不到更别提做版本升级和迁移了。整洁的目录结构是所有后续运维工作的基础。