ARTICLE DETAIL

资讯详情

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

MySQL 9.1.0 Windows ZIP 手动安装:配置文件、初始化与启动

MySQL 9.1.0 Windows ZIP 手动安装:配置文件、初始化与启动 1. 写在安装之前这台机器和那个版本你真的想清楚了吗先说结论MySQL 9.1.0 是 MySQL 在 2024 年发布的创新版Innovation Release不是长期支持版。这个定位意味着两件事——第一它能让你提前用上最新特性比如性能调优方面的改进、安全模块的更新第二它的迭代节奏比 LTS长期支持版快得多如果你追求稳定、打算部署到生产环境我更推荐你去看 8.0 系列或者 8.4 LTS。但如果你是想在自己电脑上搭一套新环境、学习新功能、做本地开发或者纯粹想看看 MySQL 最新版本长什么样那 9.1.0 完全值得一试。动手之前我还想再啰嗦一句很多人装 MySQL 失败不是操作不对而是没搞懂“我到底要装一个什么形态的 MySQL”。Windows 上有图形化安装包有解压即用的 ZIP 包Linux 上有 RPM、DPKG、二进制包还有 Docker 镜像。每一种方式都有它的适用场景。我这篇文章会以ZIP 解压版 命令行配置为主线因为这种方式最透明、最可控能让你清楚地看到 MySQL 在系统里干了什么也最容易排查问题。如果你后面要写脚本自动化部署这套思路同样能直接搬过去。开始之前先把你在做的事想明白我们要下载一个 MySQL 9.1.0 的压缩包把它解压到指定目录然后通过配置文件告诉 MySQL“我的数据放哪、端口是多少、字符集用什么”接着初始化数据目录、启动服务、设置 root 密码最后用一个客户端连上去验证。就这么几件事。难点不在“点哪个按钮”而在“每一步的命令为什么要这么写、参数是什么意思”。2. 下载与解压官网下载、版本选择和解压目录规划2.1 怎么从官网找到真正的 MySQL 9.1.0如果你的网络环境支持访问 MySQL 官方网站那我建议直接访问 MySQL 官方下载页。说到“官网”我要插一句题外话MySQL 的下载页在过去的几年里改版了好几次很多老教程里的链接早就失效了。你搜索的时候看到 www.mysql.com 才是官方站最好少碰那些名字里带“高速下载”“破解版”“一键安装包”的站点——那些东西轻则捆绑垃圾软件重则在安装包里塞木马千万别图省事。在官网找到 “MySQL Community Server” 下载入口在版本列表里选择 9.1.0。接下来要选择操作系统这里有个关键点Windows 平台上MySQL 提供了两种格式一种是Windows (x86, 64-bit), ZIP Archive一种是Windows (x86, 64-bit), MSI Installer。很多人直接选了 MSI 安装包因为它有图形界面、能一键装好。但我的建议是如果你打算认真学 MySQL或者说你以后有可能要部署到 Linux 服务器上务必选 ZIP Archive。原因有三MSI 安装包会把配置项分散到图形向导里装完你还是不知道配置文件到底在哪、改了哪些东西。ZIP 包解压之后就是一个完整的 MySQL 目录你可以手动控制它的一切行为出了问题也知道去哪个文件里找原因。ZIP 包的部署方式和 Linux 上的二进制包极其相似你在 Windows 上练熟了以后切到 Linux 也一样用。ZIP 包的下载体积大约在 200MB 左右根据你的网速等个几分钟很正常。下载完成后你会得到一个形如mysql-9.1.0-winx64.zip的文件。2.2 解压目录规划别把 MySQL 放在带空格的路径里拿到压缩包下一步是解压。这一步看起来简单但坑非常多我一个个说。首先解压到什么位置网上很多教程喜欢装到C:\Program Files\MySQL因为这是 Windows 默认的软件安装位置。但我强烈建议你换一个路径比如D:\mysql-9.1.0或者C:\mysql-9.1.0——总之路径里不要有空格不要有中文。为什么因为 MySQL 的配置文件、命令行参数和日志系统对路径的处理非常敏感。Program Files中间的空格在命令行里偶尔会引发一些很诡异的解析问题尤其当你用脚本开启服务、写定时任务的时候疼过的人都知道我在说什么。中文路径就更不用提了有些工具链在编码处理上不过关会出现字符集错乱。其次解压出来的文件夹名字也别乱改。mysql-9.1.0-winx64这个名字本身就很清楚你可以在它外面套一层父目录把整个目录放到你想放的位置比如D:\tools\mysql-9.1.0-winx64但尽量别在压缩包内部改名。保持结构完整后面我们做环境变量、修改配置的时候会省很多事。解压完成后建议先打开这个目录看一眼结构。你会看到这些子目录bin/MySQL 的核心可执行文件包括mysqld服务器、mysql命令行客户端、mysqladmin管理工具等。docs/文档包括一些示例和变更日志。include/头文件如果你要用 C/C 开发连接 MySQL 程序会用到它。lib/库文件。share/错误消息、字符集等共享资源。LICENSE和README不用多看。请注意这时候你打开bin目录直接运行mysqld是跑不起来的。你还需要创建配置文件和数据目录这就是下一节的内容。3. 配置文件与数据目录my.ini 的编写逻辑和初始化前必做的事3.1 my.ini为什么 MySQL 在 Windows 上必须手动给出这个文件服务端软件的常规套路是程序本体是一套运行时数据是另一套。MySQL 在 Windows 上运行时需要知道三件事我的数据和日志放在哪个目录我监听哪个端口用什么协议我的字符集等默认行为是什么这些信息MySQL 会去读取一个配置文件。在 Linux 上这个文件的默认名字是my.cnf在 Windows 上它就是my.ini。你用 ZIP 包解压出来的目录里默认没有这个文件原始的压缩包里只带了一个my-default.ini之类的示例配置不同版本可能略有差异。带 MSI 安装包之所以“傻瓜”就是因为它自动替你生成了这个文件。我们手动安装就得自己写。那这个文件放哪有个取巧的办法放在 MySQL 的解压根目录下也就是D:\tools\mysql-9.1.0-winx64\my.ini。启动mysqld时它会按顺序去若干个默认位置寻找配置文件当前目录就是其中之一。手动指定的方式更稳妥我会在下一节讲到。下面是我这份配置文件的初始内容。为了带你理解我特意加了注释[mysqld] # 端口号默认是3306 port3306 # 指定MySQL安装目录也就是你解压的目录 basedirD:/tools/mysql-9.1.0-winx64 # 指定数据目录专门存放数据库文件 datadirD:/tools/mysql-9.1.0-winx64/data # 字符集设置 character-set-serverutf8mb4 # 默认存储引擎 default-storage-engineINNODB # 允许最大连接数 max_connections200 [client] # 客户端默认连接的端口 port3306 # 客户端默认字符集 default-character-setutf8mb4你可能会问utf8mb4是什么简单说这是 MySQL 里真正意义上支持完整 Unicode 的字符集能存下 emoji 表情这些四字节字符。老的utf8在 MySQL 里实际是utf8mb3只能存三字节遇到生僻字或者表情就抓瞎。现在新装环境无脑选utf8mb4就对了。注意我这里路径用的是正斜杠/。在 Windows 的 ini 文件里反斜杠\有时候会被转义处理引起路径识别错误所以保险起见全部用正斜杠。3.2 初始化数据目录mysqld --initialize-insecure 和 --initialize 怎么选有了配置文件下一步就是初始化。这一步干的事是在datadir指定的位置创建 MySQL 的系统数据库比如mysql库里面存了用户、权限信息同时生成一些必要的日志文件。如果跳过这步直接启动服务mysqld会报错退出告诉你数据目录未初始化。在 MySQL 8.0 之后的版本里初始化命令是mysqld --defaults-fileD:/tools/mysql-9.1.0-winx64/my.ini --initialize-insecure这里我给你解释一下两个细节。第一--defaults-file参数的作用是指定配置文件路径。如果你的my.ini就放在解压根目录按道理mysqld能自己找到它但我建议每次都手动指定因为一旦你当前命令行的工作目录不在 MySQL 目录下默认搜索路径就会变得不可控而这个参数能保证万无一失。第二--initialize-insecure和--initialize的区别。前者会生成一个root 密码为空的超级管理员账号后者会生成一个随机密码并把这串随机密码写到 error log 里。看到这你可能觉得那肯定选--initialize-insecure啊省事。别急我的建议恰恰相反如果这不是你自己的测试机而是公司分配的机器一定要用--initialize因为随机密码意味着初始状态下只有你知道或者说只有 log 文件里有安全性高得多。如果只是自己本地学习用那--initialize-insecure更顺手我们后面可以直接免密登录、再手动改密码。重要提示无论你选择哪一种执行完成后都要去检查一下datadir目录是否创建成功里面是否生成了mysql、performance_schema、sys这些子目录。如果初始化报错八成是配置文件路径写错了或者basedir和datadir的路径不存在。请先回头仔细查一遍路径。3.3 初始化失败最常见的 3 个原因我把这块单独拎出来写是因为我看过太多人卡在这一步。你执行初始化命令后如果看到类似这样的错误[ERROR] [MY-010457] The basedir you specified does not exist.这个信息已经说得很直白了basedir路径不存在。大概率你 my.ini 里的路径和实际解压路径对不上或者你用了中文字符、含有隐藏字符导致 MySQL 读到的路径是坏的。如果看到[ERROR] [MY-010095] Cant open the data directory. Please check that the directory exists and is readable by the current user.这个意思是datadir对应的目录创建不了或者没有写权限。Windows 下如果你把数据目录放在C:\Program Files\这类受系统保护的位置就会出现权限不足的问题。这也是我前面为什么坚持要你把 MySQL 放到一个普通目录。还有一种情况比较隐蔽[ERROR] [MY-013236] The designated data directory ... is not empty. Maybe you have run mysqld on this directory before.datadir目录非空。可能你之前初始化过一次或者是解压时某些文件跑到了data目录里。解决办法是先手动创建一个空的data文件夹或者把data目录里的内容清空再重新执行初始化。4. 启动服务与加入系统服务net start 和 mysqld --install 的区别4.1 前台启动还是后台服务第一次启动建议前台跑初始化完成后数据目录已经就绪。现在有两种启动方式。第一种是前台启动直接执行mysqld --defaults-fileD:/tools/mysql-9.1.0-winx64/my.ini --console--console的作用是让日志直接输出到当前命令行窗口。如果你看到类似ready for connections的日志输出然后窗口就停住了这说明 MySQL 已经成功启动并且在前台运行中。这时候不要关这个窗口一关 MySQL 就停了。你可以再开一个命令行窗口用客户端去连接测试。为什么我建议第一次启动用前台方式因为你能直接看到所有日志。如果启动失败错误信息就在眼前不用去翻文件。排查完问题、确认稳定之后就可以关掉前台进程改用后面说的服务方式。另一种方式是后台启动直接执行mysqld --defaults-fileD:/tools/mysql-9.1.0-winx64/my.ini --daemonize--daemonize参数让mysqld自己后台运行。但在我个人看来这种方式在 Windows 上不如系统服务方便所以更推荐第三种——注册为 Windows 服务。4.2 把 MySQL 注册成 Windows 服务一步到位管理启停在 Windows 上把 MySQL 注册为系统服务的好处非常明显开机自启、可以用net start/net stop管理还可以在服务管理器里看到运行状态。注册命令也不复杂mysqld --install MySQL91这里MySQL91是我给这个服务起的名字你也可以叫它MySQL或者别的。执行这个命令时MySQL 会去读默认的配置文件所以为了保险还是先确认my.ini在 MySQL 的根目录下或者临时指定--defaults-file。如果看到Service successfully installed.的提示说明注册成功。接下来就可以用命令启动服务了net start MySQL91这里要说明一个让人迷惑的地方mysqld --install这个操作其实并不会立刻复制或生成一份新的配置文件它只是在 Windows 服务管理器里创建了一条指向mysqld.exe的启动记录。真正重要的问题是这条服务记录启动时mysqld会从哪个路径读取配置Windows 服务在启动时的工作目录通常不是你命令行里的目录这也是为什么我反复强调要把my.ini放在 MySQL 根目录下或者用--defaults-file显式指定。如果你不想每次启动都手动带参数可以在注册服务后打开注册表编辑器检查一下服务对应的ImagePath值确认里面是否包含了你需要的--defaults-file参数。我见过很多人注册完服务后执行net start MySQL91结果服务闪一下就停掉了去 Windows 事件查看器里才看到一堆日志核心原因基本都是my.ini没被正确读取、datadir路径非法、或者端口被占用。所以这里我把排查顺序给你捋一下先确保data目录里已经有初始化生成的文件。确认my.ini文件编码是纯 ASCII 或 UTF-8不要用带 BOM 的格式。确认 3306 端口没有被其他程序占用。你可以用netstat -ano | findstr 3306查看。确认你当前的 Windows 用户对 MySQL 整个目录有读写权限。如果还是起不来去data目录下的*.err文件里看错误日志这是最准确的诊断依据。4.3 卸载服务与重装服务万一你改配置改糊涂了或者服务注册出了问题想重来一遍可以执行mysqld --remove MySQL91该命令会把这个 Windows 服务删掉。注意删除服务并不会删除你的数据文件所以不用担心数据库内容丢失。如果net start启动失败每次修改完my.ini后你需要先net stop MySQL91再net start MySQL91配置才能生效。5. 连接验证与 root 密码设置从空密码到可用的管理账号5.1 用客户端连接mysql 命令和 PATH 环境变量服务启动成功后打开一个新的命令行窗口试着连接一下mysql -u root -p因为我们是--initialize-insecure初始化的root 密码是空的所以提示输入密码时直接回车即可。如果你用的--initialize那初始随机密码在错误日志里形如[Note] A temporary password is generated for rootlocalhost: xxxxxxxx把那份日志找出来、复制密码即可。不过这里有个前提mysql命令能被命令行找到。如果提示mysql 不是内部或外部命令也不是可运行的程序或批处理文件。说明你还没把 MySQL 的bin目录加到系统环境变量PATH里。操作路径是右键“此电脑” → “属性” → “高级系统设置” → “环境变量” → 在“系统变量”里找到Path编辑新建一条填D:\tools\mysql-9.1.0-winx64\bin确定后重新打开命令行窗口。环境变量这件事看似简单实际非常影响体验。加好之后你在任意目录下都能直接敲mysql、mysqldump、mysqladmin这类命令不用每次 cd 到 bin 目录。命令行工具的便捷度直接决定你后面愿不愿意多敲几个命令所以别省这一步。5.2 修改 root 密码ALTER USER 和 mysql_native_password 的取舍连接上去之后第一件事就是改密码。执行ALTER USER rootlocalhost IDENTIFIED BY 你的新密码;MySQL 把用户的认证插件和密码策略绑在了一起。从 8.0 开始默认的认证插件是caching_sha2_password安全性比老旧的mysql_native_password高不少。但如果你后面的客户端工具比较老比如某些旧版 Navicat、老版本 JDBC 驱动可能不认识这个新插件。这种情况下一旦连接报错你可以临时把用户改成旧的认证方式ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的新密码;不过我个人的建议是尽量别降级。安全性的提升是实打实的而且新版本的工具链基本都已经适配caching_sha2_password了。你更新一下客户端驱动比在服务器上留下一个安全短板要划算得多。5.3 首次登录报错排查cant connect、access denied 分别指向什么来我们看看几个最常见的连接报错以及它们分别对应的原因。如果你执行mysql -u root -p后收到ERROR 2003 (HY000): Cant connect to MySQL server on localhost:3306 (10061)这个10061是 Windows 下的连接被拒绝错误意味着目标端口没有程序在监听。要么 MySQL 服务没起来要么端口写错了。检查服务状态net start | findstr MySQL或者直接netstat -ano | findstr 3306看端口是否在 LISTENING 状态。如果你收到ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)这就更直接了——密码不对。可能是你记错了密码也可能是之前改密码时执行出错。还有一种少见的情况是你用了--initialize初始化但没有注意到随机密码只在日志里出现一次重启后日志会被刷新或者覆盖密码就没了。遇到这种局面最快的恢复办法是走“跳过权限表”模式重置密码操作如下停止服务net stop MySQL91。以--skip-grant-tables模式启动mysqld --defaults-fileD:/tools/mysql-9.1.0-winx64/my.ini --skip-grant-tables这时再开一个命令行窗口登录mysql -u root。执行FLUSH PRIVILEGES;再执行ALTER USER rootlocalhost IDENTIFIED BY 新密码;。退出关掉--skip-grant-tables方式启动的 mysqld重新正常启动服务。这里有一个杀招网上的教程让你直接更新mysql.user表里的authentication_string字段但在 8.0 版本里直接改表里的哈希字符串很容易踩坑因为authentication_string的格式和认证插件强关联你手写一个哈希进去八成不对。最稳妥的办法就是先FLUSH PRIVILEGES然后再用ALTER USER来重置让 MySQL 自己去生成正确的哈希值。6. 日常使用配置与常见问题字符集、远程访问、性能参数6.1 字符集验证为什么你插入中文变成????很多人装完 MySQL一开始不觉得字符集有多大问题直到某天往表里插入中文发现存进去的全是问号才意识到大事不妙。现在的新版 MySQL8.0 以后默认字符集已经是utf8mb4了但有一些历史残留会造成漏网之鱼。比如你建表的时候指定了老的latin1或者utf8或者你的连接对象、Navigation 工具本身默认字符集不是utf8mb4照样会出乱码。所以装完 MySQL我建议你立刻做一次字符集体检。登录后执行SHOW VARIABLES LIKE character_set_%;理想情况下你希望character_set_server和character_set_database都是utf8mb4。另外还要看客户端连接相关的变量比如character_set_client、character_set_connection、character_set_results。这根链路只要有一个环节断了就会出现乱码。在我的实践里最影响日常使用的其实是连接层的字符集。你可以在my.ini的[client]段里设置default-character-setutf8mb4这样从本机用命令行连接时客户端默认就按utf8mb4来发送指令和数据。如果你用的是图形化客户端比如 DataGrip 或新版 Navicat也要在连接配置里把编码选项选为 UTF-8。6.2 远程连接bind_address 和用户权限的双重门槛本地连接搞通了接下来你多半会想从另一台机器连过来。这就涉及两件事MySQL 服务端允不允许外部 IP 访问以及你的用户账号允不允许从非 localhost 主机登录。先看服务端默认情况下MySQL 监听在localhost也就是 127.0.0.1。这其实是个安全默认值——它意味着只有本机上的程序能连数据库外网碰不到你。如果你确实需要远程访问就在my.ini的[mysqld]段里加一行bind-address0.0.0.00.0.0.0表示监听所有网络接口。改完这一行重启服务。再看用户权限。rootlocalhost这个用户只在本地有效远程连的时候 MySQL 会报Access denied。解决办法是创建一个新用户并授权CREATE USER app% IDENTIFIED BY 安全密码; GRANT ALL PRIVILEGES ON *.* TO app%; FLUSH PRIVILEGES;%表示通配所有来源主机你也可以写成具体的 IP比如app192.168.1.%只允许某个网段访问更安全。注意个人非常不建议开放 root 的远程登录权限。一旦数据库被拖了库root 就是最高权限风险太大。专门建一个应用账号权限按需分配这是最基本的数据库安全意识。6.3 日志与备份binlog 和 mysqldump 的初体验MySQL 安装好、能连上、密码改完大多数人就觉得自己“装好了”。但我觉得一个真正可用的 MySQL 环境应该顺手把日志和备份这两个东西确认一下。先看日志。MySQL 有个核心日志叫二进制日志binlog它记录了所有会改变数据的操作是数据恢复和时间点还原的重要依据。8.0 之后默认开启了 binlog但你可以在my.ini里显式确认[mysqld] server-id1 log-binmysql-binserver-id在单机环境下填 1 就行如果你以后搭主从复制这个 ID 必须全局唯一不能和别的节点冲突。再来看备份。命令行工具mysqldump是最常用的逻辑备份工具。写个最简单的全库备份命令mysqldump -u root -p --all-databases D:/backup/all_databases.sql这条命令会把所有数据库导出成一个 SQL 文件。你可以把这条命令配合 Windows 任务计划程序做成每天凌晨自动备份。虽然这不是一个“高级”方案但“有备份”比“备份方式高级”重要得多。先跑通全量备份再去考虑增量、物理备份这才是正确路线。6.4 性能初见内存占用和连接数装完就能感受到的两个指标最后说一个很多人忽略的点MySQL 装完启动后它会占多少内存9.1.0 默认配置下空载状态的mysqld占用大约 300~500MB 内存具体取决于 buffer pool 大小和运行环境。如果你觉得内存吃紧可以去my.ini里调小innodb_buffer_pool_size。举个例子如果你的机器只有 8GB 内存又要跑 IDE、浏览器、Docker那可以把这个值设成 256M 或 512M[mysqld] innodb_buffer_pool_size256M这个参数负责缓存 InnoDB 的表数据和索引数据是 MySQL 内存占用的“大头”。设得越小内存越省但读写性能也会下降。本地开发调试机器256M 完全够用生产服务器才需要根据实际数据量去仔细调这个值。连接数方面默认的max_connections是 151我前面的配置里写了 200。这个数字代表同一时刻最多允许多少个客户端连接。你如果只是自己用完全可以不用管但如果跑了一个小网站可以观察SHOW STATUS LIKE Threads_connected;这个值它显示当前实际连接数一般建议把最大连接数留出至少 30% 的余量别等到全占满了才去改。7. 最后聊几句实在话MySQL 的安装教程网上铺天盖地但绝大多数都停留在“照着敲命令能跑起来”的层面至于每个命令做了什么、每个参数意味着什么、失败了怎么排查反而讲得很少。我这篇文章刻意写得啰嗦就是为了把这些“为什么”补上。你只要能完整走一遍上面的流程后面再遇到 MySQL 相关的问题至少不会两眼一抹黑。我个人在实际操作中的体会是安装这一步真正值钱的经验不是“成功的那一刻”而是“失败后怎么定位问题”。学会看 error log、学会确认端口监听状态、学会用SHOW VARIABLES验证运行参数这三件套比背任何安装步骤都管用。还有个小技巧分享给你每次安装部署完把用到的my.ini完整内容备份一份到网盘或者 Git 仓库里等哪天机器坏了要重建环境拿出来就能直接用省掉重新回忆和踩坑的时间。这个习惯我跟所有组员都强调过它能让你在做任何环境部署时都多一层底气。
返回列表