
今天下午装 MySQL 8.0装到 Initializing database 这一步进度条停了很久然后直接弹了个红叉出来。说实话看到红叉那一刻我反而松了口气——等了五分钟的“may take a long time”终于有结果了。但接下来才是真正的开始怎么把这一步搞过去。这个问题我前前后后遇到不下三次每次原因都不一样。有的是数据目录没清干净有的是系统缺运行库有的是权限不对甚至有一次是因为磁盘满了。所以今天干脆把我完整的排查过程写下来从原理到实操一步步来争取让你照着顺序查一遍就能定位到自己的问题。1. Initializing database 这一步到底在干什么1.1 安装器背后执行的真实动作很多人搞不懂 Initializing database 是什么以为就是在“安装数据库”。其实不是这一步做的是数据目录初始化。MySQL 8.0 的安装包本身是绿色版一样的结构拷贝到目标目录就能跑起来但真正让它变成一个可用实例必须在本地生成一套完整的数据文件。这一步在 Linux 上对应的是mysqld --initialize命令在 Windows 的图形化安装器里其实就是把这条命令包装成了带进度条的界面而已。具体来说初始化会做以下几件事在datadir目录默认是C:\ProgramData\MySQL\MySQL Server 8.0\Data下创建系统表空间ibdata1、undo日志、binlog索引等基础文件。生成mysql、information_schema、performance_schema等系统库的初始数据。创建root账号如果用的是--initialize参数会生成一个临时随机密码并写入错误日志如果用的是--initialize-insecure则 root 密码为空。初始化SSL证书相关文件——这一步会调用系统的加密库对系统环境有一定要求。理解了这些你就明白为什么这一步会“may take a long time”了它不是在复制文件而是在做一套完整的数据库冷启动准备。正常情况下 1 到 3 分钟超过 10 分钟还卡着基本可以断定出问题了。1.2 为什么红叉会出现在这一步红叉出现意味着安装器执行初始化命令时进程返回了非零退出码。MySQL 安装器本身没有太复杂的错误恢复逻辑它只会把命令执行的结果成功或失败抛给你。问题在于它把错误详情写在了日志文件里界面上只留一个红叉不点开日志根本不知道具体原因。这里有个非常关键的点Initializing database 失败不代表 MySQL 没装好只是数据目录没初始化成功。我见过不少人在这一步失败后直接卸载重装其实很多时候完全没有必要。你只需要找到失败原因清掉残留数据目录重新执行初始化命令就能解决。还有一个容易被忽略的情况安装器在 Initializing database 之前已经把 MySQL 注册成了 Windows 服务但服务启动失败也会在界面显示红叉。所以你要先分辨这个红叉是初始化命令本身的失败还是后面启动服务时失败。判断方法很简单——看日志日志里写的是哪一步失败就是哪一步的问题。2. 报红叉的几大常见原因2.1 数据目录残留和权限问题这是最常见的原因没有之一。很多情况下是因为你之前装过一次 MySQL卸载的时候数据目录没有清理干净。默认的C:\ProgramData\MySQL\MySQL Server 8.0\Data目录卸载程序一般不会动它——这是 MySQL 的刻意设计因为里面有你的业务数据卸载时不敢给你删。但问题就出在这初始化命令要求数据目录必须为空如果里面有残留的.err、ibdata1或者mysql系统库文件初始化直接报错退出。还有一种情况ProgramData目录是隐藏的有些朋友初次安装时手动指定了一个自定义数据目录但这个目录所在的磁盘分区是 FAT32 格式。MySQL 8.0 对文件系统的要求是必须支持文件锁和大小写敏感特性FAT32 两种都不满足初始化也会失败。另外如果datadir目录的写权限不足比如安装在 C 盘根目录下的自定义路径当前 Windows 用户没有写入权限同样会报错。2.2 系统组件缺失和运行库问题MySQL 8.0 是用 C 编的Windows 版强依赖Microsoft Visual C 2015-2019 Redistributable运行库。这个运行库版本落后、损坏或者干脆没装初始化过程会在调用某些底层层时崩溃退出。我遇到过一次系统是精简版的 Windows装完之后运行库不全MySQL 安装器能正常启动但初始化到一半直接红叉日志里有个很难察觉的“应用程序错误”记录。还有一个相关组件需要注意Microsoft .NET Framework 4.5.2 或更高版本。MySQL Installer 8.0 的图形界面依赖 .NET如果系统 .NET 环境异常安装器本身的行为会变得怪异比如不报错、不闪退就是卡在某一步不动最后超时红叉。这种情况在精简版系统、Ghost 版系统上尤其常见。另外如果你的系统开启了 Windows Defender 或第三方杀毒软件初始化过程中生成临时文件被拦截也可能导致失败。我自己遇到过一例杀毒软件把一个 mysqld.exe 释放的临时动态库当作可疑文件隔离了初始化直接中断。2.3 配置冲突和端口占用安装器在执行 Initializing database 时理论上还没有启动完整的 mysqld 服务但它会尝试通过 3306 端口做一次短连接验证。如果这台机器上已经有别的数据库实例占用了 3306 端口比如之前装过 MySQL 5.7 没卸载干净或者装了 MariaDB初始化后的连接验证就会失败。还有一个不常见但着实存在的坑系统时间不对。MySQL 8.0 初始化时会生成自签名 SSL 证书如果系统时间严重偏离当前时间比如差了两年证书生成后校验会失败初始化报错。这种问题在 BIOS 电池没电的老机器上偶尔能碰到。最后my.ini配置文件的优先级问题也要注意。MySQL 8.0 按固定顺序读取配置文件C:\Windows\my.ini、C:\my.ini、basedir\my.ini、datadir\my.ini。如果系统盘根目录或 Windows 目录下存在旧的my.ini里面的配置项会以意外的方式覆盖安装器生成的新配置比如指定了一个不存在的basedir初始化路径找错了直接报红叉。3. 我今天完整的排查过程3.1 第一步看日志别瞎猜废话不多说遇到红叉第一件事就是去翻日志。MySQL 安装器把所有安装过程中的输出都写进了日志路径根据安装方式略有不同。如果是通过安装器装的日志在C:\ProgramData\MySQL\MySQL Installer for Windows\这里面有个Logs目录找最新修改的那个.log文件打开后搜索ERROR关键字能看到具体的失败原因。如果是通过手动命令行方式初始化的错误输出会直接写在数据目录下的.err文件里C:\ProgramData\MySQL\MySQL Server 8.0\Data\主机名.err提示.err文件是 MySQL 自己的错误日志如果你以前装过 MySQL 但没清理干净这个文件时间戳会是旧的直接删掉再重新初始化即可。我今天的日志里看到的关键信息是这么一段[ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.翻译过来就是指定了初始化参数但数据目录里有文件终止执行。这个错误太典型了就是残留文件没清干净。3.2 第二步清理残留保证干净环境既然日志告诉我是残留文件问题那就直接清理。注意这一步是删除数据文件不是卸载程序所以谨慎一点先把要删的目录里的内容看清楚再动手。我的操作步骤打开服务管理器WinR 输入services.msc确认没有跟 MySQL 相关的服务在运行。打开C:\ProgramData\MySQL\MySQL Server 8.0\Data把里面所有文件和子目录清空。注意是清空这个目录不是删掉Data文件夹本身——MySQL 初始化时会往这个目录里写文件如果目录不存在mysqld 可能不会自动创建反而会报另一个错。顺手把C:\Program Files\MySQL\MySQL Server 8.0\下的my.ini也检查了一下。这一步值得做但不用删因为安装器如果检测到你改了自定义配置会以自定义配置为准如果配置没问题留着也无妨。清理完之后我不急着重新走安装器的图形界面而是直接进命令行手动执行初始化命令这样能实时看到输出出错也知道错在哪。命令如下cd C:\Program Files\MySQL\MySQL Server 8.0\bin mysqld --initialize-insecure --basedirC:\Program Files\MySQL\MySQL Server 8.0 --datadirC:\ProgramData\MySQL\MySQL Server 8.0\Data注意这里我用了--initialize-insecure而不是--initialize。两者的区别是前者生成的 root 账号密码为空--initialize则会生成一个随机密码写在.err日志里。自己本机调试用--initialize-insecure方便些装完之后马上可以用空密码登录再改成你自己的密码。命令执行完终端没有输出任何错误说明初始化成功了。我赶紧看了一眼数据目录ibdata1、mysql目录、undo日志等文件都已经生成心里那块石头落地了。3.3 第三步修复运行库重装成功按理说走到这一步重新跑一遍安装器就应该能过去了。但我手欠想到之前遇到过运行库缺失的问题就提前检查了一下系统里的 VC 运行库结果还真发现不对劲系统里只有 2013 版的运行库没有 2015-2019 版的。MySQL 8.0 的 Windows 版在运行时会动态链接msvcp140.dll、vcruntime140.dll这些库文件缺了这些mysqld 进程启动时就会失败。虽然安装器在安装前会检查并尝试自动补装但如果你系统里有旧版的 Visual C 组件安装器可能会判断“已存在”而跳过安装导致实际版本不满足要求。解决办法很简单去微软官方下载Microsoft Visual C 2015-2022 Redistributable x64安装包装上之后再重试初始化。这里有个优先级问题先装运行库再重新初始化。如果你先初始化报错了再装运行库然后不清理数据目录直接再初始化还是会因为残留文件失败。所以顺序很关键检查并补装 VC 运行库。再次确认数据目录为空。重新执行初始化命令。做完这三步再把 MySQL 注册成服务mysqld --install MySQL80 --basedirC:\Program Files\MySQL\MySQL Server 8.0 --datadirC:\ProgramData\MySQL\MySQL Server 8.0\Data启动服务net start mysql80然后登录测试mysql -u root这里因为用的是--initialize-insecureroot 密码为空直接回车就进去了。进去之后第一件事就是改密码ALTER USER rootlocalhost IDENTIFIED BY 你的新密码; FLUSH PRIVILEGES;到这一步安装流程基本走通了。整个过程折腾了差不多四十分钟但真正解决问题只花了十几分钟——大部分时间都浪费在开始不知道看日志上。4. 手动初始化数据库的兜底方案4.1 手动执行 mysqld --initialize 的完整步骤如果图形安装器的 Initializing database 一直报红叉而且日志里能看到明确的错误提示我的建议是绕开安装器完全手动执行初始化。这个方法省时省力而且每一步都能看到真实输出比起反复点“Next”“Retry”要高效得多。完整步骤整理如下停止所有 MySQL 相关服务。如果之前安装器已经注册了服务但服务启动失败用管理员身份打开命令提示符执行net stop mysql80服务名不对就先执行sc query mysql查一下。服务列表里没有直接进入下一步。清理数据目录。把datadir下所有文件全部删除。如果你不确认当前数据目录在哪可以打开C:\Program Files\MySQL\MySQL Server 8.0\my.ini看datadir配置项。确认端口不被占用。执行netstat -ano | findstr 3306如果看到有进程监听 3306得先处理掉。如果是你自己之前装的 MySQL 没停干净就停掉如果是别的程序占用了那就只能改端口了。切换目录并执行初始化。以管理员身份打开终端进入basedir的bin目录执行mysqld --defaults-fileC:\ProgramData\MySQL\MySQL Server 8.0\my.ini --initialize-insecure --console注意如果你用了--defaults-file指定配置文件这个参数必须放在命令行第一个位置否则会被 mysqld 忽略。这是 MySQL 的一个历史遗留习惯踩过坑的人应该都知道。查看错误日志。如果初始化命令报错打开数据目录下的.err文件看最后几行输出定位具体原因。比如我上面提到的目录非空会直接告诉你 “data directory has files in it”如果是运行库缺失可能会有 “The program cant start because msvcp140.dll is missing” 这样的提示。执行--initialize-insecure的好处是 root 初始密码为空安装完马上能登录如果是生产环境建议用--initialize生成的临时密码在.err日志里首次登录必须改密安全级别更高。4.2 初始化之后的服务注册和连接测试数据目录初始化成功之后还需要做两件事注册 Windows 服务和启动服务。Windows 上 mysqld 进程不会自己常驻必须通过服务管理器来管理。注册服务用这个命令mysqld --install MySQL80 --display-nameMySQL80 --basedirC:\Program Files\MySQL\MySQL Server 8.0 --datadirC:\ProgramData\MySQL\MySQL Server 8.0\DataMySQL80是服务名display-name是服务管理器里显示的名称可以根据自己习惯改。注册成功后会提示Service successfully installed。然后启动服务net start MySQL80启动时如果报错重点去看数据目录下的.err文件。常见的情况包括Plugin caching_sha2_password is not loaded——一般是因为my.ini里指定了不存在的插件路径。Cant start server: Bind on TCP/IP port——3306 端口被占用。The designated data directory is unusable——数据目录权限不足。服务启动成功之后执行mysql -u root -p密码为空就直接回车。能进入mysql提示符说明整个安装链路已经通了。此时再用ALTER USER改掉 root 密码然后执行FLUSH PRIVILEGES;让权限生效。5. 特殊环境的坑位提醒5.1 Windows Server 2012 R2 的兼容性问题我看搜索热词里有人问 Windows Server 2012 R2 安装 MySQL 8.0 的问题这确实是个容易踩坑的组合。MySQL 8.0 官方要求 Windows Server 2012 R2 及以上版本理论上支持但实际部署时需要注意几个前置条件。Windows Server 2012 R2 默认的 PowerShell 版本是 4.0而 MySQL Installer 8.0 某些版本依赖 PowerShell 5.0 以上完成特定操作。如果你在 2012 R2 上安装器运行到一半没有反应或者红叉提示不明优先检查 PowerShell 版本。解决办法是安装 WMF 5.1Windows Management Framework 5.1更新。另外一个问题是 TLS 协议。MySQL Installer 8.0 在联网检查更新时会通过 TLS 1.2 协议访问服务器但 Windows Server 2012 R2 默认只开了 TLS 1.0/SSL 3.0导致网络组件初始化异常。这个不会直接导致 Initializing database 失败但有可能让安装器整体表现得不稳定。手动安装 MySQL 时建议在系统设置里开启 TLS 1.2或者直接禁用安装器中的联网更新检查。还有一点Windows Server 2012 R2 如果是没有打补丁的原始版本运行 VC 2015-2022 运行库时可能报错“找不到 VCRUNTIME140_1.dll”这是系统缺少 Universal C Runtime 更新导致的装上 KB2999226 补丁就能解决。5.2 Linux 离线安装的依赖问题这次讨论的主线是 Windows但我注意到热词里也有 Linux 环境下 mysql 8.0 依赖下载的问题顺手说一下。Linux 下 MySQL 8.0 最常见的安装失败原因是缺libaio1和libnuma1这两个依赖包。在线安装的话直接yum install -y libaio libnumaCentOS/RHEL或apt install -y libaio1 libnuma1Ubuntu/Debian就能解决。问题是很多内网机器根本不能连外网。这时候有两个靠谱办法第一个办法找一台能联网的同版本 Linux 机器用yumdownloader --resolve或apt-get download把依赖包和 MySQL 的 rpm/deb 包全部下载下来打包拷贝到内网机器上再用rpm -ivh *.rpm或dpkg -i *.deb本地安装。第二个办法直接使用 MySQL 官方的mysql-community-server离线包。官网的 download 页面提供Linux - Generic的 tar.gz 包解压之后只有一个独立目录理论上不需要额外依赖就能跑起来。但这点要注意官方 tar.gz 包要求系统必须安装libaio没有这个库 mysqld 照样启动不了。所以即使你用通用包也必须把libaio的大包弄进去。这条信息建议先记着等真遇到离线环境的时候能少走弯路。6. 常见问题速查表和排查流程总结6.1 报错信息对应问题速查表为了让遇到问题的朋友能快速定位我把常见报错和对应的排查方向整理成了一张表直接对着查报错信息或现象大概率原因处理方式data directory has files in it. Aborting数据目录残留旧文件清空 datadir 后重新初始化msvcp140.dll is missing或VCRUNTIME140_1.dll not foundVC 运行库缺失安装 VC 2015-2022 Redistributable x64Bind on TCP/IP port: Access denied端口被占用停掉占用进程或修改 my.ini 里的端口The designated data directory is unusabledatadir 不存在或无权限创建目录并设置写权限初始化卡住超过 10 分钟不动杀毒软件拦截 / 磁盘 IO 问题临时退出杀毒软件检查磁盘健康状态Cant create/write to file ... (OS errno 13 - Permission denied)Windows 账号无写入权限以管理员身份执行安装或给 datadir 加权限Plugin caching_sha2_password is not loadedmy.ini 配置了错误的插件路径检查 basedir 和 plugin-dir 配置安装器界面红叉但日志无 ERROR.NET 环境异常更新 .NET Framework 4.8重跑安装器SSL certificate error系统时间不对校准系统时间清掉数据目录重新初始化6.2 高效的排查顺序建议排查这类问题最忌讳的是想到哪试到哪。我自己经历过几次来回折腾的教训之后总结了一个固定的排查顺序也分享出来第一步清掉数据目录直接用命令行初始化一次。这一步能排除掉绝大多数问题因为图形安装器给你的信息太少了全是封装好的反馈。命令行模式下 mysqld 会直接把错误打到.err文件里你看一眼就知道卡在哪。第二步根据.err文件的报错关键字去查。比如看到msvcp140.dll就去装运行库看到Permission denied就去查权限看到files in it就去查残留。不要拿着 Installation failed 这种大而化之的关键字去搜搜出来的基本都是废话。第三步把系统环境补齐之后一定要再清一次数据目录然后才重试。这个顺序很多人搞反补完运行库就直接重试初始化忘了数据目录里已经有一堆上次初始化失败留下的半成品文件结果又报目录非空白白多跑一轮。我今天的整个过程就是这样第一次失败之后没有清理直接重跑又报了一次同样错误才发现残留问题。最后一步如果手动初始化完全没问题但安装器还是报红叉那就是安装器自身环境的问题了。此时可以绕开安装器直接手动初始化之后再用mysqld --install把服务注册上把安装器扔到一边不用管它了。MySQL 的核心是可执行文件和服务安装器只是一个包装壳壳坏了不影响核心。一点个人体会Initializing database 报红叉百分之八十的情况都不是 MySQL 本身的问题而是环境问题。数据目录的干净程度、运行库的完整程度、端口的占用情况这三件事只要保证了很少会初始化失败。所以真不用急着重装系统甚至重下安装包静下心来看一眼日志问题往往比你想的简单。