Oracle MySQL8.0升级8.4,无感升级数据库

仅用于个人学习记录

若显示无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(与旧库双实例共存)

    1. 下载 MySQL 8.4.8 Windows 压缩版,解压至 D:\mysql-8.4.8-winx64

      • 访问地址:https://downloads.mysql.com/archives/community/

      • 选择产品版本 :在页面的 "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" 即可开始下载。

    2. 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
    3. 管理员 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)正常运行,不中断业务。

    4. 如果初始化报错,需要手动删除数据目录

      因为初始化中断,D:\mysql-8.4.8-winx64\data\ 已经损坏,需要删除后重试

      复制代码
      -- 仅异常时执行
      rmdir /s /q D:\mysql-8.4.8-winx64\data

    4. 运行升级检查 & 数据导入

    1. 登录新 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                # 重新初始化,记全新密码
    2. 导入本地库备份数据:

      复制代码
      -- 切换编码方式
      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
    3. 报错及修复

      报错:

      复制代码
      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;
    4. 登录新实例验证

    5. 验证数据完整性 & 业务切换

    1. 数据校验:对比新旧库数据库、表数量、核心表数据行数、存储过程、触发器一致性;

      复制代码
      -- 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 业务库名.核心表名;
    2. 业务测试:应用连接新库 3307 端口,测试增删改查、业务功能正常;

    3. 平滑切换:修改业务配置,数据库端口由 3306 改为 3307,重启业务服务;

    4. 风险回滚:若异常,直接切回旧库 3306,业务秒级恢复。

相关推荐
u0110225121 小时前
如何自定义查询历史记录面板的展示风格_时间轴样式设计
jvm·数据库·python
2301_769340671 小时前
HTML怎么实现快捷跳转顶部_HTML固定悬浮锚点按钮【介绍】
jvm·数据库·python
m0_609160491 小时前
MySQL如何限制触发器递归调用的深度_防止触发器死循环方法
jvm·数据库·python
呼Lu噜1 小时前
基于C#的ASP.NET Core中分析async、await的使用场景
数据库·c#·asp.net
李白的天不白1 小时前
大规模请求数据并发问题
java·前端·数据库
zjy277771 小时前
Golang bcrypt如何加密密码_Golang密码加密教程【收藏】
jvm·数据库·python
万邦科技Lafite1 小时前
API接口一键获取商品评论,根据商品评论分析客户画像
linux·服务器·数据库·windows·microsoft·电商开放平台
phltxy1 小时前
Redis 核心数据类型之 String 详解
数据库·redis·bootstrap
老纪1 小时前
Redis怎样利用Lua为多个Key同步续期
jvm·数据库·python