一提到 mysql 安装教程,很多人脑子里都是下载、下一步、下一步、完成。真这么顺利当然好,但我在实际环境里见过太多翻车现场:Windows 上服务起来了却登录不进去,Linux 上装完找不到临时密码,Docker 启动两秒就退出。这篇文章把 Windows、Linux、Docker 三条路线都走一遍,每一步选型理由、初始化细节和常见坑都写清楚,无论你是刚接触 MySQL 的新手,还是已经被安装问题折磨过的老油条,都能照着操作。内容会涉及官方下载渠道、my.ini、rpm 安装、systemd、防火墙、SSL 连接错误以及卸载残留,都是一线装机时真正会碰到的问题。
1. 装 MySQL 前,先花五分钟确认这三件事
1.1 选哪个版本:8.0 是默认答案,5.7 要慎重
很多新手下载时直接搜“mysql 下载官网”,进去后看到一堆版本号就懵了。我的建议很简单:新装环境,无脑选MySQL 8.0系列。8.0 从 2018 年发布到现在已经非常成熟,性能、JSON 支持、窗口函数、公共表表达式都比 5.7 强一截,官方也把更多精力放在 8.0 和 8.4 上。
那 5.7 还有人用吗?有,但大部分是因为老项目、老驱动或者 DBA 团队的历史包袱。网上经常有人问“为什么 5.7.43 之后直接跳到 5.7.44,后来又不出 5.7.45 了”,其实就是 5.7 已经进入生命周期末尾,5.7.44 基本是官方合并的最后一个补丁版本,后面不会再有大版本更新。如果没人逼你必须用 5.7,不要为了“稳定”去选一个快要停更的版本,那才是真的不稳定。
另外要留意 8.0 默认的认证插件是caching_sha2_password,老客户端工具如果不升级,可能会报Authentication plugin 'caching_sha2_password' cannot be loaded或者 SSL 连接错误。这不是 MySQL 坏了,而是驱动太老。后面第 5 章和第 6 章我会专门讲兼容性处理。
1.2 安装方式对比:解压包、系统包管理器还是 Docker
同是装 MySQL,方式不一样,后面的维护习惯也不一样。我把常见三种方式放在一起对比:
| 安装方式 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| 官方 ZIP / TAR 二进制包 | 目录可控、版本精确、无自动默认配置 | 初始化、服务注册、环境变量都要自己来 | Windows 本机开发、定制化部署 |
| 系统包管理器(apt / yum / dnf) | 依赖处理省心、systemd 集成、开机自启方便 | 版本可能不是最新,目录分散在 /etc、/var 各处 | Linux 服务器、生产环境 |
| Docker | 环境隔离、起停干净、一个镜像搞定 | 数据卷权限、端口映射、容器内调试有门槛 | 本地快速测试、CI 环境、微服务部署 |
说实话,本地开发我首选解压包,因为你看得到文件在哪、配置在哪,出了问题好查。Linux 服务器上我推荐官方仓库或系统包管理器,毕竟生产环境需要的是稳定和易维护。Docker 适合你不想污染本机环境,或者想一句话切多个 MySQL 版本的情况。
1.3 认准官方下载渠道,别碰第三方“一键安装”
下载地址我只认一个:https://dev.mysql.com/downloads/mysql/。进去之后选MySQL Community Server,这里才是社区版官方发布页。不要从乱七八糟的“高速下载站”下,很多第三方打包器会带推广软件,甚至改了默认配置。
下载前先确认两件事:
- 操作系统位数:Windows 现在基本是 64 位,Linux 上先跑
uname -m看是x86_64还是aarch64,别下错平台包。 - 包类型:Windows 有
MySQL Installer和ZIP Archive两种,建议选 ZIP;Linux 有Linux - Generic (glibc)TAR 包,也有各种发行版的 RPM / DEB 包。直接用系统包管理器走官方仓库,比手动 TAR 解压省事。
另外,别为了图快使用所谓“绿色版”“破解版管理工具”。连接工具用 MySQL Workbench、DBeaver Community 就够用,旧版破解 Navicat 不仅容易中招,连接 8.0 还经常被认证插件挡在外面。
2. Windows 上装 MySQL 8.0:从 ZIP 解压到命令行跑通
2.1 下载 ZIP 而不是 Installer
Windows 下我推荐下载ZIP Archive,而不是一键 Installer。理由很简单:Installer 默认安装到C:\Program Files\MySQL,还附带一堆你用不到的组件,卸载也麻烦;ZIP 解压后就是一个独立的 MySQL 目录,想挪就挪,想删就删。
假设你下载的是mysql-8.0.44-winx64.zip,解压到:
D:\mysql注意两点:目录不要带中文,不要带空格。比如D:\软件\mysql这种路径,后面初始化时可能因为字符编码出奇怪问题;D:\Program Files\mysql这种带空格的路径,命令行里要不停加引号,纯粹给自己找罪受。
解压完先不要急着双击任何 exe。第一步是进入D:\mysql\bin,确认有mysqld.exe。如果只有一堆文件没有 mysqld,说明下成了源码包或者下载不完整,重新下载。
2.2 写对 my.ini,初始化数据目录
ZIP 包默认没有配置文件,MySQL 启动时会用一堆内置默认值,这样也能跑,但字符集、端口、数据目录没法控制。所以我们要手动建一个my.ini放在D:\mysql根目录下。
[mysqld] basedir=D:/mysql datadir=D:/mysql/data port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-storage-engine=INNODB max_connections=200 [client] default-character-set=utf8mb4这里最关键的是basedir和datadir,路径里的反斜杠要么写成两个\\,要么像我一样直接用正斜杠/,避免 Python 风格转义问题。datadir是数据目录,第一次跑的时候它会自动创建。
配置写好后,打开一个管理员权限的 CMD,进入D:\mysql\bin,执行初始化命令:
mysqld --initialize-insecure我习惯用--initialize-insecure,因为它会生成一个空密码的 root 账号,方便首次登录。不带--insecure的mysqld --initialize会生成一长串随机临时密码,藏在D:\mysql\data\*.err里,新手经常找不到。
初始化完成后,确认D:\mysql\data目录下出现了 `` 开头的错误日志文件,简单扫一眼没有 ERROR,就算成功。
2.3 把 MySQL 注册成 Windows 服务
数据目录初始化好之后,每次手动敲mysqld --console启动太原始了。我推荐把 MySQL 注册成 Windows 服务,这样开机自启、服务管理都方便。
还是在管理员 CMD 里执行:
mysqld --install MySQL --defaults-file=D:/mysql/my.ini如果返回Service successfully installed.,说明注册成功。接着启动服务:
net start MySQL启动时如果报“服务无法启动”,先不要重装。最快的排查方法是直接去看日志:
mysqld --console用--console会把错误直接打到屏幕上,多数情况是my.ini路径写错、datadir权限不对,或者端口 3306 被其他程序占了。我之前遇到过 SQL Server 监听 1433,但也有别的程序占用 3306,把端口改成 3307 就正常了。
2.4 首次登录、改密码、配置环境变量
服务启动后,Windows 的 MySQL 默认允许 root 空密码登录。执行:
mysql -uroot -p提示输密码时直接回车。进入mysql>提示符后,马上把密码改掉:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassw0rd!'; FLUSH PRIVILEGES; EXIT;注意 MySQL 8.0 默认密码策略要求至少一个大写字母、一个小写字母、一个数字、一个特殊字符,长度至少 8 位。如果你用123456这种弱密码,大概率会被直接拒绝。这不是 Bug,是安全策略。
最后一步是配置环境变量。在“系统属性 -> 高级 -> 环境变量 -> Path”里新建一条D:\mysql\bin。配好之后,新开一个 CMD,输mysql --version能直接看到版本号,以后就不需要每次cd到 bin 目录再执行命令了。
3. Linux 下三种安装姿势:apt、官方仓库和 RPM 裸装
3.1 Ubuntu / Debian:apt 一把梭
Ubuntu 和 Debian 下最简单的方式是直接从系统仓库装:
sudo apt update sudo apt install mysql-server sudo systemctl enable --now mysql装完后执行sudo mysql,注意不能直接mysql -uroot -p。Debian/Ubuntu 的 MySQL 默认 root 用的是auth_socket插件,只允许系统 root 用户通过sudo mysql登录。如果后面你的 Java 程序要用 root 连,需要先把 root 改成密码认证:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YourPassw0rd!'; FLUSH PRIVILEGES;改完再敲mysql -uroot -p就能正常登录了。用 apt 装的 MySQL,目录分散在/var/lib/mysql(数据)、/etc/mysql(配置)、/var/log/mysql(日志),这点和 Windows ZIP 包完全不一样,找配置时别只盯着一个地方。
3.2 CentOS / RHEL:官方仓库是最省事的方式
CentOS 和 RHEL 上,系统自带的仓库里 MySQL 经常是 MariaDB,如果直接yum install mysql,装出来的可能不是 MySQL。正确姿势是先装官方仓库:
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm注意 el9 对应 RHEL 9 系列,如果是 CentOS 7,要选 el7 对应的 release 包。装完官方仓库后:
sudo yum install mysql-community-server sudo systemctl enable --now mysqldCentOS/RHEL 用mysqld作为服务名,不像 apt 装完叫mysql。这一步非常容易混淆。
启动后再登录就要用临时密码了。在/var/log/mysqld.log里找:
sudo grep 'temporary password' /var/log/mysqld.log复制那串临时密码,执行:
mysql -uroot -p登录进去后,MySQL 会强制你改掉临时密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourPassw0rd!';3.3 直接 RPM 裸装的依赖坑
有一部分同学喜欢去官网下 RPM 包,然后rpm -ivh mysql-community-server-*.rpm一个个装,结果经常看到:
libaio.so.1()(64bit) is needed by mysql-community-server libncurses.so.5()(64bit) is needed by mysql-community-server这就是典型的依赖缺失。MySQL 官方把所有组件打成一个 bundle 下载时,里面包含 server、client、common、libs 好几个 RPM,手工rpm -ivh容易因为依赖顺序乱掉而失败。
正确做法是让包管理器自动处理依赖:
sudo yum localinstall mysql-community-*.rpm或者:
sudo dnf install ./mysql-community-server-*.rpm这样包管理器会去已配置的仓库里补全依赖,比自己rpm -ivh逐个强敲靠谱得多。RPM 裸装适合离线内网环境,但前提是你把依赖包一次性下载齐全。
3.4 启动、开机自启、防火墙,一个都不能少
Linux 上装完 MySQL,不接受“现在能连,重启服务器就失联”这种状态。先把开机自启打开:
sudo systemctl enable mysqld sudo systemctl start mysqld sudo systemctl status mysqldstatus输出里看到active (running)才算启动成功。然后检查端口是否在监听:
sudo ss -lntp | grep 3306如果只能看到127.0.0.1:3306,说明 MySQL 默认或配置文件里设置了bind-address=127.0.0.1。这不是不能连,而是只能本机连。远程要访问,必须改配置和防火墙:
sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reloadUbuntu 上则是:
sudo ufw allow 3306/tcp防火墙放行后,还要确认 MySQL 配置里bind-address不是固定回环地址。如果是,改成0.0.0.0再重启服务。这个我放到第 5 章细讲。
4. Docker 跑 MySQL:两条命令起步,四个失败原因排查
4.1 基础启动命令和参数解释
Docker 装 MySQL 核心就一条命令:
docker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=YourPassw0rd! \ -v mysql8_data:/var/lib/mysql \ mysql:8.0三个参数必须理解:
-p 3306:3306:把容器的 3306 映射到宿主机 3306,外部程序才能连。-e MYSQL_ROOT_PASSWORD:只在数据卷为空、首次初始化时生效。如果数据卷已经有了旧数据,再改这个环境变量不会改密码,很多人栽在这。-v mysql8_data:/var/lib/mysql:数据卷,让数据存在容器外。不加这句,你docker rm mysql8之后数据就全没了。
如果你只想快速体验,不关心持久化,可以省掉-v。但真实项目里一定要加,否则删容器等于删数据库。
4.2 失败原因一:数据目录权限不对
Docker 装 MySQL 失败,最经典的是这样启动:
docker run -d --name mysql8 \ -v /home/user/mysql-data:/var/lib/mysql \ mysql:8.0然后docker logs mysql8里看到:
[ERROR] mysqld: Can't read dir of '/var/lib/mysql/' (OS errno 13 - Permission denied)原因很简单:容器里的 MySQL 进程是以 UID 999 的mysql用户跑的,而宿主机/home/user/mysql-data目录的属主是user,权限是 755,容器里的 mysql 用户没有写权限。
解决方式:
sudo chown -R 999:999 /home/user/mysql-data或者不用宿主机目录,直接用 Docker 命名卷:
docker volume create mysql8_data命名卷由 Docker 管理,不存在 UID 冲突问题,这是更省心的选择。
4.3 失败原因二:端口被占用、内存不足、镜像拉取超时
有同学启动容器后秒退,docker ps看不到容器,先跑docker logs mysql8 --tail 50看日志。常见的几个原因:
端口被占用:
[ERROR] [MY-010146] bind() failed: Address already in use本地已经有一个 MySQL 或别的进程占了 3306。改端口映射就行:
docker run -d --name mysql8 -p 3307:3306 ...内存不足:
[ERROR] InnoDB: Cannot allocate memory for the buffer pool默认 InnoDB buffer pool 可能超过机器内存,加启动参数限制:
docker run -d --name mysql8 --innodb-buffer-pool-size=256M ...注意这是 mysqld 参数,要放在镜像名后面:
docker run -d --name mysql8 mysql:8.0 --innodb-buffer-pool-size=256M镜像拉取超时:国内网络环境拉mysql:8.0经常卡住。可以在 Docker 配置里设置镜像加速地址,然后重新docker pull mysql:8.0。加速地址一般是镜像服务商提供,建议用你所在云平台自带的加速源。
4.4 容器日常运维:日志、进入容器执行 SQL、修改配置
容器方式调试 MySQL 和本机不太一样,常用四个操作:
查看日志:
docker logs mysql8 --tail 100进入容器执行 SQL:
docker exec -it mysql8 mysql -uroot -p查看容器内的配置文件:
docker exec -it mysql8 cat /etc/my.cnf修改配置后重启:
docker restart mysql8如果你习惯了本机 MySQL,用 Docker 初期会觉得不顺手,但熟练之后会发现“删掉重来”太方便了。测试某个新版本或新参数,起一个容器跑完就删,完全不影响宿主机。
5. 远程连接和安全加固:从 bind-address 到业务账号
5.1 先看 bind-address 和防火墙
本机能连、远程连不上,90% 是 bind-address 或防火墙的问题。
MySQL 默认在某些发行版里只监听回环地址127.0.0.1,默认配置里可能出现:
bind-address = 127.0.0.1改成:
bind-address = 0.0.0.0然后重启 MySQL。改完先验证监听地址:
Windows 下:
netstat -ano | findstr :3306Linux 下:
sudo ss -lntp | grep 3306如果看到0.0.0.0:3306或*:3306,说明监听关系没问题。接下来再看防火墙放行没有,Windows 弹窗里允许 MySQL 通信,Linux 用前面提到的firewall-cmd或ufw。
如果你用的是云服务器,还要检查安全组规则。云厂商安全组不放行 3306,你在服务器内部把防火墙关了都连不上。
5.2 用业务账号连接数据库,别让 root 满天飞
装完 MySQL 第一时间应该做的不是配远程 root,而是创建业务账号。我见过很多项目直接把 root 密码写在 JDBC 配置里,还允许 root 远程登录,这是最危险的操作。
建议这样创建:
CREATE DATABASE app_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'app_user'@'%' IDENTIFIED BY 'App@123456'; GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%'; FLUSH PRIVILEGES;这里'%'表示允许从任意主机登录。如果是内网固定 IP,最好把%换成具体 IP,比如'192.168.1.10',减小暴露面。
业务账号只给app_db库的权限,不要给全局权限。后续如果程序被攻击,攻击者能碰到的也只是这一个库,损失能控制住。
5.3 字符集、密码策略和默认值为 0 这类小配置
连接正常后,建议顺手检查字符集。
SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'collation_server';中文乱码大多因为服务器默认字符集不是utf8mb4。MySQL 8.0 默认倒是utf8mb4,但如果你是从 5.7 升上来的,字符集可能还是旧的。在 Linux 的/etc/my.cnf或 Windows 的my.ini里加上:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci另外,很多人被“mysql 设置默认值为 0”这个问题卡住。建表时如果日期字段想设置DEFAULT 0,MySQL 的sql_mode里默认可能带着NO_ZERO_DATE,会直接报错。排查方式:
SELECT @@sql_mode;确认有无NO_ZERO_DATE,有就把它从sql_mode里去掉再重启。对于非日期字段,DEFAULT 0一般没关系。
密码策略也可以通过变量调整:
SHOW VARIABLES LIKE 'validate_password%';开发环境嫌策略太严,可以降低要求:
SET GLOBAL validate_password.policy = LOW;注意这只是全局会话级别,重启后会恢复,要永久改还是写在配置文件里。
5.4 客户端驱动连接串的兼容问题
Java 项目连接 MySQL 8.0 时,最常见的问题之一是:
Public Key Retrieval is not allowed这是因为 8.0 的caching_sha2_password插件在非 SSL 连接下需要获取服务器公钥,而客户端驱动默认不允许。解决方式是在连接串里加上两个参数:
jdbc:mysql://localhost:3306/app_db?sslMode=DISABLED&allowPublicKeyRetrieval=true&serverTimezone=Asia/ShanghaisslMode=DISABLED是告诉驱动不走 SSL,allowPublicKeyRetrieval=true是允许获取公钥。这两个参数在本地开发环境特别有用,但生产环境尽量用 SSL 加密连接,不要长期禁用。
如果是旧版 JDBC 驱动,可能不认识sslMode这个参数,那就用旧写法:
jdbc:mysql://localhost:3306/app_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai但更推荐直接把驱动升级到 8.0 系列的最新版本,新驱动对 MySQL 8 的支持完善很多。
6. 安装结束后最容易碰到的报错:SSL、0xe0434352 和端口占用
6.1 mysql ssl 连接错误:先升级驱动,再谈禁用 SSL
MySQL 8.0 默认启用 SSL,很多旧版客户端在连接时直接报:
ERROR 2026 (HY000): SSL connection error: protocol version mismatch或者:
SSL connection error: unknown error number根因通常是客户端或驱动使用的 TLS 版本太老,而 8.0 默认禁用了 TLSv1.0、TLSv1.1。
排查思路:
- 先看服务器支持的 TLS 版本:
SHOW VARIABLES LIKE 'tls_version';- 升级客户端工具到新版本。比如在 Linux 上用旧版
mysql命令行,就安装新的mysql-client。 - 真着急,可以在命令行临时跳过 SSL:
mysql --ssl-mode=DISABLED -uroot -p这个只是绕过 SSL 握手问题,密码传输仍然以安全方式处理,但数据链路不加密。生产环境还是优先升级驱动,不要长期禁用 SSL。
如果项目里用的是 JDBC,连接串里加:
sslMode=DISABLED再次强调,这只是排查阶段的临时手段。
6.2 事件查看器里的 0xe0434352:别先怀疑 MySQL
Windows 上有一个很误导人的现象:MySQL 服务正常运行,但打开 MySQL Workbench 或某些图形工具时秒崩,Windows 事件查看器里记录异常代码0xe0434352。
看到这个代码,先别怀疑 MySQL 本体。0xe0434352是 .NET Runtime 抛出的异常编号,不是 MySQL 的错误码,通常和 .NET 组件损坏、Visual C++ 运行库缺失或管理工具版本太旧有关。
解决办法:
- 安装最新
.NET Framework 4.8。 - 安装最新的
Microsoft Visual C++ Redistributable。 - 把 MySQL Workbench 或连接工具升级到新版本。
大部分情况下做完这三步就正常了。如果你在服务端要用命令行连接 MySQL,直接mysql -uroot -p就能绕开图形工具这一层。
6.3 端口 10061、Access denied、临时密码过期
还有几个高频报错,放在一起说:
| 报错信息 | 原因 | 处理 |
|---|---|---|
Can't connect to MySQL server on 'localhost' (10061) | 服务没启动,或端口不对 | 确认net start MySQL,检查端口是否 3306 |
Access denied for user 'root'@'localhost' | 密码错误,或 root 认证方式不对 | 用正确密码重试,或重置密码 |
Your password has expired | 安装时强制密码过期策略 | 执行ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; |
ERROR 1130: Host 'x.x.x.x' is not allowed to connect | root 账号没有远程主机授权 | 创建业务账号或给 root 授权'root'@'%',但不推荐 |
遇到这些问题,思路是:先确认服务在跑,再确认端口通,最后确认账号权限。不要一上来就重装,重装解决不了权限配置问题。
6.4 root 密码忘记后的临时修复
安装在手,root 密码忘了,还有一招:
先停掉 MySQL 服务:
Windows:
net stop MySQLLinux:
sudo systemctl stop mysqld然后以跳过权限表方式启动:
mysqld --skip-grant-tables --shared-memoryWindows 上需要开一个管理员 CMD 在前台运行;Linux 上直接在前台跑也行。此时不需要密码就能进去:
mysql -uroot进去后立刻执行:
FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassw0rd!';改完密码后关闭这个进程,再正常启动服务。
注意,--skip-grant-tables启动期间 MySQL 是裸奔状态,任何本机能连接到 3306 的客户端都能无密码登录,所以只能在内网本机临时用,改完密码必须马上恢复。
7. 卸载重装不翻车:Windows、Linux、Docker 的残留清理
7.1 Windows 卸载:服务、目录、环境变量
Windows 上重装 MySQL 反复失败,八成是没卸载干净。
正确的卸载顺序是:
- 停止并删除服务:
net stop MySQL mysqld --remove MySQLmysqld --remove已经包含了删除服务的动作,如果提示服务不存在,再用管理员 CMD 执行sc delete MySQL。
- 删除整个 MySQL 目录,包括
D:\mysql和数据目录。 - 清理环境变量里
D:\mysql\bin的 Path 条目。 - 如果安装过 Installer 版,去
C:\Program Files\MySQL和C:\ProgramData\MySQL看有没有残留,ProgramData 是隐藏目录,很多人会漏掉。
7.2 Linux 卸载:包和数据目录
Ubuntu 上彻底卸载:
sudo systemctl stop mysql sudo apt purge mysql-server mysql-client mysql-common sudo rm -rf /var/lib/mysql sudo rm -rf /etc/mysqlCentOS / RHEL 上:
sudo systemctl stop mysqld sudo yum remove mysql-community-server mysql-community-client mysql-community-common sudo rm -rf /var/lib/mysql sudo rm -rf /etc/my.cnf/var/lib/mysql是数据目录,如果只是升级软件不想删数据,这步可以跳过。但如果遇到数据文件损坏或者不兼容,留着旧数据重装照样报错,该删就删。
7.3 Docker 卸载:容器、镜像、数据卷
Docker 卸载 MySQL 看起来就三条命令,但很多人忘了删数据卷:
docker stop mysql8 docker rm mysql8 docker rmi mysql:8.0 docker volume rm mysql8_data如果docker volume rm提示 volume 正在被占用,先把容器删掉再执行。数据卷不删,下次再跑docker run带相同卷名时,会复用旧数据,你设置的新MYSQL_ROOT_PASSWORD根本不会生效。
这也是为什么我前面说要先确认“数据卷是否有旧数据”,很多人在 Docker 里“重装” MySQL,装完了密码不对,就是这个原因。
说点实在的。我每次帮别人排查 MySQL 安装问题,最后都会强调一句:所有报错,第一件事是看日志,不是复制报错去群里问。Windows 看D:\mysql\data下的.err文件,Linux 看/var/log/mysqld.log,Docker 直接docker logs mysql8。日志里通常已经把原因写得明明白白,端口占用、目录权限、密码策略不满足都是直给的。先把日志看明白,再动手改配置,比反复重装省太多时间。希望这篇 mysql 安装教程能帮你把最耗时的装机环节一次走通。