仅用于个人学习记录
若显示无mysqldump,可先进行步骤2
-
异常:MySQL版本存在安全漏洞
-
原因:使用了旧版本MySQL
-
修复方式:升级MySQL至8.2.0或更高版本
-
修复过程
1.本地 MySQL 8.0 全量备份(Windows CMD)
进入 MySQL8.0 的 bin 目录,执行:
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin" mysqldump -u root -p --single-transaction --routines --triggers --events --all-databases > D:\mysql8_local_backup.sql参数说明:
--single-transaction:InnoDB 引擎热备份,不锁表、不影响线上业务--routines --triggers --events:完整备份存储过程、触发器、定时事件- 仅导出数据,不修改、不删除原库数据
2.远程 MySQL 数据库备份(Windows CMD)(示例IP 192.168.1.100)
mysqldump -h 192.168.1.100 -P 3306 -u root -p --single-transaction --routines --triggers --events --all-databases > D:\mysql8_remote_backup.sql远程库仅做备份留存,本次升级不改动远程库。
检查备份文件大小非零,末尾有完成标识。
3.下载并安装 MySQL 8.4.8(与旧库双实例共存)
-
下载 MySQL 8.4.8 Windows 压缩版,解压至
D:\mysql-8.4.8-winx64-
选择产品版本 :在页面的 "Product Version " 下拉菜单中,选择
8.4.8。 -
选择操作系统 :在 "Operating System " 下拉菜单中,选择
Microsoft Windows。 -
选择安装包 :在下方列表中找到 "Windows (x86, 64-bit), ZIP Archive ",点击右侧对应的 "Download" 按钮。
注意:不要选带 "Debug Binaries" 的测试包。标准 ZIP 包大小约 200MB。
-
启动下载 :页面可能跳转至登录提示页,直接点击底部的 "No thanks, just start my download" 即可开始下载。
-
在
D:\mysql-8.4.8-winx64,新建配置文件my.ini,配置独立端口 3307,与旧库 3306 隔离[mysqld] basedir=D:/mysql-8.4.8-winx64 datadir=D:/mysql-8.4.8-winx64/data port=3307 character-set-server=utf8mb4 default-storage-engine=INNODB [client] port=3307 -
管理员 CMD 执行初始化、安装独立服务、启动新实例:
D: cd D:\mysql-8.4.8-winx64\bin -- 初始化并获取临时密码 mysqld --initialize --console -- 记录返回的临时密码,没有它,你接下来无法登录新数据库,只能删掉 data 目录重新初始化,重来一遍。 A temporary password is generated for root@localhost: Or2iJiy3zj<. -- 安装服务并启动 mysqld --install MySQL84 --defaults-file="D:\mysql-8.4.8-winx64\my.ini" net start MySQL84旧 MySQL8.0(服务名 MySQL80,端口 3306)正常运行,不中断业务。
-
如果初始化报错,需要手动删除数据目录
因为初始化中断,
D:\mysql-8.4.8-winx64\data\已经损坏,需要删除后重试:-- 仅异常时执行 rmdir /s /q D:\mysql-8.4.8-winx64\data
4. 运行升级检查 & 数据导入
-
登录新 MySQL8.2.0 实例,修改 root 密码:
-- 登录改密 mysql -u root -P 3307 -p -- 弹出 Enter password: 时,粘贴刚才记下的临时密码,点击一下右键 ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; --刷新 FLUSH PRIVILEGES; -- 执行兼容配置 关闭行大小严格检查 不要重启服务,会导致临时设置失效 SET GLOBAL log_bin_trust_function_creators = ON; SET GLOBAL innodb_strict_mode = OFF; SET GLOBAL sql_mode = ''; -- 退出mysql exit;如果登录失败,重新初始化一次,记住密码
net stop MySQL84 # 如果服务已启动就先停 sc delete MySQL84 # 删除旧服务 rmdir /s /q D:\mysql-8.4.8-winx64\data # 清数据 mysqld --initialize --console # 重新初始化,记全新密码 -
导入本地库备份数据:
-- 切换编码方式 chcp 65001 D: cd D:\mysql-8.4.8-winx64\bin -- CMD执行,一条命令搞定,需要先进行下面的废弃属性剔除 -- mysql -u root -P 3307 -p --default-character-set=utf8mb4 < D:\mysql8_remote_backup.sql -
报错及修复
报错:
ERROR 1231 (42000) at line 2552: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'原因:
- 远程备份来自 旧版 MySQL(5.7 或早期 8.0) ,里面设置了
sql_mode包含NO_AUTO_CREATE_USER。 - MySQL 8.4 已彻底移除这个模式,所以导入时报错中断。
解决方法:
- 从备份文件中删除
NO_AUTO_CREATE_USER - 查找:
NO_AUTO_CREATE_USER, - 替换为:(留空)
命令行替换(PowerShell):
如果从未运行过 PowerShell 脚本,先执行
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass允许当前窗口运行脚本。
执行这个脚本需要很长时间,需要等待
$infile = "D:\mysql8_remote_backup.sql" $outfile = "D:\mysql8_remote_backup_fixed.sql" $reader = [System.IO.StreamReader]::new($infile, [System.Text.Encoding]::UTF8) $writer = [System.IO.StreamWriter]::new($outfile, $false, [System.Text.Encoding]::UTF8) while (($line = $reader.ReadLine()) -ne $null) { # 删除 NO_AUTO_CREATE_USER 及其前后的逗号 $line = $line -replace 'NO_AUTO_CREATE_USER,?' -replace ',?NO_AUTO_CREATE_USER' -replace 'NO_AUTO_CREATE_USER' $writer.WriteLine($line) } $writer.Close() $reader.Close() Write-Host "Done! Fixed file: $outfile"然后再导入修复后的文件:
-- 切换编码方式 chcp 65001 D: cd D:\mysql-8.4.8-winx64\bin mysql -u root -P 3307 -p --default-character-set=utf8mb4 < D:\mysql8_remote_backup_fixed.sql --恢复设置 mysql -u root -P 3307 -p SET GLOBAL log_bin_trust_function_creators = OFF; SET GLOBAL innodb_strict_mode = ON; SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; exit; - 远程备份来自 旧版 MySQL(5.7 或早期 8.0) ,里面设置了
-
登录新实例验证
5. 验证数据完整性 & 业务切换
-
数据校验:对比新旧库数据库、表数量、核心表数据行数、存储过程、触发器一致性;
-- 1. 库的数量和名称 SELECT schema_name FROM information_schema.schemata ORDER BY schema_name; -- 2. 表数量(每个库) SELECT table_schema, COUNT(*) AS table_count FROM information_schema.tables WHERE table_type = 'BASE TABLE' GROUP BY table_schema ORDER BY table_schema; -- 3. 存储过程数量 SELECT COUNT(*) AS proc_count FROM information_schema.routines WHERE routine_type = 'PROCEDURE'; -- 4. 触发器数量 SELECT COUNT(*) AS trigger_count FROM information_schema.triggers; -- 5. 业务库中核心表行数(逐个执行,两库比对) SELECT COUNT(*) FROM 业务库名.核心表名; -
业务测试:应用连接新库 3307 端口,测试增删改查、业务功能正常;
-
平滑切换:修改业务配置,数据库端口由 3306 改为 3307,重启业务服务;
-
风险回滚:若异常,直接切回旧库 3306,业务秒级恢复。