mysql迁移是数据库运维场景中非常常见的操作,无论是服务器升级、机房搬迁还是架构调整,都可能需要进行mysql数据库的迁移。而数据丢失是迁移过程中最容易出现的风险之一,轻则导致部分业务数据缺失,重则造成业务中断,带来不可估量的损失。因此掌握科学的迁移方法,提前规避数据丢失风险至关重要。

迁移前的准备工作
1. 全量数据备份
在进行任何迁移操作之前,首先要对源库进行全量备份,这是避免数据丢失的最后一道防线。可以使用mysqldump工具进行逻辑备份,也可以直接拷贝物理文件进行物理备份,具体选择哪种方式可以根据数据量和业务停机窗口决定。
使用mysqldump进行全量备份的示例代码如下:
# 备份整个数据库实例,包含存储过程、触发器等 mysqldump -u root -p --all-databases --routines --triggers --events > full_backup.sql # 备份指定数据库 mysqldump -u root -p --databases db1 db2 > db_backup.sql
2. 确认迁移方案与停机窗口
根据业务对停机时间的容忍度,选择合适的迁移方案。如果业务可以接受短暂停机,可以选择停机全量迁移;如果业务需要持续运行,则需要采用主从同步加增量迁移的方案。同时要提前评估数据量大小,预估迁移所需时间,避免迁移过程中超出停机窗口导致业务异常。
3. 检查目标库环境
提前搭建好目标mysql实例,确认版本兼容性,避免源库和目标库版本差异过大导致数据不兼容。同时检查目标库的磁盘空间、字符集、参数配置等,确保和源库保持一致,减少迁移后出现问题的概率。
迁移过程中的操作规范
1. 采用主从同步实现增量迁移
对于不能长时间停机的业务,可以先在源库和目标库之间搭建主从同步,让目标库实时同步源库的增量数据,待同步延迟降到可接受范围后再进行切换,这样可以最大程度减少数据丢失的风险。
搭建主从同步的核心步骤如下:
- 在源库开启binlog,配置server-id
- 创建用于同步的账号并授权
- 在目标库配置主库信息,启动同步线程
源库配置my.cnf示例:
[mysqld] server-id=1 log-bin=mysql-bin binlog_format=row expire_logs_days=7
目标库执行同步命令示例:
-- 配置主库连接信息 CHANGE MASTER TO MASTER_HOST='源库IP', MASTER_USER='sync_user', MASTER_PASSWORD='sync_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; -- 启动同步 START SLAVE; -- 查看同步状态 SHOW SLAVE STATUSG
2. 迁移过程中避免写入冲突
如果是停机迁移,在备份完成后要立即停止源库的业务写入,避免备份完成到迁移切换期间产生新的数据没有被同步。如果是主从同步迁移,在切换前要先停止源库的写入,等待目标库同步完成所有增量数据后再进行切换,防止数据不一致。
3. 分批迁移降低风险
如果数据量非常大,可以采用分批迁移的方式,比如按表、按时间范围拆分迁移任务,每完成一批就做一次数据校验,发现问题可以及时回滚,避免全量迁移失败导致所有数据都需要重新处理。
迁移后的校验流程
1. 数据量校验
迁移完成后,首先要对比源库和目标库的表数量、每张表的数据行数,确保数据量一致。可以通过查询information_schema库的统计数据快速完成初步校验。
查询表数据行数的示例代码:
-- 查询指定数据库下所有表的行数 SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA='db_name' ORDER BY TABLE_NAME;
2. 数据内容抽样校验
数据量一致不代表数据内容完全相同,需要对核心表进行抽样校验,对比关键字段的数据是否一致。可以使用pt-table-checksum工具进行高效的数据一致性校验,该工具可以自动对比源库和目标库的数据差异。
pt-table-checksum使用示例:
# 校验指定数据库的数据一致性 pt-table-checksum --host=源库IP --user=root --password=密码 --databases=db_name --no-check-binlog-format
3. 业务验证
数据校验通过后,先开启小部分业务的读写请求到目标库,观察业务运行是否正常,有没有报错或者数据异常的情况,确认没有问题后再全量切换业务流量。同时保留源库备份一段时间,万一出现问题可以快速回滚恢复数据。
常见风险点与规避方法
| 风险点 | 规避方法 |
|---|---|
| 迁移过程中源库产生新写入 | 停机迁移时先停业务写入再备份;在线迁移时先停写再切换 |
| 字符集不一致导致数据乱码 | 迁移前确认源库和目标库字符集完全一致 |
| 大表迁移超时中断 | 拆分大表迁移任务,分批执行,设置合理的连接超时参数 |
| 迁移后索引丢失 | 迁移完成后对比源库和目标库的索引结构,及时补全缺失索引 |
只要严格按照上述流程操作,做好迁移前的备份、迁移中的规范操作、迁移后的多维度校验,就可以最大程度避免mysql迁移过程中出现数据丢失的问题,保障数据库迁移的安全性和稳定性。