mysql 跨实例复制数据_社区投稿 | MySQL 跨实例 copy 大表解决方案
作者简介
任坤,现居珠海,先后担任专职 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 大表解决方案相关推荐
- mysql分区表truncate分区数据_详解MySQL分区表
前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...
- mysql mgr写入_社区投稿 | MySQL MGR一致性读写特性解读
原创作者: 田帅萌 MySQL 8.0.14版本增加了一个新特性:MGR读写一致性:有了此特性,"妈妈"再也不用担心读MGR非写节点数据会产生不一致啦. 有同学会疑问:" ...
- mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?
多线程插入(单表) 多线程插入(多表) 预处理SQL 多值插入SQL 事务(N条提交一次) 多线程插入(单表) 问:为何对同一个表的插入多线程会比单线程快?同一时间对一个表的写操作不应该是独占的吗? ...
- mysql如何防止插入重复数据_如何防止MySQL重复插入数据,这篇文章会告诉你
在MySQL进行数据插入操作时,总是会考虑是否会插入重复数据,之前的操作都是先根据主键或者唯一约束条件进行查询,有就进行更新没有就进行插入.代码反复效率低下. 新建表格 CREATETABLE`per ...
- php去除重复的数据保留一条,mysql查找删除重复数据并只保留一条实例详解
有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...
- mysql不复制数据_复制/复制数据库而不使用mysqldump
小智.. 58 如果您使用的是Linux,则可以使用此bash脚本:(它可能需要一些额外的代码清理,但它可以工作......而且它比mysqldump | mysql快得多) #!/bin/bash ...
- 发布json数据_技术分享 | MySQL 8.0.17 GA 发布!
昨日 MySQL 官网正式发布 8.0.17 / 5.7.27 / 5.6.45 三个(维护)版本,距离上一个 GA 版本(8.0.16)发布时隔仅 88 天! MySQL 各开发团队的博客网站,同一 ...
- mysql是如何管理数据_【MySQL】如何管理数据库
MySQL作为一款数据库管理系统(DataBase Management System,DBMS)软件,可以管理多个数据库.本文,主要讲述如何对一个数据库进行一系列的"增.删.改.查&quo ...
- mysql查询5周数据_第五周:MySQL数据库
首先,先了解一下数据库的基本概念要点: 数据库是数据存储的集合,表示数据结构化的信息 列存储表中的信息 行存储表的明细 主键是表中的唯一标识 主键不具备业务意义 在实际操作中,对表的主键不做强制性要求 ...
最新文章
- tensorflow checkpoint文件
- 线程本地数据ThreadLocal
- Intel汇编语言程序设计学习-第三章 汇编语言基础-下
- 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH
- java 遍历map获取下标_java 遍历Map并且获取其中的键值
- Solr单机安装Version5.5.2
- mysql varchar,bigint,char三种类型性能的比较
- 腾讯视频与中国电信签署战略合作协议 共同成立5G联合实验室
- 如何保存windows聚焦壁纸
- 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names
- python可以下载百度文库_百度文档,用Python一键免费下载
- 激光技术领域的又一重大突破:光学频率梳
- 双眼融合训练一个月_视觉融合功能改善恢复如何训练
- 习题4-1 Xiangqi UVA - 1589
- 【MATLAB】rem和mod函数的区别
- google 输入栏不显示历史搜索记录方法
- 多个正方体叠加所得立体图形的表面积
- 信息爆炸,用写作让它慢下来-2023.04.07
- 【题解】【AcWing】3426. 糖果分享游戏
- 免费的编程中文书籍索引
热门文章
- 996!007!同是敲了2万行代码,为什么他却晋升了?
- 2019年程序员薪酬报告:平均年薪超70万!40岁后,这类人不“保值”了
- stm32f407 6个串口dma_stm32之DMA
- 通过windows客户端访问
- Linux环境 Oracle 监听和服务 日常操作
- idea报错Module Project1 must not contain source root ...\Project1\src. The root already belongs to .
- SpringBoot精选项目
- 使用ant design vue 中table组件运行时not found: Error: Can't resolve 'reqwest' in 'D:\vue\antd-demo01\src\com
- 梳子刻字刻什么好_校园石阶上被人刻了1700多个字?!这次网友却说好
- vs 如何将源文件转换成可执行文件_如何将手机便签转换成word文本文档