MySQL 8.0 安装配置笔记(Ubuntu chroot + Windows 共存版)
MySQL 8.0 安装配置笔记(Ubuntu chroot + Windows 共存版)
文档说明:本文档包含两套环境下的 MySQL 8.0 安装记录 —— 第一部分是 chroot Ubuntu 22.04 ARM64 下的 apt 安装与手动初始化;第二部分是 Windows 免安装版(zip)与已有 MySQL 5.7 双版本共存的全流程。两者环境不同、操作不通用,请按实际平台查阅对应部分。
目录
第一部分:Ubuntu 22.04 ARM64(chroot)apt 安装 MySQL 8.0
1.1 准备工作(chroot 环境挂载)
确保必要的文件系统已挂载:
mount --bind /dev "$CHROOT_DIR/dev" |
- 作用:提供
/dev、/proc、/sys、/tmp、/run等必要目录,MySQL 运行时需要这些资源。 - 补充:建议额外挂载
/dev/shm(mount -t tmpfs -o size=256M tmpfs "$CHROOT_DIR/dev/shm"),避免临时表相关问题。
确认 MySQL 用户和组:
id mysql |
- 结果:
uid=107(mysql) gid=108(mysql)→ 已自动创建,无需手动添加。
1.2 安装 MySQL 服务器
apt update |
- 版本:MySQL 8.0.46-0ubuntu0.22.04.4(arm64)
- 注意:安装过程会自动创建
mysql用户和组、生成默认配置文件、初始化数据目录(但可能因 chroot 环境不完整而失败,需手动处理)。
1.3 手动初始化数据目录
由于 chroot 环境中 systemd 不可用,安装后需手动初始化。
创建必要目录并设置权限:
mkdir -p /var/lib/mysql |
初始化数据目录(无密码模式):
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql |
- 输出:生成
ibdata1、mysql系统库、binlog等文件。 - 注意:切勿重复初始化,否则会清空已有数据。
1.4 配置 MySQL
编写配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf,使用 cat 写入完整配置,关键参数:
[client] |
注意:
bind-address = 0.0.0.0是关键,否则只能本地连接。
修复 MySQL 用户 home 目录警告 —— 启动时出现 su: warning: cannot change directory to /nonexistent,执行:
usermod -d /var/lib/mysql mysql |
- 原因:系统默认 home 为
/nonexistent,init.d 脚本使用su - mysql时触发警告。
1.5 启动与开机自启
使用系统自带的 init.d 脚本 —— Ubuntu 的 mysql-server 包已提供 /etc/init.d/mysql,直接使用:
service mysql start |
- 结果:服务正常启动,
mysqld is alive。
注册开机自启:
update-rc.d mysql defaults |
- 效果:chroot 环境重启后 MySQL 自动启动。
1.6 创建用户与权限管理
创建业务用户 zzc:
CREATE USER 'zzc'@'%' IDENTIFIED BY 'root'; |
- 初衷:仅用于增删改查,不授予 DDL 权限。
- 注意:后续误操作授予了
ALL PRIVILEGES WITH GRANT OPTION,后又纠正回来。
创建测试数据库:
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
1.7 远程连接问题与解决
错误 1130:Host not allowed
- 现象:
ERROR 1130 (HY000): Host '192.168.5.11' is not allowed to connect - 原因:
root用户默认只允许localhost。 - 解决:使用
zzc用户(已允许%),或修改 root 的 host 为%(不推荐)。
错误 2026:SSL connection error
- 现象:
ERROR 2026 (HY000): SSL connection error: unknown error number - 原因:MySQL 8.0 默认要求 SSL,但 Windows 客户端版本较低(5.7.21)无法协商。
- 解决:连接时添加
--ssl-mode=DISABLED。
错误 2059:认证插件不支持
- 现象:
Authentication plugin 'caching_sha2_password' cannot be loaded - 原因:MySQL 8.0 默认使用
caching_sha2_password,但客户端 5.7.21 只支持mysql_native_password。 - 解决:在服务器端修改用户认证插件:
ALTER USER 'zzc'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; |
最终成功连接命令:
mysql -h 192.168.5.14 -u zzc -p --ssl-mode=DISABLED |
输入密码 root 后成功登录。
1.8 最终状态确认
| 项目 | 状态 |
|---|---|
| MySQL 版本 | 8.0.46 |
| 监听地址 | 0.0.0.0:3306 |
用户 zzc |
允许任意 IP,认证插件 mysql_native_password,权限为 SELECT, INSERT, UPDATE, DELETE ON *.* |
| 开机自启 | 已注册(update-rc.d mysql defaults) |
| 防火墙 | 宿主机需放行 3306 端口(ufw allow 3306/tcp) |
1.9 遗留问题与建议
密码安全:
zzc密码root极弱,务必修改为强密码:ALTER USER 'zzc'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!';
FLUSH PRIVILEGES;权限收紧:如果仅用于单一应用,应将
ON *.*改为ON 数据库名.*。升级客户端:Windows 上的 MySQL 5.7.21 客户端较老,建议升级到 8.0+ 版本以原生支持新认证插件,避免每次连接加
--ssl-mode=DISABLED。chroot 环境稳定性:确保宿主机在 chroot 启动前已挂载所有必要文件系统,否则 MySQL 可能无法正常启动。
第二部分:Windows 免安装版(与 MySQL 5.7 共存)
2.1 安装前的准备与核心原则
为什么要装第二个 MySQL? 你已经有一个 MySQL 5.7(端口 3306,服务名 MySQL57),需要再装一个 MySQL 8.0 用于学习或新项目。
核心原则:隔离性 —— 两个版本的服务名、端口、安装目录、配置文件、数据目录必须完全独立,否则会冲突。
下载与解压:
- 从 MySQL 官网下载 mysql-8.0.46-winx64.zip(免安装版)。
- 解压到无中文、无空格的路径,例如
D:\DevelopedTools\mysql-8.0.46-winx64。 - 坑 1:不要解压到桌面或含中文的路径,会导致后续服务启动失败。
2.2 配置文件 my.ini(最关键的环节)
文件位置与命名 —— 在 MySQL 8.0 的解压根目录下新建 my.ini 文件(不是 my-default.ini,也不是 my.cnf)。
配置内容详解(带注释版):
[mysqld] |
配置文件的三大致命陷阱:
| 陷阱 | 表现 | 解决方法 |
|---|---|---|
| 编码问题 | 服务启动报 3534 错误,mysqld --console 却能启动 |
用记事本另存为 ANSI 编码(不要用 UTF-8) |
| 路径带双引号 | 服务启动报 3534 错误 | basedir 和 datadir 的值不要加双引号 |
| 路径分隔符 | 服务启动报 3534 错误 | 使用双反斜杠 \\ 或正斜杠 /,不要用单反斜杠 \ |
| 日志目录不存在 | 服务启动报 3534 错误 | 手动创建 log 目录 |
2.3 初始化数据库
管理员 CMD 进入 bin 目录:
cd /d D:\DevelopedTools\mysql-8.0.46-winx64\bin |
坑 2:必须以管理员身份运行 CMD,否则后续注册服务和启动都会报权限错误。
执行初始化命令:
mysqld --initialize --console |
- 执行后屏幕会输出类似
A temporary password is generated for root@localhost: >3h_y)7WQhe&。 - 坑 3:立即复制保存这个临时密码,一旦关闭窗口就找不到了(除非去 data 目录下的
.err文件里翻)。 - 坑 4:如果 data 目录已存在(比如之前初始化过),必须先清空 data 目录再执行,否则报错。
初始化失败的常见原因:
| 错误现象 | 原因 | 解决 |
|---|---|---|
| 报错找 5.7 的文件 | 环境变量 PATH 里残留了 5.7 的路径 | 清理系统环境变量中的 MySQL 5.7 路径 |
| 卡在 InnoDB 初始化 | 杀毒软件拦截 | 临时关闭 Windows Defender 实时保护 |
报错 --initialize 已存在 |
data 目录非空 | 删除 data 目录后重试 |
2.4 注册 Windows 服务
注册命令:
mysqld --install MySQL80 --defaults-file="D:\DevelopedTools\mysql-8.0.46-winx64\my.ini" |
- 服务名:
MySQL80(区别于 5.7 的MySQL57)。 - 坑 5:
--install必须在服务名前面,--defaults-file在后面,且路径必须用引号包裹。 - 坑 6:如果之前注册过同名服务,必须先删除:
sc delete MySQL80。
启动服务:
net start MySQL80 |
启动失败的终极排查(3534 错误):
| 排查步骤 | 命令 | 说明 |
|---|---|---|
| 查看真实报错 | mysqld --defaults-file="..." --console |
前台运行,错误会直接打印在屏幕上 |
| 检查端口占用 | netstat -ano | findstr 13306 |
如果有 LISTENING,用 taskkill /f /pid 进程ID 杀掉 |
| 检查配置文件 | 用记事本打开 my.ini,另存为 ANSI | 编码问题是最大的隐形杀手 |
| 检查数据目录 | 确保 data 目录存在且由 --initialize 生成 |
不要手动创建或拷贝 |
2.5 登录与修改密码
登录:
mysql -u root -p -P 13306 |
- 坑 7:
-P是大写字母 P(端口),-p是小写字母 p(密码)。 - 坑 8:密码输入时不会显示任何字符(包括星号),这是正常的安全机制。
修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; |
- 坑 9:MySQL 8.0 默认密码策略要求包含大小写、数字和特殊字符(如
Root@12345)。 - 坑 10:如果报错
ERROR 1396,说明用户不存在或主机不匹配,先查SELECT user, host FROM mysql.user;。
2.6 远程连接(重中之重)
服务器端配置
创建远程用户(不要直接用 root):
CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;- 坑 11:
'myuser'@'%'和'myuser'@'localhost'是两个不同的用户,必须分别创建。 - 坑 12:
WITH mysql_native_password是为了兼容旧版客户端(如 SQLyog),否则报 2058 错误。
- 坑 11:
修改 my.ini 允许远程连接:
bind-address = 0.0.0.0
(默认可能只绑定了 127.0.0.1,修改后重启服务)
防火墙放行端口:
- Windows:控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → 13306。
- 云服务器:在安全组中添加入方向规则,放行 13306 端口。
客户端连接
命令行连接:
mysql -h 服务器公网IP -P 13306 -u myuser -p |
SQLyog 连接:
- 主机地址:服务器公网 IP
- 端口:13306
- 用户名:myuser
- 密码:你设置的强密码
- 坑 13:SQLyog 旧版本(13.1.x 以下)不支持
caching_sha2_password,必须用mysql_native_password。 - 坑 14:SQLyog 13.2.0 社区版免费,但仍有兼容问题;建议用 DBeaver(免费、更新及时)。
远程连接失败速查表:
| 错误码 | 含义 | 解决方法 |
|---|---|---|
| 2003 | 无法连接(端口不通) | 检查防火墙/安全组、MySQL 服务是否启动 |
| 1045 | 密码错误或用户无权 | 检查用户名、密码、host 是否匹配 |
| 2058 | 认证插件不兼容 | 改为 mysql_native_password |
| 1130 | 主机不允许连接 | 检查用户 host 是否为 % 或你的 IP |
2.7 双版本共存管理
| 项目 | MySQL 5.7 | MySQL 8.0 |
|---|---|---|
| 安装目录 | D:\...\mysql-5.7.21-winx64 |
D:\...\mysql-8.0.46-winx64 |
| 服务名 | MySQL57 | MySQL80 |
| 端口 | 3306 | 13306 |
| 配置文件 | 各自的 my.ini | 各自的 my.ini |
| 数据目录 | 各自的 data | 各自的 data |
| 启动/停止 | net start/stop MySQL57 |
net start/stop MySQL80 |
| 连接命令 | mysql -P 3306 -u root -p |
mysql -P 13306 -u root -p |
坑 15:环境变量 PATH 中不要同时加两个 MySQL 的 bin 目录,否则命令行 mysql 命令会混乱。建议只加常用的那个,另一个用绝对路径调用。
2.8 总结与建议
最佳实践
配置文件:每次修改 my.ini 后,务必检查编码(ANSI)和路径格式。
服务管理:注册服务时一定要带
--defaults-file,否则可能读到错误的配置文件。密码策略:开发环境可以降低密码强度:
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 4;工具选择:推荐 DBeaver CE(免费、跨平台、支持 MySQL 8.0 新特性)。
你踩过的所有坑一览
- 配置文件编码不是 ANSI → 服务启动 3534
- 路径带了双引号 → 服务启动 3534
- 日志目录没创建 → 服务启动 3534
- 环境变量残留 5.7 路径 → 初始化报错找 5.7 文件
- 端口被占用 → 服务启动 3534
- 杀毒软件拦截 InnoDB → 初始化卡死
- 临时密码没保存 → 只能重新初始化
- SQLyog 不支持新认证插件 → 报 2058 错误
- 用户 host 不匹配 → 报 1396 错误
- 密码不符合策略 → 报密码太简单
一句话口诀
编码 ANSI 路径对,端口独立服务名,初始化后记密码,远程授权加插件。



