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"
mount --bind /proc "$CHROOT_DIR/proc"
mount --bind /sys "$CHROOT_DIR/sys"
mount -t devpts -o gid=5,mode=0620 devpts "$CHROOT_DIR/dev/pts"
mount -t tmpfs -o mode=1777 tmpfs "$CHROOT_DIR/tmp"
mount -t tmpfs -o mode=0755 tmpfs "$CHROOT_DIR/run"
  • 作用:提供 /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
apt install mysql-server -y
  • 版本:MySQL 8.0.46-0ubuntu0.22.04.4(arm64)
  • 注意:安装过程会自动创建 mysql 用户和组、生成默认配置文件、初始化数据目录(但可能因 chroot 环境不完整而失败,需手动处理)。

1.3 手动初始化数据目录

由于 chroot 环境中 systemd 不可用,安装后需手动初始化。

创建必要目录并设置权限:

mkdir -p /var/lib/mysql
mkdir -p /var/run/mysqld
mkdir -p /var/log/mysql
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/log/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]
socket = /var/run/mysqld/mysqld.sock

[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
bind-address = 0.0.0.0 # 允许局域网访问
mysqlx-bind-address = 127.0.0.1 # X Plugin 仅本地
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-storage-engine = InnoDB
innodb_buffer_pool_size = 128M
max_connections = 150
...

注意: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
service mysql status
mysqladmin ping
  • 结果:服务正常启动,mysqld is alive。

注册开机自启:

update-rc.d mysql defaults
  • 效果:chroot 环境重启后 MySQL 自动启动。

1.6 创建用户与权限管理

创建业务用户 zzc:

CREATE USER 'zzc'@'%' IDENTIFIED BY 'root';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'zzc'@'%';
FLUSH PRIVILEGES;
  • 初衷:仅用于增删改查,不授予 DDL 权限。
  • 注意:后续误操作授予了 ALL PRIVILEGES WITH GRANT OPTION,后又纠正回来。

创建测试数据库:

CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'zzc'@'%';
FLUSH PRIVILEGES;

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';
FLUSH PRIVILEGES;

最终成功连接命令:

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 遗留问题与建议

  1. 密码安全:zzc 密码 root 极弱,务必修改为强密码:

    ALTER USER 'zzc'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!';
    FLUSH PRIVILEGES;
  2. 权限收紧:如果仅用于单一应用,应将 ON *.* 改为 ON 数据库名.*。

  3. 升级客户端:Windows 上的 MySQL 5.7.21 客户端较老,建议升级到 8.0+ 版本以原生支持新认证插件,避免每次连接加 --ssl-mode=DISABLED。

  4. 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]
# MySQL 安装目录(注意:路径值不要加双引号,使用双反斜杠)
basedir=D:\\DevelopedTools\\mysql-8.0.46-winx64\\
# 数据存放目录(不要手动创建,执行 --initialize 时会自动生成)
datadir=D:\\DevelopedTools\\mysql-8.0.46-winx64\\data\\
# 端口号(与已有 5.7 的 3306 错开,这里用 13306)
port=13306
# 服务端默认字符集
character-set-server=utf8mb4
# 排序规则(使用通用兼容的 general_ci,避免 8.0 特定规则解析问题)
collation-server=utf8mb4_general_ci
# 默认存储引擎
default-storage-engine=INNODB
# 错误日志路径(注意:必须提前手动创建 log 目录,否则启动报错)
log-error=D:\\DevelopedTools\\mysql-8.0.46-winx64\\log\\error.log
# 服务器ID(单机环境可保留)
server-id=80
# 最大连接数
max_connections=200

[client]
# 客户端连接端口(必须与上方 [mysqld] 的端口一致)
port=13306
# 客户端默认字符集
default-character-set=utf8mb4

[mysql]
# mysql 命令行工具的默认字符集
default-character-set=utf8mb4

配置文件的三大致命陷阱:

陷阱 表现 解决方法
编码问题 服务启动报 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 远程连接(重中之重)

服务器端配置

  1. 创建远程用户(不要直接用 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 错误。
  2. 修改 my.ini 允许远程连接:

    bind-address = 0.0.0.0

    (默认可能只绑定了 127.0.0.1,修改后重启服务)

  3. 防火墙放行端口:

    • 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 总结与建议

最佳实践

  1. 配置文件:每次修改 my.ini 后,务必检查编码(ANSI)和路径格式。

  2. 服务管理:注册服务时一定要带 --defaults-file,否则可能读到错误的配置文件。

  3. 密码策略:开发环境可以降低密码强度:

    SET GLOBAL validate_password.policy = LOW;
    SET GLOBAL validate_password.length = 4;
  4. 工具选择:推荐 DBeaver CE(免费、跨平台、支持 MySQL 8.0 新特性)。

你踩过的所有坑一览

  1. 配置文件编码不是 ANSI → 服务启动 3534
  2. 路径带了双引号 → 服务启动 3534
  3. 日志目录没创建 → 服务启动 3534
  4. 环境变量残留 5.7 路径 → 初始化报错找 5.7 文件
  5. 端口被占用 → 服务启动 3534
  6. 杀毒软件拦截 InnoDB → 初始化卡死
  7. 临时密码没保存 → 只能重新初始化
  8. SQLyog 不支持新认证插件 → 报 2058 错误
  9. 用户 host 不匹配 → 报 1396 错误
  10. 密码不符合策略 → 报密码太简单

一句话口诀

编码 ANSI 路径对,端口独立服务名,初始化后记密码,远程授权加插件。