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 时,该表会不可写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax跨域只能是get,jsonp跨域请求只能get变相解决方案

1.java设置返回表头:response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Methods","POST");response.setHeader("Access-Control-Max-Age","1000");2.…

云服务器虚拟主机区别,云服务器和虚拟主机的区别

云空间服务是云计算服务的重要组成部分,是面向各类互联网用户提供综合业务能力的服务平台。平台整合了传统意义上的互联网应用三大核心要素:计算、存储、网络,面向用户提供公用化的互联网基础设施服务。采用操作系统虚拟化技术,虚拟化效率高,虚拟化License费用低,能共享操作系统…

php连接mysql并操作系统_PHP 连接并操作MySQL的一个实例

/*** MyClass 抽象类,用于执行查询语句**/class MyClass{const HOST 192.168.73.110:3306;const USER root;const PASSWORD root;const DB kmdbcenter;static $Instance false;private $QueryResult False;private final function __construct(){if(!mysql_connect(MyCla…

服务器上次文件命令,服务器上次文件命令

服务器上次文件命令 内容精选换一换当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的。CIFS类型的文件系统不支持使用Linux操作系统的云服务器进行挂载。同一SFS容量型文件系统不能同时支持NFS协议和CIFS…

win7装mysql一直未响应6_win7重装mysql最后一步无响应解决方法

重新安装MySQL出示未响应,一般显示在安装MySQL程序最后一步的2,3项就不动了。这种情况一般是你以前安装过MySQL数据库服务项被占用了。解决方法:一种方法:你可以安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个…

spd不能修改服务器内存条的原因,修改内存SPD 解决蓝屏问题

修改内存SPD 解决蓝屏问题互联网 发布时间:2009-04-21 01:18:13 作者:佚名 我要评论问:一台电脑的内存是HY 256MB DDRII 533,最近又购买了一条HY 256MB DDRII 533内存,与原有内存组成双通道。使用时偶尔会出现蓝…

服务器批量修改代码,利用Redis实现多服务器批量操作

工作中遇到一个项目需要在多个平台编译打包,每次都需要登录到不同的服务器同步代码,编译,打包,上传,非常麻烦,于是想为何不能一次操作,多台服务器自动执行呢。网上找了下,有很多解决…

django与mysql实现增删_django与mysql实现简单的增删查改

模型定义from django.db import modelsclass Grades(models.Model):g_name models.CharField(max_length20)create_date models.DateTimeField()girl_num models.IntegerField()boy_num models.IntegerField()isDelete models.BooleanField(defaultFalse)def __str__(self…

服务器本地文件,云服务器 本地文件

云服务器 本地文件 内容精选换一换在云服务器上搭建网站后,部分客户通过本地网络访问网站时出现偶发性无法访问的情况。确认客户使用的本地网络。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器),可能会导致该问题。若客…

mysql oracle 备份数据库备份_完整备份Oracle数据库

修改备份文件的有效时间(必须用spfile启动数据库)SQLgt; alter system set control_file_record_keep_time30 scopeboth;修改备份文件的有效时间(必须用spfile启动数据库)SQL> alter system set control_file_record_keep_time30 scopeboth;System altered.先启动归档SQL>…

修改域服务器IP,域控制器迁移以及修改服务器ip

windows2003域控制器如果服务器太旧就需要迁移至新的服务器上,经本人实验,无误。windows server 2003 域控制器转移迁移准备工作:1. 在Windows Server 2003上运行dcpromo命令将其升级为域控制器,并在升级时选择使其成为现有Windows 2003域的额外的域控制器。2. 在Wi…

mysql注入fuzz字典_sql注入fuzz bypass waf

本帖最后由 xmidf 于 2018-7-11 10:16 编辑作者:whynot 转自:先知0x0 前言这里是简单对sql注入绕过waf的一个小总结,非安全研究员,这里不讲原理,关于原理搜集了一些其他大佬的文章(文章在最下面请自取)&#xff0…

python如何开发网站_如何用Python写一个小网站?

一、准备 python基础相关准备:pygame的基础知识,参考目光博客的“用Python和Pygame写游戏-从入门到精通”安python 3.8.0 在python官网下载,不多说。安装pygame,命令:pip install pygame如安装较慢,可以参考…

python项目选择背景_Python - - 项目实战 - - 游戏背景

目标背景交替滚动的思路确定显示游戏背景01,背景交替滚动的思路确定运行 备课代码,观察 背景图像的显示效果:游戏启动后,背景图像 会 连续不断地 向下方 移动在 视觉上 产生英雄的飞机不断向上方飞行的 错觉 - - 在很多跑酷游戏中…

【AI】人工智能复兴的推进器之自然语言处理

目录 一、什么是自然语言处理 二、词袋模型 三、向量 四、代码示例 五、大模型和自然语言处理 接上篇:【AI】人工智能复兴的推进器之机器学习-CSDN博客 一、什么是自然语言处理 自然语言处理(Natural Language Processing,NLP&#xf…

css阻止换行_CSS中,如何处理短内容和长内容?

本文已经过原作者 shadeed 授权翻译。当我们使用 CSS 构建布局时,考虑长短文本内容很重要,如果能清楚地知道当文本长度变化时需要怎么处理,可以避免很多不必要的问题。在许多情况下,添加或删除一个单词会改变 UI 的外观&#xff0…

duilib设置透明窗口_界面开发心得与Duilib | 学步园

一、设置窗体透明度和指定透明色(如指定了黑色,即所有黑色的部分将会变得透明)DWORD dwExStyleGetWindowLong(m_hWnd,GWL_EXSTYLE);if((dwExStyle&WS_EX_LAYERED)!WS_EX_LAYERED)SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle|WS_EX_LAYERED);HMODULE hInst Loa…

influxdb无法实现关联表_InfluxDb专业术语

InfluxDb专业术语重复是最好的学习方式,我们再重复一些Influx的概念吧,虽然很多已经讲过,甚至上一课已经讲了。我发现我自己还是有点啰嗦,不过这可能是一种好的学习方法哦。聚合函数aggregationaggregation是一个InfluxQL的函数&a…

mysql排序区分大小写吗_MySQL操作数据时区分大小写

一般情况下使用SQL语句执行update login_ticket set status1 where ticket‘ABC‘会将ticket’abc‘的数据也改掉,那么需要在列名ticket的后面加上collate utf8_binupdate login_ticket set status1 where ticket COLLATE utf8_bin‘ABC‘这里的collate后面的是指该…

java的四种访问权限_Java四种访问权限

一、访问权限简介访问权限控制: 指的是本类及本类内部的成员(成员变量、成员方法、内部类)对其他类的可见性,即这些内容是否允许其他类访问。Java 中一共有四种访问权限控制,其权限控制的大小情况是这样的:public > protected …