ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windows下MySQL 5.5安装配置实战:兼容性、乱码与常见故障排查

Windows下MySQL 5.5安装配置实战:兼容性、乱码与常见故障排查 作为常年跟 Windows 服务器和数据库打交道的人我可以很直接地告诉你MySQL 5.5 这个版本虽然老但直到今天依然有大量存量项目在用。很多企业内部系统、老网站、甚至是一些工业软件的后端数据库都跑在 5.5 上。而 Windows 环境下装 MySQL 5.5 这件事看着简单实际上坑不少——尤其是现在的 Win10 / Win11 系统跟这个 2010 年发布的版本之间存在各种兼容性、权限、组件依赖问题。这篇博文我会把整个安装和配置过程从头到尾拆开讲包括安装方式怎么选、my.ini 怎么写才能避免中文乱码、服务注册失败怎么办、忘记 root 密码怎么救全部是基于我实际动手折腾过的经验。适合这几类人看正在维护老项目的运维、刚接触数据库的初学者、以及需要在本地 Windows 环境复现旧版本数据库环境的开发人员。1. 版本选择与环境摸底动手前必须弄清楚的几件事1.1 为什么还在用 5.5以及它跟新版的本质差异在开始安装之前你先要搞清楚一个根本问题你装的这个 MySQL 5.5到底是一个什么样的版本它不是简单的“旧版”而是 MySQL 发展史上的一个分水岭。5.5 之前的版本默认存储引擎是 MyISAM从 5.5 开始InnoDB 才正式成为默认存储引擎。这意味着 5.5 在事务支持、行级锁、崩溃恢复能力上比 5.1 及之前的版本有了质的提升。但与此同时5.5 的发布时间是 2010 年它的代码和编译环境决定了它跟现代操作系统之间存在一些天然摩擦。比如它官方支持的操作系统是 Windows 7 / Server 2008 R2 那一代你在 Win10 / Win11 上安装时经常需要额外处理运行库缺失、权限策略变更、服务注册方式兼容等问题。我在安装时发现的最典型问题就是缺少 VC 2008 运行库导致安装程序或者 mysqld 进程无法正常启动。如果你是因为老项目必须用 5.5或者是想学习数据库底层原理而选择这个轻量版本那这篇文章的实操路径可以直接照抄。但如果你只是需要一个数据库来测试新项目我建议你换用 8.0 或 5.7别在 5.5 上折腾——老版本的性能、安全性和字符集处理方式应付不了现代应用的需求。1.2 安装前的系统检查清单别急着下载安装包先把环境摸清楚。这一步能省掉后面 80% 的麻烦。第一确认系统类型。右键“此电脑”选择“属性”查看系统类型是 64 位还是 32 位。MySQL 5.5 同时提供 32 位和 64 位安装包但这里有个非常容易踩的坑64 位 Windows 系统也可以装 32 位版本的 MySQL而且某些老项目因为要加载特定版本的 DLL 或驱动反而需要 32 位版本。不过从性能和稳定性角度64 位系统就选 64 位安装包除非项目文档明确要求 32 位。第二检查运行库。MySQL 5.5 的安装程序及 mysqld 依赖 Microsoft Visual C 2008 Redistributable Package。Win7 时代系统可能自带但 Win10 / Win11 基本不会预装。这一步建议直接去微软官网下载 VC 2008 运行库x86 和 x64 都装装完再继续后面的步骤。我试过不装运行库强行安装结果安装向导能走完但最后启动服务时直接报错提示缺少 MSVCR90.dll。第三关闭或调整 UAC用户账户控制。UAC 是 Windows 的一个安全机制它会拦截需要管理员权限的操作。MySQL 5.5 的安装向导在 UAC 开启状态下可能出现界面显示不全、无法写入注册表、服务注册失败等诡异问题。我通常的做法是暂时把 UAC 拉到最低从不通知安装配置完成后再调回来。注意这不是必须的但如果你安装过程中遇到莫名其妙的问题这是一个非常值得尝试的排查方向。1.3 下载渠道与版本细分下载 MySQL 5.5 时需要特别注意Oracle 官网现在的默认下载页面已经看不到 5.5 了你需要去归档页面找。选择具体小版本号时建议选 5.5.62这是 5.5 系列的最后一个版本修复了大量已知 Bug也是我在生产环境里用得最稳的版本。另外要注意区分安装包类型。官网提供的 MySQL 5.5 安装包主要有两类一类是图形化安装向导MSI 格式一类是免安装压缩包ZIP 格式。MSI 适合新手但 5.5 的 MSI 安装器在 Win10 / Win11 上经常出现兼容性问题而且它的配置向导MySQL Instance Configuration Wizard有时候无法正确生成配置文件导致安装完却无法启动。ZIP 免安装版则更适合有经验的用户所有配置都通过手写 my.ini 完成可控性更强。基于这些实际操作经验我个人强烈推荐除非你完全不愿意碰命令行否则优先选择 ZIP 免安装版。下面我会把两种方式的步骤都写清楚但重点放在免安装版上。2. 安装过程全记录从 MSI 向导到 ZIP 免安装的完整路径2.1 MSI 图形化向导安装的步骤与注意事项如果你已经决定用 MSI 安装包那整个流程大概是这样的双击运行安装程序欢迎界面直接 Next选择安装类型时建议选 Custom自定义而不是 Typical典型安装因为 Typical 会默认安装到 C 盘而且自带的一些组件你可能根本用不到。到了 Custom 界面你会看到 MySQL Server、Client Programs、Development Components 等几个大项。如果只是日常使用只需要把 MySQL Server服务器端和 Client Programs命令行客户端装上即可。Development Components 里的 C 语言头文件和库文件是给做嵌入式开发的人用的普通场景可以不装。组件选择完成后进入配置阶段。MySQL 5.5 的最后一步会弹出 Instance Configuration 窗口这里有几个关键选项要注意第一个是 Detailed Configuration 和 Standard Configuration 的选择。选 Standard 会让你省事但它默认字符集是 latin1后面中文乱码问题会非常麻烦所以建议选 Detailed。第二个是在 Developer Machine / Server Machine / Dedicated MySQL Server Machine 三选一中根据你机器的实际用途来选——自己本机开发选 Developer作为团队测试服务器选 Server单独一台机器只跑数据库就选 Dedicated。第三个是字符集选择务必在 Character Set 选项里选中“Best Support For Multilingualism”也就是 UTF-8不要用默认选项。MSI 安装的一个常见坑是配置向导执行到最后一步时卡住或者直接报错。这种情况往往是因为之前卸载过 MySQL 但没有清理干净注册表残留、旧服务项、旧的 data 目录都会干扰配置过程。遇到这种情况正确做法是先彻底清理环境具体清理方法在下一节详述再重新安装。2.2 彻底卸载与残留清理老机器只要这一步没做好后会无期这里必须专门用一个章节来讲卸载清理因为你一旦在安装 MySQL 5.5 的过程中遇到“安装失败”“服务启动不了”“端口被占用”等问题十有八九都是残留惹的祸。我第一次给一台老机器重装 5.5 时就吃过这个亏新版本的服务名被旧版本占用了导致 mysqld 根本起不来。清理流程分四步第一步如果存在 MySQL 服务在命令行输入net start查看服务列表或通过服务管理器查找先用管理员权限的命令行执行sc delete MySQL服务名可能不是 MySQL而是你当初注册的名字比如 MySQL55删除服务。如果服务还在运行先net stop 服务名停止。第二步卸载程序和注册表清理。在“控制面板-程序和功能”中卸载 MySQL然后打开注册表编辑器regedit删除HKEY_LOCAL_MACHINE\SOFTWARE\MySQL和HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySQL如果有 Wow6432Node 这个项说明装过 32 位版本。注意注册表操作有风险不要乱删其他项。第三步删除安装目录和数据目录。很多残留数据都在C:\Program Files\MySQL和C:\Documents and Settings\All Users\Application Data\MySQL或C:\ProgramData\MySQL下面手动删掉。第四步检查C:\Windows\System32\drivers\etc\services文件中是否还有 mysql 相关的端口映射记录如果有可以注释掉。这套清理流程走完你的系统才算真正“干净”。尤其是从 5.7 或 8.0 降级到 5.5 的场景新版本用的数据字典文件结构完全不同残留的 data 目录如果不清理5.5 启动时会直接报错找不到系统表。2.3 ZIP 免安装版解压与初始化重点路径ZIP 免安装版的整个部署流程可以概括为“三步走”解压、写配置、注册服务并初始化。这三步环环相扣任何一步做错都会导致后续无法进行。第一步解压安装包。把下载到的 zip 压缩包解压到你想要的目录。我的习惯是放在D:\mysql-5.5.62-winx64这种不带空格的路径下。这里有个极其重要的注意事项整个安装路径绝对不要包含中文、空格甚至特殊符号否则 MySQL 5.5 在读取配置文件时有可能解析失败导致服务无法启动。这是老版本的通病跟现代程序的处理方式完全不同。第二步创建配置文件 my.ini。解压完成后你会看到根目录下有一个my-default.ini文件这是官方提供的默认模板。我们需要基于它创建自己的配置文件。具体做法是复制一份my-default.ini改名为my.ini然后用记事本注意编码要选 ANSI不要选 UTF-8打开编辑。内容怎么填我会在下一章详细讲这里先不展开。第三步初始化数据目录并启动。以管理员身份打开命令行切换到 MySQL 解压目录的 bin 文件夹下执行mysqld --initialize-insecure。注意MySQL 5.5 的初始化命令和 5.7 / 8.0 不一样。5.5 没有--initialize这个参数它默认在启动时会自动创建系统数据库。如果你直接执行mysqld --initialize反而会报错。正确做法是先执行mysqld --install注册服务然后启动服务5.5 会在启动过程中自动创建data目录和系统表。如果 data 目录不存在启动前的检查阶段会报错但一些小版本的 build 会在 daemon 启动时自动创建所以更稳妥的做法是手动建一个空data目录再启动。2.4 初始化失败的常见表现与应急处理在实际操作中初始化阶段最常见的报错是Fatal error: Cant open and lock privilege tables。这个报错的直接原因是 system 表无法读取而根本原因通常是 data 目录权限不对或者之前已经存在一份不完整的数据。处理方法分两种情况如果 data 目录是你手动建的且是空目录那问题基本在权限上——右键 data 目录属性-安全-编辑给当前 Windows 账户添加完全控制权限如果 data 目录里有文件建议直接全部删掉再初始化一次不要试图保留部分文件。还有一种情况是执行初始化命令时提示msvcr100.dll 丢失。这个就是缺少 VC 2010 运行库的典型症状。微软官方提供了 vcredist 包装好之后重新执行命令即可。我实测过MySQL 5.5 不同的小版本依赖的运行库略有差异有的需要 2008有的需要 2010所以建议把 2008 和 2010 的 x86 / x64 运行库全都装一遍一劳永逸。3. my.ini 配置详解每一个参数背后的含义与真实场景3.1 基础配置端口、路径、存储引擎配置文件是整个 MySQL 5.5 能否稳定运行的核心。很多人装完后发现各种诡异问题——服务启动失败、中文显示乱码、内存占用高得离谱——根源都在 my.ini 写得不完整或者参数值不合理。我这里给出一份经过多次生产验证的配置文件模板然后逐个参数解释它的意义。[client] port3306 default-character-setutf8 [mysqld] port3306 basedirD:\mysql-5.5.62-winx64 datadirD:\mysql-5.5.62-winx64\data character-set-serverutf8 default-storage-engineINNODB max_connections100 query_cache_size64M table_cache256 tmp_table_size32M thread_cache_size8 innodb_buffer_pool_size512M innodb_flush_log_at_trx_commit1 innodb_log_file_size256M log-binmysql-bin server-id1 skip-name-resolve先说[client]和[mysqld]两个分组。[client]下面的配置对客户端程序如 mysql.exe 命令行工具生效[mysqld]下的才是服务器核心配置。很多人会把default-character-setutf8只写在[mysqld]下面结果客户端连接时用的还是默认的 latin1导致中文乱码。正确做法是两处都写上。MySQL 5.5 的字符集设置项有三个character_set_server、character_set_client、character_set_connection配置文件里统一写character-set-serverutf8再加上[client]里的default-character-setutf8是最省事的组合。basedir和datadir这两个参数是重中之重。basedir指向 MySQL 解压目录datadir指向数据文件目录。这两个路径必须写绝对路径而且路径里的分隔符建议统一用反斜杠\或者正斜杠/MySQL 都能识别。但要注意路径末尾不要带多余的斜杠或空格。default-storage-engineINNODB设置默认存储引擎为 InnoDB。上一节说过5.5 开始默认就是 InnoDB其实不写也默认是这个但显式写出来能避免某些第三方工具或脚本在会话级修改默认引擎后引发意外。3.2 字符集与中文乱码的根源中文乱码是 MySQL 5.5 用户遇到的高频问题因为 5.5 时代 UTF-8 的支持还不像后来那么完善。乱码的根源在于服务端、客户端、数据库表、连接通道四个环节的字符集必须保持一致任何一环掉链子中文就会变成问号或者一堆乱码。除了在[client]和[mysqld]两处都配置了 UTF-8你还要在创建数据库的时候指定字符集。很多人忽略这一步直接用默认字符集建库结果表里中文全乱。正确建库方式是CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;这里utf8_general_ci是一个针对 UTF-8 编码的排序规则ci表示大小写不敏感。对于中文内容用这个排序规则基本没有问题。如果你需要存储 emoji 等 4 字节字符5.5 的 utf8 是不够的它最多存 3 字节这是版本限制。还有一个实操细节执行 SQL 建表时如果客户端工具自身用的不是 UTF-8 编码即使数据库字符集正确也无济于事。建议用命令行客户端时先执行SET NAMES utf8;再执行建表和插入操作用图形化工具如 Navicat但注意要用兼容老版本连接的版本时把连接字符集设置为 UTF-8。3.3 内存相关的几个关键参数MySQL 5.5 是在物理机内存普遍偏小的时代设计的它的内存管理方式相对保守。但如果你的 Windows 机器配置较高比如 16GB 内存默认参数反而不会用满这是正常的。真正需要关注的几个参数如下。max_connections100是最大连接数。默认值 100 在 5.5 里比较常见但如果你的应用并发量高需要调大。调大之前要评估内存——每个连接大约占用数 MB 内存取决于排序缓冲、连接缓冲等100 个连接乘以 5MB 就是 500MB。如果机器内存只有 2GB别贪心调得太高。innodb_buffer_pool_size512M是 InnoDB 的缓冲池大小这是 InnoDB 最重要的内存参数用于缓存表数据和索引。经验值是物理内存的 50%~70%但也要看机器上是否还跑着其他应用。这台 Windows 机器如果同时跑着 Tomcat 或 Nginx就要把 MySQL 的缓冲池适当调小避免操作系统内存耗尽引发频繁换页。innodb_flush_log_at_trx_commit1是事务日志刷新策略。设为 1 表示每次事务提交后都强制将日志写入磁盘这是最安全的模式数据库崩溃时最多丢失一个事务如果对数据安全性要求不高、追求性能可以设为 0 或 2。0 表示每秒刷一次崩溃时可能丢失最近 1 秒的数据2 表示写入操作系统缓存每秒刷一次性能和安全取中间。默认 1 是我在 Windows 环境下的推荐值毕竟 Windows 系统的稳定性比 Linux 差一些多一步保险没坏处。skip-name-resolve是个容易被忽略的小参数。它让 MySQL 在解析客户端连接时不进行 DNS 反向解析直接使用 IP 地址。这个参数能明显提高连接速度尤其是在内网环境里没有配置 DNS 的情况下默认的 DNS 解析可能导致每次连接都要超时。对开发环境来说这个参数务必加上。3.4 配置文件编码与特殊字符陷阱写 my.ini 时有一个防不胜防的坑文件编码必须保存为 ANSI也就是系统默认的编码GBK 或 GB2312绝对不能保存为 UTF-8尤其是带 BOM 的 UTF-8。MySQL 5.5 在解析配置时会把 UTF-8 BOM 头误认为一个配置字符导致[mysqld]分组定义无效随后所有基于该分组的参数全部失效数据目录路径无法正确读取服务启动直接失败。我手头就遇到过一台服务器服务一直启动失败错误日志里也看不出明显原因查了半天才发现是运维用记事本另存为 UTF-8 导致的。用 Notepad 或 VS Code 编辑时右下角会显示当前编码务必确认是“ANSI 编码”或“GB2312”再执行保存操作。另外my.ini 文件里的注释行以#开头但注意不要在中文字符旁边直接写注释因为老版本解析器对中文注释的处理偶尔会有兼容问题。建议所有英文注释都单独占一行中文注释写成纯 ASCII 的拼音或英文。4. Windows 服务注册与环境变量配置4.1 使用 mysqld 命令注册系统服务my.ini 写好后接下来就是注册 Windows 服务。这一步很多人会直接双击 mysqld.exe发现进程一闪而过误以为启动失败。实际上mysqld.exe 是服务器程序本体在 Windows 下正确做法是注册为一个系统服务来后台运行。以管理员身份打开命令行CMD 或 PowerShell 都可以但务必以管理员身份切换到 MySQL 解压目录的 bin 文件夹cd /d D:\mysql-5.5.62-winx64\bin mysqld --install MySQL55 --defaults-fileD:\mysql-5.5.62-winx64\my.ini这条命令的含义是将 mysqld 注册为名为MySQL55的 Windows 服务并通过--defaults-file参数显式指定配置文件路径。注意这里显式指定配置文件的做法非常关键。如果不指定MySQL 会按照默认顺序查找配置文件Windows 下的默认查找顺序是%WINDIR%\my.ini、C:\my.ini等路径很可能找不到你放在解压目录下的 my.ini。我在多次部署中踩过这个坑所以强烈建议每次都显式带上这个参数。如果服务注册成功命令行会提示Service successfully installed.。此时到服务管理器services.msc里就能看到MySQL55这个服务了。双击打开服务属性把“启动类型”改为“自动”这样 Windows 开机后 MySQL 就会自动运行。这一步非常实用因为如果不改启动类型重启机器后你还得手动启动服务。服务注册失败时最常见提示是Install/Remove of the Service Denied。这是因为命令行没有以管理员权限运行。解决方法是开始菜单里搜索“命令提示符”右键选择“以管理员身份运行”重新执行注册命令。4.2 启动服务与验证安装注册完服务后执行启动操作net start MySQL55如果一切正常你会看到“MySQL55 服务正在启动”和“MySQL55 服务已经启动成功”的提示。但更可靠的验证方式是直接尝试连接数据库。在 bin 目录下执行mysql -u root -pMySQL 5.5 安装完成后root 用户默认密码为空直接按回车就能登录。如果提示ERROR 2003 (HY000): Cant connect to MySQL server on localhost (10061)说明服务没有正常监听端口需要去查看错误日志。MySQL 5.5 的错误日志默认生成在 datadir 目录下文件名通常是主机名.err用记事本打开就能看到详细的错误信息。在验证过程中如果连接正常你会看到Welcome to the MySQL monitor.的提示。此时可以执行一条SELECT VERSION();来确认版本号。5.5 版本应该显示5.5.62-log或类似的输出。如果版本号后带有-log后缀说明二进制日志功能已经在运行因为我们配置了log-bin参数。4.3 环境变量配置与常用工具调用服务启动正常后为了让命令行工具更方便使用需要把 MySQL 的 bin 目录加到系统环境变量 PATH 中。这样你就不需要每次都切换目录到 D:\mysql-5.5.62-winx64\bin 去执行 mysql 命令。操作步骤右键“此电脑”-属性-高级系统设置-环境变量在“系统变量”区域找到 Path 变量点击编辑在末尾追加D:\mysql-5.5.62-winx64\bin注意与前面已有的路径用英文分号分隔保存后新开一个命令行窗口输入mysql --version验证。这里有一个需要注意的地方环境变量修改后已经打开的命令行窗口不会自动生效必须新开窗口。另外如果 Path 里已经存在其他 MySQL 版本的路径比如 5.7 或 8.0 的 bin那么你新加的这个路径要放在它们之前才能保证命令行调用的mysql.exe来自 5.5。这个问题在安装多版本 MySQL 时特别容易搞混。4.4 开机自启与日志清理建议Windows 服务注册完成后默认是开机自启的但我还是建议大家检查一遍因为有些安全软件会阻止服务自动启动。另外在服务属性里建议把“恢复”选项卡中的“第一次失败”、“第二次失败”都设置为“重新启动服务”这样即使 mysqld 因为某种原因崩溃Windows 也会自动拉起省去手动干预的麻烦。MySQL 5.5 的日志文件需要定期关注。datadir 下会持续生成二进制日志mysql-bin.000001、mysql-bin.000002 等这些文件主要用于主从复制和数据恢复如果不做备份则占磁盘空间。定期执行PURGE BINARY LOGS BEFORE NOW();可以清理指定时间之前的日志。这里操作的时机和频率要根据你的业务是否有复制需求来决定不能一概而论但至少要知道 binlog 是可以手动清理的。5. root 密码设置与基础安全加固5.1 首次登录后的必要操作修改 root 密码MySQL 5.5 初次安装完成后 root 密码为空这在开发环境里问题不大但如果你的服务绑定了对外网卡或者所在的局域网有其他同事能访问空密码就是致命的漏洞。安装配置完成后的第一件事就是给 root 设置一个强密码。方法一命令行方式mysql -u root -p连接后执行SET PASSWORD FOR rootlocalhost PASSWORD(你的新密码); FLUSH PRIVILEGES;方法二使用 mysqladmin 命令适合不想进入交互式命令行的情况mysqladmin -u root -p oldpassword password newpassword注意oldpassword是当前密码因为现在为空所以直接留空也会提示输入旧密码时直接回车。执行成功后会在屏幕上看到Warning提示这是正常现象不必在意。设置完密码后建议立刻重新登录验证一次新密码是否有效确认无误后再关闭命令行窗口。千万别改完密码就把窗口关了万一密码记错你又得走一遍密码重置流程。5.2 防患于未然修改默认端口虽然 3306 是 MySQL 的默认端口但在生产环境下我建议将它改成一个不常用的端口比如 13306 或 33066。这个操作需要同时修改两处一是 my.ini 中[mysqld]下的port3306二是[client]下的port3306。改完后重启服务再用mysql -u root -p -P 13306指定新端口连接。这样做的理由很简单3306 是扫描器重点侦察的端口把服务藏到不常见端口上至少能挡掉一批无差别扫描的脚本攻击。当然端口改装不是安全的一切它只是防御链条中的一环。你还需要关注防火墙规则在 Windows 防火墙中放行新端口而不是放行整个 MySQL 程序。端口修改后很容易忽略的一个问题是防火墙规则。Windows 防火墙默认放行程序时会匹配 exe 路径如果你改了端口原来放行 mysqld.exe 的规则可能仍然生效因为程序路径没变这就要求你手动在防火墙上增加/修改端口规则。具体操作时检查入站规则里与 MySQL 相关的条目确认端口号与你修改后的保持一致。5.3 本地防火墙与远程访问授权如果这台 Windows 机器只作为本机开发用那不需要开防火墙端口但如果需要让局域网内其他机器访问就必须在防火墙的入站规则里放行 3306 端口或你自定义的端口。很多人在这一步栽跟头服务正常、密码正确、本机连接没问题但远程连接就是不通最后检查发现是 Windows 防火墙把所有入站连接都拦了。放行端口的具体步骤控制面板-Windows Defender 防火墙-高级设置-入站规则-新建规则规则类型选“端口”协议选 TCP端口填 3306操作选“允许连接”配置文件三个都勾上名称填 MySQL 即可。除了防火墙MySQL 自身的权限表也要配合调整。默认情况下 root 用户只允许从 localhost 连接远程登录时如果用 root会报ERROR 1130 (HY000): Host xxx is not allowed to connect to this MySQL server。这时需要创建一个用于远程访问的专用账号而不是直接开放 root 的远程权限。创建远程账号的 SQL 示例GRANT ALL PRIVILEGES ON *.* TO dev% IDENTIFIED BY 远程访问密码; FLUSH PRIVILEGES;这里dev%表示用户 dev 可以从任意 IP 连接。如果想限定到某个网段把%换成192.168.1.%即可。给远程账号授权时原则是最小权限——只给业务需要的库和表授权别一上来就ALL PRIVILEGES这是数据库管理的基本素养。6. 常见问题排查与经验速查6.1 服务无法启动的典型原因与排查思路Windows 下 MySQL 5.5 服务启动失败是新手遇到最多的拦路虎。报错信息五花八门但根因就那么几类按出现频率排序如下。第一类配置文件读取失败。前面提到过 my.ini 编码问题这是 5.5 时代的经典坑。如果错误日志提示Fatal error: Cant open and lock privilege tables或者unknown variable大概率是配置文件解析出了问题。排查方法先把 my.ini 改名备份用 MySQL 默认配置启动服务试试如果能启动说明问题确实在 my.ini逐行排查即可。第二类数据目录损坏或不兼容。如果 datadir 指向的目录里已经有文件但这些文件来自不同的 MySQL 版本启动时会报错。解决办法就是备份重要数据后清空 datadir重新初始化。注意MySQL 5.5 的 datadir 结构和 5.7/8.0 完全不同不能混用。第三类端口被占用。执行netstat -ano | findstr 3306查看端口状态如果看到 TCP 监听但 PID 对应的进程不是 mysqld就说明端口被其他程序占了。最常见的捣乱者是之前残留的旧 MySQL 服务或者是 IIS、Apache 等程序占用了 3306 端口。处理方法要么杀掉占用进程要么把 MySQL 端口换掉。6.2 忘记 root 密码的暴力自救法人在江湖飘哪能不挨刀。忘密码这事我做数据库这些年遇到的次数两只手数不过来。还好 MySQL 5.5 的密码恢复机制比较宽松可以按以下步骤操作。第一步停止 MySQL 服务。命令行执行net stop MySQL55或者在服务管理器里手动停止。第二步以跳过权限表模式启动 MySQL。命令行切换到 bin 目录执行mysqld --skip-grant-tables --skip-networking--skip-grant-tables的意思是启动时不加载权限认证信息--skip-networking是禁止 TCP/IP 远程连接防止其他人趁你恢复密码时也免密登录进来。这一步极其重要千万不能省略。第三步新开一个命令行窗口执行mysql -u root直接免密连接。连接后执行USE mysql; UPDATE user SET PasswordPASSWORD(新密码) WHERE Userroot; FLUSH PRIVILEGES;注意MySQL 5.5 的 user 表里密码字段名是Password而不是 5.7 版本的authentication_string。很多人带着新版本的 SQL 习惯来改 5.5结果报错找不到列。第四步关闭那个跳过权限表的 mysqld 进程正常执行net start MySQL55启动服务。这一步也有坑关闭 mysqld 时如果是用 CtrlC 中断可能在 Windows 进程列表里残留一个 mysqld 进程导致重新启动服务时提示端口被占用。正确做法是在任务管理器里确认所有 mysqld 进程都结束再启动服务。6.3 中文乱码的终极排查路径中文乱码这个问题前面在字符集配置小节已经讲了一半这里补全排查步骤。如果你已经按正确配置设置了 UTF-8但查询结果里中文还是乱码那么从以下三个环节逐步排查。第一环客户端显示问题。在 Windows 命令行窗口里如果系统默认代码页是 936GBK而终端显示的是 UTF-8 内容会显示成乱码。这时执行chcp 65001将代码页切换到 UTF-8再看看效果。但注意chcp 只影响当前窗口重新打开后失效。第二环连接字符集问题。执行mysql -u root -p --default-character-setutf8以指定字符集连接如果这样中文正常了说明是连接层没有用上 UTF-8。第三环数据库本身字符集问题。进入数据库执行SHOW VARIABLES LIKE %character%;逐项检查 character_set_server、character_set_database 等变量。如果 character_set_database 不是 utf8说明你创建数据库时没指定字符集需要重建或者用 ALTER DATABASE 调整。如果以上三环全部正常那重点就在于数据入库的源头。检查你的导入脚本、程序连接串里的 charset 参数是否设置了 utf8。用 JDBC 连接时连接串要加useUnicodetruecharacterEncodingutf8这是 Java 程序连 MySQL 的经典配置项漏掉一个就会乱码。6.4 高并发与连接数不足的处理当应用访问量上来后MySQL 5.5 可能出现Too many connections的错误。这个报错的意思是当前连接数已经达到max_connections的上限。排查时先执行SHOW PROCESSLIST;查看当前连接情况统计 Sleep 状态的空闲连接有多少。如果很多空闲连接占着名额可以通过调低wait_timeout参数让空闲连接更快被回收。临时解决方法是在 MySQL 命令行中执行SET GLOBAL max_connections500;立即生效但重启服务后失效。永久解决要修改 my.ini 中的max_connections。这里我要强调调高连接数不是根本解决之道。如果连接池配置不合理、连接泄漏严重调高连接数只是治标不治本。更好的策略是在应用层配置连接池限制最大活动连接数并设置合理的建连超时时间。6.5 备份与恢复的基本功最后说一个容易被忽略但极其重要的环节备份。MySQL 5.5 时代最稳妥的备份方案是使用 mysqldump 工具这是官方自带的逻辑备份工具。一条简单的备份命令mysqldump -u root -p --default-character-setutf8 --single-transaction --all-databases backup.sql--single-transaction参数对 InnoDB 表有效它会在不锁定表的情况下生成一致性快照避免备份过程中业务写入导致数据不一致。--all-databases表示备份所有数据库。如果你的库很大可以考虑只备份需要的库减少备份时间和文件大小。恢复时在 MySQL 命令行里执行source D:\backup.sql;或者通过mysql -u root -p backup.sql导入。注意导入前确认目标库的字符集设置和原库一致否则导入后中文数据可能乱码。备份这件事我在实际工作中吃过不少亏。有一次是凌晨三点收到数据库崩溃报警折腾到天亮才想起昨天没有做备份那种心情至今记忆犹新。所以我的建议是在完成安装和配置后趁热打铁立刻做一次全量备份并设置定时任务定期备份。写在最后的一点经验我把我这几年在 Windows 环境装 MySQL 5.5 遇到的各种问题都写在了上面但最后还想多提醒一句5.5 确实是一款很老旧的数据库了它缺少很多现代数据库应有的安全性、性能和运维特性。如果你不是被存量项目绑定尽量把版本升级到 5.7 或 8.0。但如果你确实需要在 Windows 上维护 5.5那记住三个核心关键词编码、权限、路径。编码指的是 my.ini 用 ANSI 保存、字符集全部 utf8权限指的是所有命令行都以管理员身份运行、数据目录赋予当前用户完全控制权限路径指的是安装目录不含中文空格、端口不要冲突。把这三件事做对了这台 MySQL 5.5 就能稳稳地跑起来。
返回列表