Skip to content

MySQL 同版本迁移 ​

同版本迁移的概念 ​

MySQL 同版本迁移是指在相同 MySQL 主版本和小版本之间的数据迁移,例如从 MySQL 5.7.31 迁移到另一台服务器的 MySQL 5.7.31,或从 MySQL 8.0.21 迁移到 MySQL 8.0.21。同版本迁移通常用于服务器迁移、硬件升级、架构调整等场景。

同版本迁移的重要性 ​

1. 服务器升级 ​

当现有服务器硬件老化或性能不足时,需要将数据库迁移到新的服务器。

2. 架构调整 ​

例如从单机架构迁移到主从复制架构,或从主从架构迁移到集群架构。

3. 数据中心迁移 ​

当公司数据中心迁移时,需要将数据库迁移到新的数据中心。

4. 灾难恢复 ​

在灾难恢复场景中,需要将数据迁移到备用服务器。

同版本迁移的方法 ​

1. 逻辑备份恢复 ​

使用 mysqldump 或 mysqlpump 工具进行逻辑备份,然后在目标服务器上恢复。

优点 ​

  • 兼容性好,适用于不同的存储引擎和配置
  • 备份文件是文本格式,便于查看和编辑
  • 可以选择性地恢复数据库或表

缺点 ​

  • 备份和恢复速度较慢,适用于中小型数据库
  • 会生成大量的 SQL 语句,恢复时需要重新执行

操作步骤 ​

bash
# 在源服务器上进行逻辑备份
mysqldump -u root -p --all-databases --single-transaction --routines --triggers --events > full_backup.sql

# 将备份文件传输到目标服务器
scp full_backup.sql target_server:/tmp/

# 在目标服务器上恢复备份
mysql -u root -p < /tmp/full_backup.sql

2. 物理备份恢复 ​

使用 xtrabackup 或 mysqlbackup 工具进行物理备份,然后在目标服务器上恢复。

优点 ​

  • 备份和恢复速度快,适用于大型数据库
  • 直接复制数据文件,无需重新执行 SQL 语句
  • 支持增量备份和部分备份

缺点 ​

  • 兼容性要求高,源服务器和目标服务器需要相同的 MySQL 版本和配置
  • 备份文件是二进制格式,不便于查看和编辑

操作步骤 ​

bash
# 在源服务器上进行物理备份
xtrabackup --backup --target-dir=/backup/full --user=root --password=password

# 将备份文件传输到目标服务器
rsync -av /backup/full target_server:/backup/

# 在目标服务器上准备备份
xtrabackup --prepare --target-dir=/backup/full

# 恢复备份到数据目录
xtrabackup --copy-back --target-dir=/backup/full --datadir=/var/lib/mysql

# 调整文件权限
chown -R mysql:mysql /var/lib/mysql

# 启动 MySQL 服务
systemctl start mysqld

3. 主从复制迁移 ​

先将目标服务器配置为源服务器的从库,待数据同步完成后,将应用切换到目标服务器。

优点 ​

  • 迁移过程中业务影响小,支持几乎无缝切换
  • 可以验证数据一致性
  • 支持回滚

缺点 ​

  • 配置相对复杂
  • 需要额外的磁盘空间存储二进制日志

操作步骤 ​

  1. 在源服务器上创建复制用户
sql
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  1. 获取源服务器的二进制日志位置
sql
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录 File 和 Position 的值。

  1. 在目标服务器上配置主从复制
sql
CHANGE MASTER TO
MASTER_HOST = 'source_server',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'repl_password',
MASTER_LOG_FILE = 'binlog.000001',
MASTER_LOG_POS = 107;

START SLAVE;
  1. 验证复制状态
sql
SHOW SLAVE STATUS\G;

确保 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,且 Seconds_Behind_Master 为 0。

  1. 切换应用到目标服务器

停止源服务器上的应用,确认数据同步完成后,将应用连接指向目标服务器。

4. 使用 MySQL Shell 克隆 ​

MySQL 8.0 引入了 clone 插件,支持快速克隆 MySQL 实例。

优点 ​

  • 操作简单,速度快
  • 支持在线克隆
  • 适用于 MySQL 8.0 及以上版本

缺点 ​

  • 仅支持 MySQL 8.0 及以上版本
  • 需要启用 clone 插件

操作步骤 ​

  1. 在源服务器上启用 clone 插件
sql
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
  1. 在目标服务器上启用 clone 插件并配置
sql
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SET GLOBAL clone_valid_donor_list = 'source_server:3306';
  1. 在目标服务器上执行克隆
sql
CLONE INSTANCE FROM 'root'@'source_server':3306 IDENTIFIED BY 'password';
  1. 重启目标服务器
bash
systemctl restart mysqld

迁移工具比较 ​

迁移方法工具适用场景优点缺点
逻辑备份恢复mysqldump, mysqlpump中小型数据库,跨平台迁移兼容性好,可选择性恢复速度慢,生成大量 SQL
物理备份恢复xtrabackup, mysqlbackup大型数据库,同平台迁移速度快,支持增量备份兼容性要求高,二进制格式
主从复制迁移MySQL 内置功能对业务影响要求高的场景几乎无缝切换,支持回滚配置复杂,需要额外磁盘空间
MySQL Shell 克隆MySQL ShellMySQL 8.0+,快速迁移操作简单,速度快仅支持 MySQL 8.0+

迁移前的准备工作 ​

1. 评估迁移复杂度 ​

  • 数据库大小和复杂度
  • 业务对 downtime 的要求
  • 源服务器和目标服务器的配置差异
  • 网络带宽和传输时间

2. 准备目标服务器 ​

  • 安装相同版本的 MySQL
  • 配置相同的参数和字符集
  • 调整硬件配置,确保性能不低于源服务器
  • 配置网络和防火墙,确保源服务器和目标服务器之间可以通信

3. 备份源数据 ​

在迁移前,对源数据进行完整备份,以便在迁移失败时可以恢复。

4. 测试迁移流程 ​

在测试环境中模拟迁移过程,验证迁移流程的有效性和可靠性。

5. 制定回滚计划 ​

制定详细的回滚计划,包括回滚步骤、回滚所需的备份文件和回滚时间估计。

迁移后的验证 ​

1. 数据完整性验证 ​

bash
# 比较源服务器和目标服务器的表行数
# 在源服务器上
mysql -u root -p -e "SELECT COUNT(*) FROM db_name.table_name;" > source_counts.txt

# 在目标服务器上
mysql -u root -p -e "SELECT COUNT(*) FROM db_name.table_name;" > target_counts.txt

# 比较结果
diff source_counts.txt target_counts.txt

2. 功能验证 ​

  • 验证应用程序是否能正常连接到目标服务器
  • 验证关键业务功能是否正常工作
  • 验证存储过程、触发器和事件是否正常执行

3. 性能验证 ​

  • 监控目标服务器的性能指标(CPU、内存、磁盘 I/O 等)
  • 比较迁移前后的查询响应时间
  • 进行压力测试,验证目标服务器的性能是否满足要求

4. 安全性验证 ​

  • 验证用户权限是否正确迁移
  • 验证密码策略是否保持一致
  • 验证 SSL/TLS 配置是否正确

版本差异 ​

MySQL 5.6 及之前版本 ​

  • 不支持 mysqlpump 工具,只能使用 mysqldump
  • 不支持 xtrabackup 的增量备份功能
  • 主从复制配置相对复杂
  • 不支持 clone 插件

MySQL 5.7 版本 ​

  • 引入了 mysqlpump 工具,支持并行备份
  • 增强了 xtrabackup 兼容性
  • 简化了主从复制配置
  • 引入了 GTID 复制,提高了复制的可靠性

MySQL 8.0 版本 ​

  • 引入了 clone 插件,支持快速克隆实例
  • 增强了 mysqlpump 功能
  • 进一步简化了主从复制配置
  • 支持 SET PERSIST 命令,无需重启即可永久修改变量

生产实践建议 ​

1. 选择合适的迁移方法 ​

根据数据库大小、业务要求和资源情况选择合适的迁移方法。

2. 选择合适的迁移时间 ​

选择业务低峰期进行迁移,减少对业务的影响。

3. 分阶段迁移 ​

对于大型数据库,可以考虑分阶段迁移,先迁移非核心业务,再迁移核心业务。

4. 监控迁移过程 ​

在迁移过程中,密切监控系统状态,及时发现和处理问题。

5. 记录迁移过程 ​

详细记录迁移过程和结果,包括迁移步骤、时间安排、遇到的问题和解决方案。

6. 制定后续维护计划 ​

迁移完成后,制定后续的维护计划,包括性能优化、备份策略调整和监控配置。

常见问题(FAQ) ​

Q1: 如何选择合适的迁移工具? ​

A1: 选择迁移工具需要考虑以下因素:

  • 数据库大小和复杂度
  • 业务对 downtime 的要求
  • 源服务器和目标服务器的配置差异
  • 迁移工具的兼容性和可靠性

Q2: 迁移过程中如何减少业务影响? ​

A2: 可以通过以下方法减少业务影响:

  • 选择主从复制迁移方法,支持几乎无缝切换
  • 选择业务低峰期进行迁移
  • 分阶段迁移,先迁移非核心业务
  • 优化迁移流程,提高迁移速度

Q3: 如何验证迁移后的数据一致性? ​

A3: 可以通过以下方法验证数据一致性:

  • 比较源服务器和目标服务器的表行数
  • 使用 checksum table 命令验证表的校验和
  • 使用第三方工具(如 pt-table-checksum)进行数据一致性检查
  • 验证关键业务功能是否正常工作

Q4: 迁移后性能下降怎么办? ​

A4: 迁移后性能下降可能的原因和解决方法:

  • 硬件配置差异:调整目标服务器的硬件配置
  • 参数配置差异:调整目标服务器的参数,与源服务器保持一致
  • 存储引擎差异:确保目标服务器使用相同的存储引擎
  • 索引问题:重建索引或优化查询

Q5: MySQL 8.0 的 clone 插件有什么限制? ​

A5: MySQL 8.0 的 clone 插件有以下限制:

  • 仅支持 MySQL 8.0.17 及以上版本
  • 源服务器和目标服务器需要相同的 MySQL 版本
  • 需要启用 clone 插件
  • 目标服务器的 MySQL 实例必须处于关闭状态或只读模式

Q6: 如何迁移大型数据库? ​

A6: 迁移大型数据库可以考虑以下方法:

  • 使用物理备份恢复方法,如 xtrabackup
  • 分库分表迁移,将大型数据库拆分为多个小型数据库进行迁移
  • 使用主从复制迁移方法,支持几乎无缝切换
  • 优化迁移流程,提高迁移速度

Q7: 迁移后如何处理二进制日志? ​

A7: 迁移后,可以根据需要处理二进制日志:

  • 如果不再需要源服务器的二进制日志,可以清理或关闭
  • 如果目标服务器需要继续使用二进制日志进行主从复制,需要确保二进制日志配置正确
  • 定期备份和清理目标服务器的二进制日志,避免磁盘空间耗尽