mysql升级前需要备份哪些数据_mysql安全迁移步骤

8次阅读

必须物理备份/var/lib/mysql/mysql目录,因innodb_index_stats等系统表结构不兼容,mysqldump无法可靠导出;performance_schema和information_schema无需备份;GTID需记录gtid_executed;停机前需read_only+FLUSH TABLES WITH READ LOCK并验证无活跃连接;备份须含–single-transaction –routines –triggers –events;需检查mysql.user插件兼容性及配置文件废弃参数。

mysql升级前需要备份哪些数据_mysql安全迁移步骤

必须备份 mysql 系统库、所有业务库的结构与数据,以及 mysqld.cnf(或 my.cnf配置文件mysql.user 表权限快照——漏掉任意一项都可能造成升级后服务不可用或权限丢失。

哪些数据不能只靠 mysqldump 全量导出

MySQL 升级时,mysql 系统库中的部分表(如 innodb_index_statsinnodb_table_statsslave_master_info 等)在新旧版本间结构不兼容,直接 mysqldump 导入会失败或被忽略。它们依赖 mysql_upgrademysqld --upgrade=FORCE 重建,但前提是原始 mysql 库文件(ibdata1、系统表空间、mysql/ 目录下的 frm / ibd 文件)本身要保留或完整迁移。

  • 必须物理备份 /var/lib/mysql/mysql/ 整个目录(或对应 datadir 下的 mysql 子目录),尤其当使用 MySQL 5.7+ 的 InnoDB 系统表时
  • performance_schemainformation_schema 不需备份——它们是内存视图,重启即重建
  • 若启用了 GTID 复制,还需记录当前 select @@global.gtid_executed; 输出,用于新实例初始化时对齐

如何安全停机并验证备份可用性

停机不是简单执行 systemctl stop mysql 就完事。关键在于确认所有事务已落盘、无活跃连接、且备份能还原出一致状态。

  • 先执行 SET GLOBAL read_only = ON;,再 FLUSH TABLES WITH READ LOCK;,阻断写入
  • SHOW PROCEsslIST; 确认无 Query 状态的非 Sleep 连接;有则需人工干预或等待
  • mysqldump 必须加 --single-transaction --routines --triggers --events,否则存储过程、事件调度器逻辑会丢失
  • 备份完成后,立刻用 mysqlcheck -u root -p --all-databases --check 验证 dump 文件语法可解析;再选一个非核心库做快速还原测试

配置文件与用户权限的隐性风险点

MySQL 8.0 起默认禁用 old_passwords,废弃 mysql_native_password 插件以外的认证方式;5.7 升 8.0 时若未提前处理,会导致老账号无法登录。

  • 备份前运行 SELECT user,host,plugin FROM mysql.user;,重点检查是否含 sha256_password 或已弃用插件
  • 对比新旧版本的默认配置差异:sql_mode(如 8.0 默认含 STRICT_TRANS_TABLES)、default_authentication_pluginexplicit_defaults_for_timestamp 等,避免还原后 SQL 报错
  • 配置文件中注释掉所有已废弃参数(如 query_cache_type 在 8.0 中彻底移除),否则 mysqld 启动失败

升级不是替换二进制包就结束的事。最常被跳过的一步是:没在旧实例上运行 mysql_upgrade(针对 5.7→5.7.x 小版本)或没用新版本 mysqld --initialize 初始化系统表(针对跨大版本)。一旦跳过,mysql 库元数据损坏,后续任何权限操作或 DDL 都可能静默失败。

text=ZqhQzanResources