Skip to content

MySQL 同版本迁移

迁移前准备

环境评估

业务影响评估

  • 评估迁移对业务的影响范围和持续时间
  • 确定合适的迁移窗口,避开业务高峰
  • 制定详细的迁移计划和回滚方案

源数据库评估

  • 收集源数据库的基本信息:版本、存储引擎、字符集、数据量
  • 分析数据库负载情况:QPS、TPS、连接数
  • 检查数据库健康状态:是否存在慢查询、死锁、主从延迟等问题
  • 确认源数据库的备份状态:最近一次全备时间、备份完整性

目标环境准备

  • 确保目标服务器硬件配置不低于源服务器
  • 安装与源数据库完全相同版本的MySQL
  • 配置目标数据库参数,参考源数据库但根据目标服务器硬件进行调整
  • 配置网络连接:确保源和目标服务器之间网络通畅,防火墙已开放必要端口
  • 准备足够的磁盘空间:建议目标磁盘空间为源数据大小的2-3倍

迁移工具选择

同版本迁移常用工具对比:

工具适用场景优点缺点版本支持
mysqldump中小型数据库(< 50GB)简单易用、无需额外工具、支持单库/单表迁移迁移时间长、锁表(InnoDB可使用--single-transaction)所有版本
XtraBackup大型数据库(> 50GB)热备份、无锁、支持增量备份需要安装额外工具、配置复杂5.6+
MySQL Enterprise Backup企业级数据库官方支持、功能齐全、性能优异商业软件、需要付费5.6+
物理文件拷贝停机迁移迁移速度快、适合所有存储引擎需要停机、版本和配置必须完全一致所有版本

迁移方法详解

1. mysqldump 迁移法

适用场景:中小型数据库、需要选择性迁移部分库表

操作步骤

  1. 源数据库备份

    bash
    # 全库备份(包括存储过程、触发器、事件)
    mysqldump -h source_host -u root -p --single-transaction --routines --triggers --events --all-databases > all_databases.sql
    
    # 单库备份
    mysqldump -h source_host -u root -p --single-transaction --routines --triggers --events dbname > dbname.sql
    
    # 单表备份
    mysqldump -h source_host -u root -p --single-transaction dbname tablename > tablename.sql
  2. 传输备份文件到目标服务器

    bash
    scp all_databases.sql target_host:/tmp/
  3. 目标数据库恢复

    bash
    mysql -h target_host -u root -p < /tmp/all_databases.sql

版本差异注意事项

  • MySQL 5.6:默认不包含--login-path选项,需要明文输入密码
  • MySQL 5.7+:建议使用--login-path进行安全认证
  • MySQL 8.0:--default-auth默认值为caching_sha2_password,注意客户端兼容性

2. XtraBackup 迁移法

适用场景:大型数据库、需要最小化停机时间

操作步骤

  1. 源数据库备份

    bash
    # 全量备份
    xtrabackup --backup --target-dir=/backup/full --user=root --password=password
    
    # 准备备份文件(使数据文件处于一致性状态)
    xtrabackup --prepare --target-dir=/backup/full
  2. 传输备份文件到目标服务器

    bash
    rsync -avP /backup/full/ target_host:/backup/full/
  3. 目标数据库恢复

    bash
    # 停止目标MySQL服务
    systemctl stop mysqld
    
    # 清空目标数据目录
    rm -rf /var/lib/mysql/*
    
    # 恢复备份
    xtrabackup --copy-back --target-dir=/backup/full
    
    # 设置正确的权限
    chown -R mysql:mysql /var/lib/mysql
    
    # 启动MySQL服务
    systemctl start mysqld

版本差异注意事项

  • MySQL 5.6:使用Percona XtraBackup 2.3.x版本
  • MySQL 5.7:使用Percona XtraBackup 2.4.x版本
  • MySQL 8.0:使用Percona XtraBackup 8.0.x版本,注意与MySQL版本严格对应

3. 物理文件拷贝法

适用场景:需要快速迁移、可以接受停机时间

操作步骤

  1. 停止源数据库服务

    bash
    systemctl stop mysqld
  2. 拷贝数据文件到目标服务器

    bash
    rsync -avP /var/lib/mysql/ target_host:/var/lib/mysql/
  3. 配置目标数据库

    • 复制源数据库的my.cnf配置文件到目标服务器
    • 确保配置文件中的路径和参数与目标服务器匹配
    • 设置正确的权限
      bash
      chown -R mysql:mysql /var/lib/mysql
      chmod 700 /var/lib/mysql
  4. 启动目标数据库服务

    bash
    systemctl start mysqld

版本差异注意事项

  • 所有版本:必须确保源和目标MySQL版本完全一致
  • MySQL 5.7+:需要注意innodb_data_home_dirinnodb_log_group_home_dir参数配置
  • MySQL 8.0:需要额外拷贝auto.cnf文件以保持server_uuid一致(可选)

迁移验证

基本验证

  1. 数据库连接验证

    bash
    mysql -h target_host -u root -p -e "select version();"
  2. 数据库完整性验证

    bash
    # 源数据库
    mysql -h source_host -u root -p -e "show databases;" > source_dbs.txt
    
    # 目标数据库
    mysql -h target_host -u root -p -e "show databases;" > target_dbs.txt
    
    # 对比数据库列表
    diff source_dbs.txt target_dbs.txt
  3. 表数量验证

    bash
    # 源数据库
    mysql -h source_host -u root -p -e "select count(*) from information_schema.tables where table_schema not in ('information_schema','mysql','performance_schema','sys');" > source_tables.txt
    
    # 目标数据库
    mysql -h target_host -u root -p -e "select count(*) from information_schema.tables where table_schema not in ('information_schema','mysql','performance_schema','sys');" > target_tables.txt
    
    # 对比表数量
    diff source_tables.txt target_tables.txt
  4. 数据量验证

    bash
    # 生成源数据库各表数据量统计
    mysql -h source_host -u root -p -e "SELECT table_schema, table_name, table_rows FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql','performance_schema','sys') ORDER BY table_schema, table_name;" > source_row_counts.txt
    
    # 生成目标数据库各表数据量统计
    mysql -h target_host -u root -p -e "SELECT table_schema, table_name, table_rows FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql','performance_schema','sys') ORDER BY table_schema, table_name;" > target_row_counts.txt
    
    # 对比数据量
    diff source_row_counts.txt target_row_counts.txt

功能验证

  1. 存储过程、触发器、事件验证

    bash
    # 源数据库
    mysql -h source_host -u root -p -e "SELECT routine_schema, routine_name FROM information_schema.routines WHERE routine_schema NOT IN ('information_schema','mysql','performance_schema','sys');" > source_routines.txt
    
    # 目标数据库
    mysql -h target_host -u root -p -e "SELECT routine_schema, routine_name FROM information_schema.routines WHERE routine_schema NOT IN ('information_schema','mysql','performance_schema','sys');" > target_routines.txt
    
    # 对比
    diff source_routines.txt target_routines.txt
  2. 用户和权限验证

    bash
    # 源数据库
    mysql -h source_host -u root -p -e "SELECT user, host FROM mysql.user;" > source_users.txt
    
    # 目标数据库
    mysql -h target_host -u root -p -e "SELECT user, host FROM mysql.user;" > target_users.txt
    
    # 对比
    diff source_users.txt target_users.txt
  3. 业务功能验证

    • 执行业务关键SQL查询,对比源和目标数据库结果
    • 测试应用程序连接目标数据库,验证业务功能正常
    • 监控目标数据库性能,确保QPS、TPS等指标与源数据库一致

迁移后优化

  1. 更新统计信息

    sql
    -- MySQL 5.6/5.7
    ANALYZE TABLE dbname.tablename;
    
    -- MySQL 8.0
    ANALYZE TABLE dbname.tablename UPDATE HISTOGRAM ON col1, col2;
  2. 重建索引(可选)

    sql
    ALTER TABLE dbname.tablename ENGINE=InnoDB;
  3. 优化表空间

    sql
    OPTIMIZE TABLE dbname.tablename;
  4. 调整参数

    • 根据目标服务器硬件调整innodb_buffer_pool_sizeinnodb_log_file_size等关键参数
    • 监控目标数据库性能,逐步优化参数配置

回滚方案

回滚条件

当出现以下情况时,需要执行回滚操作:

  • 迁移过程中出现不可修复的错误
  • 目标数据库验证失败
  • 业务应用连接目标数据库后出现严重问题
  • 迁移时间超过预期,影响业务正常运行

回滚步骤

  1. 停止应用访问目标数据库
  2. 启动源数据库服务(如果已停止)
  3. 恢复应用连接到源数据库
  4. 清理目标数据库环境(可选)

最佳实践

  1. 迁移前

    • 制定详细的迁移计划和回滚方案,包括时间点、责任人、操作步骤
    • 进行充分的测试迁移,验证迁移方法的可行性和迁移时间
    • 通知相关业务团队,获得业务方的支持和确认
  2. 迁移中

    • 严格按照迁移计划执行,记录每一步操作和结果
    • 实时监控迁移过程,及时发现和解决问题
    • 保持与业务团队的沟通,及时通报迁移进度
  3. 迁移后

    • 进行全面的验证,确保数据完整性和业务功能正常
    • 监控目标数据库性能,及时调整参数
    • 保留源数据库一段时间(建议1-2周),确保目标数据库稳定运行
  4. 版本特定注意事项

    • MySQL 5.6:注意innodb_file_per_table参数配置,默认值为OFF
    • MySQL 5.7:默认启用innodb_file_per_table,注意表空间管理
    • MySQL 8.0:默认使用caching_sha2_password认证插件,注意客户端兼容性

常见问题处理

  1. 迁移过程中网络中断

    • 使用rsync进行增量传输,恢复迁移
    • 检查网络连接,修复网络问题后重新开始
  2. 目标数据库磁盘空间不足

    • 停止迁移,清理目标服务器不必要的文件
    • 扩展目标服务器磁盘空间
    • 考虑分批次迁移,先迁移核心库表
  3. mysqldump备份时间过长

    • 考虑使用XtraBackup进行热备份
    • 分库分表备份,并行恢复
    • 调整备份参数,如增加--max-allowed-packet
  4. XtraBackup备份失败

    • 检查源数据库状态,确保没有崩溃恢复正在进行
    • 检查XtraBackup版本与MySQL版本是否兼容
    • 查看错误日志,根据具体错误信息进行处理

总结

同版本迁移是MySQL运维中常见的操作,选择合适的迁移方法和工具对于确保迁移成功至关重要。在实际生产环境中,DBA需要根据数据库规模、业务需求和可用资源,制定详细的迁移计划,并严格按照计划执行。迁移完成后,必须进行全面的验证和监控,确保目标数据库稳定运行。