体验一下5分钟快速迁移mysql近亿数据量大表的速度!!!
案例场景:
需求将 源库 A服务器mysql实例下日志表t_service_log 迁移到 目标库 B 服务器 mysql实例下
t_server_log
数据量:
详细操作步骤:
1、在服务器B 目标库下 创建表结构 并执行 ALTER TABLE t_service_log DISCARD TABLESPACE;
此时表 t_service_log 只剩下 frm 文件
2. 源库,开启 2 个会话
a) session1:执行 FLUSH TABLES t_service_log FOR EXPORT ,该命令会对 t_service_log 加锁,将 t_service_log 的脏数据从 buffer
pool 同步到表文件,同时新生成 1 个文件 t_service_log .cfg ,该文件存储了表的数据字典信息
b) session2:保持 session1 打开状态,此时将 t_service_log.cfg 和 t_service_log.ibd 远程传输到目标库的数据目录,
如果目标库是主从结构,需要分别传输到主从两个实例,传输完毕后修改属主为 mysql:mysql
内网传输可采用 nc 隧道模式 ,30G 传输完成大约在3分钟左右完成
c) 源库,session1 执行 unlock tables ,解锁表 t_service_log ,此时 t_service_log 恢复正常读写
d) 目标库,执行 ALTER TABLE t_service_log IMPORT TABLESPACE ,如果是主从结构,只需要在主库执行即可
e) 此时目标库 t_service_log 已可用,迁移完成
总结:
此次利用 mysql 可传输复制表空间方案,复制大表 t_service_log 到目录库 整个过程耗时在 5分钟左右 ,主要耗时在 传输 ibd 文件
耗时3分钟左右与 目标库 "ALTER TABLE t_service_log IMPORT TABLESPACE " 耗时 2分钟左右;对比dump+source sql 方案在时间成本上有大利
缺点:在源库上需要锁表 传输ibd文件的时间;所以对于业务低峰期或日志表可考虑使用,值适用innodb存储引擎,切源库与目标库版本及表结构一样