
MySQL 实验1Windows 环境下 MySQL5.5 安装与配置这个标题放在现在看确实有点复古但恰恰是很多人的第一堂数据库实验课。这几年我在实验室和公司里帮人处理过不少次 MySQL 在 Windows 上的安装配置问题5.5 版本又特别容易在服务注册、my.ini 读取、字符集这几个地方翻车。这篇文章把从下载开始到配置完成的完整路径写清楚同时会解释每一步为什么要这么做遇到问题怎么排查。新手可以照着做运维老鸟也能复习一下老版本的特殊脾气。1. 版本选择与安装前准备1.1 为什么还在用 5.5先确认你的场景先说结论MySQL 5.5 在官方已经停止维护多年。如果你是要做新项目老老实实装 8.0但如果你的课程考试指定了 5.5、或者手里维护的系统只支持 5.5那这篇东西就有用了。我自己碰到过三种场景。一是高校教材还在用 5.5实验步骤全部基于老向导界面装新版对不上二是企业内部老系统连接串只适配 mysql-connector-java 5.x换新版驱动要改一堆代码三是一些开发机性能偏弱5.5 在低配置机器上跑得更轻。确认你是这些场景再往下看否则别浪费时间装过时版本。1.2 下载哪个包MSI 还是 ZIP如果去官网下载页MySQL 的下载入口默认给的是 8.x版本下拉里没有 5.5。要拿 5.5需要跳到官方下载存档页 downloads.mysql.com/archives/installer在 Version 下拉里选 5.5.62。这里注意5.5 系列的最终版本是 5.5.62选它代表补丁相对最全。安装包有两种MSI图形安装向导和 ZIP免安装包。我的建议是第一次装、懒得折腾的人选 MSI下载 mysql-5.5.62-winx64.msi一路向导点下来就行要是你想以后快速迁移环境、或者让这台机器上同时存在多个 MySQL 版本就选 ZIP 包解压部署。ZIP 版看着免安装其实要做的事比 MSI 多一点后面我会专门讲。另外注意位数MySQL 5.5 在老版本里是区分 32 位和 64 位的别在 x64 系统上硬装 x86 包性能差且莫名问题多。如果系统特别老比如 32 位 Windows 或嵌入式测试机才需要特意找 win32 版。下载页的 Platform 下拉里看清 Windows 对应 x64 还是 x86选错了安装阶段可能根本跑不起来。1.3 安装前先检查这几件事第一检查 VC 运行库。MySQL 5.5 在 Windows 下依赖微软 VC 运行库通常机器上装了 VS 或常用软件就能满足。如果 MSI 装一半报缺少 msvcr*.dll或者进程报 0xc000007b 错误先去安装 VC 2008/2010 运行库再重来不要硬着头皮重试。第二检查端口。Windows 机器上很容易有别的服务占着 3306。安装前先执行netstat -ano | findstr :3306如果有输出先把对应进程处理掉否则 MySQL 服务即使装上也可能起不来。这一步比大多数人想象的重要我见过太多人卡在“服务启动不了”上最后发现根本不是 MySQL 的问题。第三检查路径。安装目录和数据目录都不要带中文和空格。有人图方便装在 D:\数据库\MySQL5.5结果服务怎么都启不下来配置文件里路径转义全是坑。建议固定在 D:\MySQL 下路径越短越好。第四注意 Windows 10/11 的兼容性。老的 5.5 MSI 安装器在新系统上有时会弹“此应用无法在你的电脑上运行”。处理办法是右键安装包属性—兼容性—勾选“以兼容模式运行 Windows 7”顺便勾选“以管理员身份运行”基本就能过了。2. 图形化安装路径的完整走法2.1 安装向导里的几个选择双击 5.5 的 MSI前面几步是很老的 Installer 界面。到 Setup Type 时我一般选 Custom自定义安装路径而不是 Typical。Typical 会把它塞到 C:\Program Files 下面目录带空格后面改 my.ini 和找配置文件都别扭。在 Custom 页面MySQL Server 那块是服务器本体Client Programs 默认包含 mysql 命令行工具。如果你的机器上没有别的数据库图形客户端安装完后可以单独装一个开源 DBeaver社区版就够用比很多老工具稳定。选好路径后继续等进度条跑完注意留意最后是否勾选“Configure the MySQL Server now”默认勾选即可。5.5 安装器在最后会启动 MySQL Instance Configuration Wizard也就是配置向导。如果你的机器之前残留过 5.1 之类版本的 MySQL 服务在向导开始前先确认服务列表里没有旧 MySQL有的话先卸干净。否则新旧服务名冲突会让你在配置向导最后一步直接报错处理起来比重装还麻烦。2.2 安装完成后自动弹出的配置向导MSI 安装结束后一般会接着启动 MySQL Instance Configuration Wizard。这个向导负责把你的 MySQL 注册成 Windows 服务、设置 root 密码、选默认引擎和字符集。这一步非常关键因为真正决定“能不能用”的不是安装包而是这份配置。如果你安装时手滑取消了配置向导也别慌。MySQL 5.5 的安装目录 bin 下面有个 MySQLInstanceConfig.exe双击可以随时重新打开。它操作的是当前 basedir 目录下的实例要做的事和安装时一样。配置向导每一步都有英文说明第一次看容易懵。下面的 3.1 节我会拆开逐个讲清楚。在此之前不要手动创建 my.ini向导会自动生成一个放在 C:\ProgramData\MySQL\MySQL Server 5.5\ 下面手工干预反而可能覆盖不全或者出现两份配置文件互相干扰的问题。3. 配置 MySQL字符集、端口与服务3.1 配置向导逐项解析向导第一步让你选配置类型。Detailed Configuration 和 Standard Configuration 的区别在于Standard 只让你设端口、字符集、服务名、root 密码适合什么默认都能接受的建议选 Detailed Configuration多几步但能看到关键选项尤其是字符集和并发数的设置。Server Type 有三个值。Developer Machine 表示这是开发机MySQL 只用最少内存Server Machine 表示和其他程序共同占用资源Dedicated MySQL Server Machine 意味着这台机器专门跑 MySQL内存可以多分配。实验机上选 Developer Machine 足够别选 Dedicated否则它会在低配机器上分配较多内存反而拖慢系统。Database Usage 里Multifunctional Database 会同时支持 InnoDB 和 MyISAMTransactional Database Only 只支持 InnoDBNon-Transactional Database Only 只支持 MyISAM。教学实验经常两种引擎都涉及我一般选 Multifunctional。如果你明确知道只用 InnoDB选第二项会让配置更聚焦。InnoDB Tablespace Settings 和 Concurrent Connections 两步新手通常直接默认。5.5 默认的 InnoDB 表空间文件是单个 ibdata1路径不用改。并发数如果选 Decision Support数据库会倾向于更少的并发OLTP 则相反Manual Setting 里默认给的并发数对单人学习足够了。Networking Options 这一步要勾选 Enable TCP/IP Networking端口保持 3306。“Add firewall exception for this port”建议勾上否则后面用图形客户端从另一台电脑连接时Windows 防火墙会直接拦掉。旁边有 Strict Mode 复选框我建议新手先不勾等建表遇到插入报错再说。严格模式打开后任何一条不合法的 SQL 都会报错你还没弄清规则时很容易被报错吓住。Character Set 建议选第一项 Best Support For Multilingualism它对应 UTF-8。选对字符集是后面中文不乱码的关键。很多老教程会推荐 Manual Selected 后手选 utf8其实效果一样。Windows Options 这一步Install As Windows Service 勾上服务名默认 MySQLLaunch the MySQL Server automatically 勾上就是开机自启。Include Bin Directory in Windows PATH 要留意如果这台机器只装 5.5勾上方便后面在任意 CMD 里敲 mysql如果之后还想装 5.7 或 8.0建议不要勾不然 mysql 命令到底指向哪一版会成为麻烦。最后设置 root 密码。不要设成空密码实验机至少也要有一个你能记住的密码。下面的 Create An Anonymous Account 千万不要勾匿名账户对刚学数据库的人来说就是一个权限大坑出现权限相关的奇怪问题多半和它有关。3.2 免安装 ZIP 版的手动配置ZIP 版步骤其实不多但每一步都要清楚。首先把压缩包解压到 D:\MySQL\mysql-5.5.62-winx64然后在 bin 的同级目录下新建 my.ini。注意 5.5 在 Windows 下的配置文件名习惯用 my.ini放在 basedir 根目录即可MySQL 启动时会按默认搜索顺序找到它。ZIP 版第一次启动前不需要像 MySQL 5.7 那样执行 mysqld --initialize这是 5.5 很反直觉的地方。你直接注册服务并启动mysqld 会在 data 目录不存在时自动创建系统库和系统表。你只需要先建好 my.ini 中 datadir 路径对应的目录再用管理员 CMD 执行下面三条命令cd /d D:\MySQL\mysql-5.5.62-winx64\bin mysqld --install MySQL net start MySQL第一步进入 bin 目录第二步把 mysqld 注册成名叫 MySQL 的 Windows 服务第三步启动服务。如果提示 Install/Remove of the Service Denied说明当前 CMD 没有管理员权限右键以管理员身份运行重来。如果想强制指定配置文件--defaults-file 参数要放在整条命令最前面比如mysqld --defaults-fileD:\MySQL\mysql-5.5.62-winx64\my.ini --install MySQL否则这个参数可能不生效。ZIP 版此时 root 是没有密码的直接 mysql -uroot 能进。用下面的命令补一个密码mysql -uroot然后在 mysql 提示符里执行SET PASSWORD FOR rootlocalhost PASSWORD(你的密码); FLUSH PRIVILEGES;也可以直接用mysqladmin -u root -p password 新密码但前者更容易理解当前在做什么。3.3 my.ini 关键参数说明这里给一份常用的 5.5 my.ini 示例手工配置时可以直接抄[mysql] default-character-setutf8 [mysqld] basedirD:/MySQL/mysql-5.5.62-winx64 datadirD:/MySQL/mysql-5.5.62-winx64/data port3306 character-set-serverutf8 default-storage-engineInnoDB max_connections100 wait_timeout300 interactive_timeout300 skip-name-resolve参数含义逐个说清楚。basedir 和 datadir 必须正确对应等号两边不要有空格路径里用正斜杠可以避免转义问题character-set-server 和 [mysql] 段的 default-character-set 配合保证服务端和命令行客户端都是 utf8default-storage-engine 建议 InnoDB5.5 时代 MyISAM 还在用但 InnoDB 的事务和行级锁对学习更重要。max_connections 100 在实验环境足够。生产环境并发高才需要调大调太大会占内存。wait_timeout 和 interactive_timeout 控制空闲连接超时默认 8 小时设成 300 秒适合连接池场景防止连接池拿到被服务端断掉的连接。skip-name-resolve 让 MySQL 不做反向 DNS 解析不写这一行时远程 IP 连接会尝试解析主机名DNS 慢的情况下一登录要卡好几秒。修改 my.ini 后必须重启服务生效net stop MySQL net start MySQL。重启前先确认没有程序正连着否则连接会直接断开。4. 安装后必须做的连接验证4.1 命令行建库建表实操装完以后第一件事用命令行验证基本功能。打开 CMD输入mysql -uroot -p回车后输入密码。如果提示 ERROR 2003 (HY000)说明服务没起来或端口不对如果提示 Access denied说明密码错了。2003 和 1045 这两个报错在实验报告里出现频率极高记住它们能省去不少排查时间。进来后先看字符集相关的变量SHOW VARIABLES LIKE character_set_%;如果 character_set_server 是 utf8说明 my.ini 生效了。如果还是 latin1多半是你改的 my.ini 没被读取或者改完没重启服务。然后建库建表。下面的语句里故意把 age 字段设置默认值为 0这是一个很常见的需求——建表时希望某个数字列没填值就是 0而不是 NULLCREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARACTER SET utf8; USE testdb; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8; INSERT INTO users(name, age) VALUES (张三, 18); INSERT INTO users(name) VALUES (李四); SELECT * FROM users;第二条 INSERT 没有给 age查询出来就是 0这就是 DEFAULT 0 的作用。注意 5.5 不允许一个表里有多个 TIMESTAMP 列默认当前时间新版 5.7/8.0 放宽了所以实验代码尽量只用一个 created_at。中文能正常插入和查询就说明字符集、引擎、自增主键这些基础点都通了。如果你看到终端里中文变成问号解决办法是退出后用mysql --default-character-setutf8 -uroot -p重连大多数情况能好根治方法还是 5.4 节里的服务端字符集设置。4.2 图形客户端连接与常见连接报错命令行虽然够用但做实验时图形界面往往更直观。常见客户端有 Navicat、SQLyog、DBeaver以及官方 MySQL Workbench。用 Navicat 连接 MySQL 5.5 时连接名随便填主机 127.0.0.1端口 3306用户名 root密码填安装时设置的然后点测试连接。能连上说明 TCP/IP 监听、用户权限、端口都正常。如果测试连接一直提示 10061 Connect refused一般是 MySQL 服务没监听端口。先用netstat -ano | findstr :3306看有没有 mysqld 在监听没有就检查服务是否启动启动失败就去看 5.1 节的日志排查。如果提示 Access denied说明 root 密码不对或者用户表的认证方式和客户端不匹配。5.5 默认是 mysql_native_password新版客户端基本都能兼容真遇到不兼容重新执行SET PASSWORD FOR rootlocalhost PASSWORD(新密码)后再试。关于客户端软件我多说一句请走官网渠道。数据库客户端这个领域网上很多来路不明的所谓激活版更新包可能带恶意脚本实验机上没必要冒这个险。官方试用版完成这门课完全够用或者直接用开源 DBeaver功能不比商业软件差多少。4.3 root 远程访问的授权与风险控制默认情况下root 只能在本机 localhost 登录。如果你需要在局域网里用另一台 Windows 机器连接这台数据库就要放开 root 远程权限。5.5 的授权语法和 8.0 略有差别8.0 里必须先 CREATE USER 再 GRANT而 5.5 支持在 GRANT 语句里直接带 IDENTIFIED BY一条命令就把用户建了。GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY 你的密码 WITH GRANT OPTION; FLUSH PRIVILEGES;这一句的意思是允许 root 从任意主机使用你的密码登录并且拥有所有库所有表的全部权限。注意这是实验环境里为了方便生产环境千万别这么干。更安全的做法是新建专用账号只授权某个库CREATE USER dbuser% IDENTIFIED BY 密码; GRANT ALL ON testdb.* TO dbuser%; FLUSH PRIVILEGES;授权后记得在服务器的 Windows 防火墙里放行 3306 端口否则局域网连接一样超时。如果只在本机用不需要做远程授权rootlocalhost 一直够用。5. 常见问题与排查经验实录5.1 1067 服务启动失败的排查在 Windows 上装 MySQL 5.5遇到最多的就是 1067 错误“Windows 不能在本地计算机启动 MySQL 服务错误 1067进程意外终止。”这个提示看起来吓人其实真实原因都写在错误日志里。默认日志位置是 datadir 目录下文件名是主机名加 .err例如 DESKTOP-ABC.err。用记事本打开直接翻最后一个 ERROR 行。最常见的三类错误。第一my.ini 路径写错日志会报找不到 basedir/datadir排查时检查等号路径是否存在且没有多余空格。第二端口被其他程序占用日志会报 Bind on TCP/IP port: Address already in use。第三my.ini 是 UTF-8 编码且带 BOM日志会报 unknown option 或者解析异常解决方法是把 my.ini 另存为 ANSI 编码或者用记事本重新建一份。另外如果 5.5 装在一台内存很小的机器上并且之前选了 Dedicated MySQL Server MachineInnoDB 初始化可能因为内存不足失败。这种时候把 innodb_buffer_pool_size 调小例如 32M再重启。排查顺序我建议固定成先看 .err 日志再检查端口最后验证配置文件编码。按这个顺序走九成 1067 能快速解决。5.2 3306 端口被占用怎么办前面说过安装前检查端口。这里给具体操作。打开管理员 CMD执行netstat -ano | findstr :3306如果输出里有 TCP 0.0.0.0:3306 之类的行记下最后一列的 PID比如 12345再查这个进程是谁tasklist | findstr 12345如果这个进程是多余的直接结束掉taskkill /F /PID 12345如果占 3306 的本来就是一个旧 MySQL 服务不要 taskkill去服务管理器停掉对应服务防止数据文件损坏。如果 3306 被某个不想关的程序占着那就改 MySQL 的端口在 my.ini 的 [mysqld] 段把 port3306 改成 3307改完重启服务以后连接时端口号一并改成 3307。Windows 上“关闭端口号”这个说法其实不太准确。端口本身不是一个独立服务你要么关掉占用它的进程要么让目标软件换端口。我见过有人为了释放 3306 把整个防火墙关了这是没必要的定位到具体 PID 精准处理就行。5.3 忘记 root 密码的应急恢复忘了 root 密码尤其是课程实验开始前忘了不用重装修改配置文件就能恢复。第一步停 MySQL 服务管理员 CMD 执行net stop MySQL如果服务没在运行就跳过。第二步在 my.ini 的 [mysqld] 段最后加一行skip-grant-tables。第三步net start MySQL重新启动。第四步mysql -uroot直接免密进入因为跳过授权表后 MySQL 不再校验用户密码。第五步执行USE mysql; UPDATE user SET PasswordPASSWORD(新密码) WHERE Userroot; FLUSH PRIVILEGES;注意5.5 修改 root 密码用的字段是 Password后面是 PASSWORD() 函数不是直接把明文填进去。新版本 8.0 用 authentication_string 字段别混了。修完以后把 my.ini 里的 skip-grant-tables 删掉或注释掉再重启一次服务然后用新密码登录。这里有个容易忽略的坑skip-grant-tables 模式下所有账户都免密并且拥有全部权限此时任何能连到 MySQL 端口的人都能进去。所以这个模式绝不能长期开着恢复完立刻去掉并重启。如果是在开放网络环境里操作临时加一条 bind-address127.0.0.1 会更稳。5.4 中文乱码的根治方案中文乱码几乎伴随整个 5.5 时代而且往往是安装时字符集随手选了默认 latin1后面建库建表就全乱。乱码的本质是字符集不一致客户端发送的是 UTF-8服务端以为是 latin1存进去就是乱码读取时又以另一种编码返回就彻底看不明白了。根治思路分两层。第一层服务端设置成 utf8在 my.ini 的 [mysqld] 下写 character-set-serverutf8同时 [mysql] 段写 default-character-setutf8重启服务。第二层所有连接都不绕过客户端字符集。命令行连接用mysql --default-character-setutf8 -uroot -pJDBC 连接串加 useUnicodetruecharacterEncodingutf8图形客户端在连接属性里把编码改成 utf8。如果表已经建好并且数据是乱的实验数据可以直接重建执行ALTER TABLE users CONVERT TO CHARACTER SET utf8可以把已有列转换但如果数据在 latin1 下已经存成乱码转了也未必能还原。最省事的做法是删表重建插入新数据不折腾老数据。生产环境的恢复另说那要找备份和 binlog普通实验别冒这个险。还要知道一点MySQL 5.5 对 utf8mb4 的支持不完善表情符号或生僻字在这版里会很难办。这其实是很多人做完 5.5 实验后选择升级到 5.7/8.0 的真实原因之一。5.5 新客户端报 SSL 连接错误怎么处理MySQL 5.5 时代SSL 不是默认强制使用的。你拿很新的客户端或者中间件去连老库可能报 SSL connection error因为新版安全策略默认要求 SSL 加密而 5.5 默认没启用两边谈不拢就会断。处理方式按客户端来。如果是新版 mysql 命令行可以加--ssl-modeDISABLED参数如果是 Java 的 JDBC 连接连接串里加 useSSLfalse如果是 Navicat 这类图形工具连接设置里去掉“使用 SSL”相关选项直接走明文协议。实验局域网里明文传输问题不大生产环境当然还是要配正式证书开 SSL。如果你的应用确实要求加密连接5.5 也可以配置 SSL但步骤比 5.7 繁琐需要生成证书、在 my.ini 配置 ssl-ca/ssl-cert 参数一般实验没必要走这条路。遇到报错先判断是服务端没开 SSL还是客户端的 TLS 版本不支持老库自带的协议再对症处理。5.6 连接池超时与 wait_timeout 调整这门课如果用 Java 写数据库连接池比如 Apache DBCP 或 C3P0可能会遇到一个诡异的现象程序跑一段时间后第一次拿连接就报 Communications link failure 或者 Connection is not available, request timed out。原因多半是 MySQL 服务端把空闲连接断掉了。MySQL 5.5 默认 wait_timeout 是 8 小时。如果连接池里有一根连接拿到后四五个小时都没有查询服务端可能已经断开它池子不知道下一次取出来直接用就失败。解决办法有两个方向。一是调大服务端的 wait_timeout在 my.ini 里改成 86400 甚至更大改完重启生效二是让连接池定期测试连接有效性DBCP 可以设置 testWhileIdletrue 和 validationQuerySELECT 1这样不用改数据库参数。常用参数整理成表方便直接抄参数含义建议值wait_timeout非交互连接空闲超时300 或更大interactive_timeout交互式连接空闲超时300 或更大max_connections最大连接数100 起testWhileIdle连接池空闲时检查连接truevalidationQuery连接池验证查询SELECT 1300 秒适合大多数实验。如果你希望程序长时间挂机不掉线直接把 wait_timeout 调到 86400。改完记得重启服务或者用SET GLOBAL wait_timeout86400临时修改但重启后仍会回到 my.ini 里的值。6. 从卸载重装到后续升级的注意事项6.1 做到“干净卸载”的几个关键点很多同学第一次装失败后直接把安装目录删掉重新装结果服务名冲突、配置文件残留问题越来越多。MySQL on Windows 的卸载要按几个层次清先是服务和进程再是文件最后看注册表。第一步以管理员身份打开 CMD停服务并删除服务net stop MySQL sc delete MySQL如果服务名不是 MySQL先 net start 看一下实际名称。第二步删除 MySQL 安装目录以及残留数据目录。5.5 的 MSI 安装版数据文件经常不在安装目录而在 C:\ProgramData\MySQL\MySQL Server 5.5\ 下这个文件夹也要删。第三步按 WinR 输入 regedit 打开注册表找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL如果存在就删除。sc delete 通常已经移除服务项但偶尔有残留这一步是补充保险。最后检查 C:\Program Files (x86)\MySQL 或 C:\Program Files\MySQL 下有没有旧组件。全部清干净后重新安装基本不会出现“MySQL 服务名已存在”的提示。6.2 老版本实验环境的后续升级建议5.5 的定位是教学和老项目兼容不建议把它当长期生产库。实验做完后可以考虑往 5.7 或 8.0 走。升级前用 mysqldump 全量备份5.5 自带的导出工具在 bin 目录下执行mysqldump -uroot -p --all-databases C:\backup\all_db_5.5.sql导出文件是纯 SQL 文本5.5 生成的文件拿到 5.7/8.0 里可以导入但要注意两点。一是老库里的 utf8 在 8.0 下会涉及 utf8mb4 的变化表情符合和生僻字存储行为不同二是 sql_mode 不同老代码里常见的宽松写法在新版本默认严格模式下可能报错。经验做法是导入后跑一次 mysql_upgrade让系统表和新版本对齐再逐一验证业务 SQL。如果连 5.5 都只是临时用一次更简单的做法是直接装 8.0 版本库再导入同样的数据。但要清楚5.7/8.0 的安装步骤和 5.5 有区别尤其多了 --initialize-insecure 初始化步骤没有这一步服务也起不来。这些差异后面有机会再单独写。我个人在实际操作中的体会是把整套流程走完你会发现 MySQL 5.5 在 Windows 上能不能装好不取决于点鼠标快不快而取决于三件事安装目录干净不干净、my.ini 里字符集和路径对不对、日志文件有没有看。我最开始被 1067 卡了两天后来养成的习惯是遇到问题先翻 .err 日志不看日志瞎改配置只会越改越乱。希望这篇文章能帮你省下那两天的时间。实验做通了建议顺手把 Linux 版装法也试试服务器环境终究和 Windows 有差异。