作者简介

任坤,现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

一、背景

某天晚上 20:00 左右开发人员找到我,要求把 pre-prod 环境上的某张表导入到 prod ,第二天早上 07:00 上线要用。该表有数亿条数据,压缩后 ibd 文件大约 25G 左右,表结构比较简单:

CREATE TABLE `t` (

`UNIQUE_KEY` varchar(32) NOT NULL,

`DESC` varchar(64) DEFAULT NULL ,

`NUM_ID` int(10) DEFAULT '0' ,

PRIMARY KEY (`UNIQUE_KEY`),

KEY `index_NumID` (`NUM_ID`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED

MySQL 版本:pre-prod 和 prod 都采用 5.7.25 ,单向主从结构。

二、解决方案

最简单的方法是采用 mysqldump + source ,但是该表数量比较多,之前测试的时候至少耗时 4h+ ,这次任务时间窗口比较短,如果中间执行失败再重试,可能会影响业务正式上线。采用 select into outfile + load infile 会快一点,但是该方案有个致命问题:该命令在主库会把所有数据当成单个事务执行,只有把数据全部成功插入后,才会将 binlog 复制到从库,这样会造成从库严重延迟,而且生成的单个 binlog 大小严重超标,在磁盘空间不足时可能会把磁盘占满。经过比较,最终采用了可传输表空间方案,MySQL 5.6 借鉴 Oracle 引入该技术,允许在 2 个不同实例间快速的 copy innodb 大表。该方案规避了昂贵的 sql 解析和 B+tree 叶节点分裂,目标库可直接重用其他实例已有的 ibd 文件,只需同步一下数据字典,并对 ibd 文件页进行一下校验,即可完成数据同步操作。

具体操作步骤如下:1. 目标库,创建表结构,然后执行 ALTER TABLE t DISCARD TABLESPACE ,此时表t只剩下 frm 文件

2. 源库,开启 2 个会话

session1:执行 FLUSH TABLES t FOR EXPORT ,该命令会对 t 加锁,将t的脏数据从 buffer pool 同步到表文件,同时新生成 1 个文件 t.cfg ,该文件存储了表的数据字典信息

session2:保持 session1 打开状态,此时将 t.cfg 和 t.ibd 远程传输到目标库的数据目录,如果目标库是主从结构,需要分别传输到主从两个实例,传输完毕后修改属主为 mysql:mysql

3. 源库,session1 执行 unlock tables ,解锁表 t ,此时 t 恢复正常读写

4. 目标库,执行 ALTER TABLE t IMPORT TABLESPACE ,如果是主从结构,只需要在主库执行即可

三、实测

针对该表,执行 ALTER TABLE ... IMPORT TABLESPACE 命令只需要 6 分钟完成,且 IO 消耗和主从延迟都被控制到合理范围。原本需要数个小时的操作,只需 10 多分钟完成(算上数据传输耗时)。如果线上有空表需要一次性加载大量数据,可以考虑先将数据导入到测试环境,然后通过可传输表空间技术同步到线上,可节约大量执行时间和服务器资源。

四、总结

可传输表空间,有如下使用限制:源库和目标库版本一致

只适用于 innodb 引擎表

源库执行 flush tables t for export 时,该表会不可写

mysql 跨实例复制数据_社区投稿 | MySQL 跨实例 copy 大表解决方案相关推荐

  1. mysql分区表truncate分区数据_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

  2. mysql mgr写入_社区投稿 | MySQL MGR一致性读写特性解读

    原创作者: 田帅萌 MySQL 8.0.14版本增加了一个新特性:MGR读写一致性:有了此特性,"妈妈"再也不用担心读MGR非写节点数据会产生不一致啦. 有同学会疑问:" ...

  3. mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?

    多线程插入(单表) 多线程插入(多表) 预处理SQL 多值插入SQL 事务(N条提交一次) 多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗? ...

  4. mysql如何防止插入重复数据_如何防止MySQL重复插入数据,这篇文章会告诉你

    在MySQL进行数据插入操作时,总是会考虑是否会插入重复数据,之前的操作都是先根据主键或者唯一约束条件进行查询,有就进行更新没有就进行插入.代码反复效率低下. 新建表格 CREATETABLE`per ...

  5. php去除重复的数据保留一条,mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  6. mysql不复制数据_复制/复制数据库而不使用mysqldump

    小智.. 58 如果您使用的是Linux,则可以使用此bash脚本:(它可能需要一些额外的代码清理,但它可以工作......而且它比mysqldump | mysql快得多) #!/bin/bash ...

  7. 发布json数据_技术分享 | MySQL 8.0.17 GA 发布!

    昨日 MySQL 官网正式发布 8.0.17 / 5.7.27 / 5.6.45 三个(维护)版本,距离上一个 GA 版本(8.0.16)发布时隔仅 88 天! MySQL 各开发团队的博客网站,同一 ...

  8. mysql是如何管理数据_【MySQL】如何管理数据库

    MySQL作为一款数据库管理系统(DataBase Management System,DBMS)软件,可以管理多个数据库.本文,主要讲述如何对一个数据库进行一系列的"增.删.改.查&quo ...

  9. mysql查询5周数据_第五周:MySQL数据库

    首先,先了解一下数据库的基本概念要点: 数据库是数据存储的集合,表示数据结构化的信息 列存储表中的信息 行存储表的明细 主键是表中的唯一标识 主键不具备业务意义 在实际操作中,对表的主键不做强制性要求 ...

最新文章

  1. tensorflow checkpoint文件
  2. 线程本地数据ThreadLocal
  3. Intel汇编语言程序设计学习-第三章 汇编语言基础-下
  4. 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH
  5. java 遍历map获取下标_java 遍历Map并且获取其中的键值
  6. Solr单机安装Version5.5.2
  7. mysql varchar,bigint,char三种类型性能的比较
  8. 腾讯视频与中国电信签署战略合作协议 共同成立5G联合实验室
  9. 如何保存windows聚焦壁纸
  10. 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names
  11. python可以下载百度文库_百度文档,用Python一键免费下载
  12. 激光技术领域的又一重大突破:光学频率梳
  13. 双眼融合训练一个月_视觉融合功能改善恢复如何训练
  14. 习题4-1 Xiangqi UVA - 1589
  15. 【MATLAB】rem和mod函数的区别
  16. google 输入栏不显示历史搜索记录方法
  17. 多个正方体叠加所得立体图形的表面积
  18. 信息爆炸,用写作让它慢下来-2023.04.07
  19. 【题解】【AcWing】3426. 糖果分享游戏
  20. 免费的编程中文书籍索引

热门文章

  1. 996!007!同是敲了2万行代码,为什么他却晋升了?
  2. 2019年程序员薪酬报告:平均年薪超70万!40岁后,这类人不“保值”了
  3. stm32f407 6个串口dma_stm32之DMA
  4. 通过windows客户端访问
  5. Linux环境 Oracle 监听和服务 日常操作
  6. idea报错Module Project1 must not contain source root ...\Project1\src. The root already belongs to .
  7. SpringBoot精选项目
  8. 使用ant design vue 中table组件运行时not found: Error: Can't resolve 'reqwest' in 'D:\vue\antd-demo01\src\com
  9. 梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好
  10. vs 如何将源文件转换成可执行文件_如何将手机便签转换成word文本文档