体验一下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存储引擎,切源库与目标库版本及表结构一样
 
posted @ 2020-12-11 10:32  良少爷  阅读(3000)  评论(0编辑  收藏  举报