MySQL 8.0下 200GB大表备份,利用传输表空间解决停服发版表备份问题
MySQL 8.0下 200GB大表备份,利用传输表空间解决停服发版表备份问题
问题背景
在停服发版更新的时候,需要预先对一个业务表进行备份,该业务表是200GB大小的表,大概200亿行数据。
因为曾经出现过有开发写的发版语句里,update语句的where条件写错了,原本只需要更新几行数据,最终导致更新了半张表的数据。 MySQL版本是MySQL 8.0.X,为了预防这种情况,需要对某个重要的大表进行预先备份,以便可以及时回滚,及时恢复,及时回退,对于备份方法大概有下面几种
(1)更新之前,用mysqldump导出表数据,再导入相同数据库下的另一个中间表/备胎表 (2)更新之前,把表数据导入到相同数据库下另一个中间表/备胎表,【create table 备胎表 select * from 源表;】 (3)更新之前,利用表空间传输把表导出来,然后导入到相同数据库下的另一个中间表/备胎表 (4)更新之前,断开主从复制或者使用延迟复制,如果发版有问题,用断开复制的那个从库,然后重搭整个主从复制环境
这个场景还有一个前提是,停服更新的时间非常有限,比如1个小时之内要完成更新。
操作流程
前面两种都比较简单,通过导数据的方法来备份旧表,万一出现问题,可以使用导出来的数据进行快速恢复,第三种方法估计比较少人用,下面是具体操作方法
0、源表的表结构
use school;
CREATE TABLE aa (
id int(11) DEFAULT NULL,
sname varchar(100)
) ENGINE=InnoDB;
insert into aa select 1,"nihao";
select * from aa;
1、备胎表的表结构
CREATE TABLE bb (
id int(11) DEFAULT NULL,
sname varchar(100)
) ENGINE=InnoDB;
2、备胎表卸载表空间:
ALTER TABLE bb DISCARD TABLESPACE;
3、源表执行表空间导出:
use school;
FLUSH TABLES aa FOR EXPORT;
4、拷贝源表的ibd和cfg文件,然后重新赋予权限,确保导入表空间时候不会出现问题
cd /data/mysql/mysql3306/data/school
cp aa.ibd bb.ibd
cp aa.cfg bb.cfg
chown -R mysql:mysql /data/mysql/mysql3306/data/*
5、在相同数据库下,备胎表和源表都导入表空间
use school;
UNLOCK TABLES;
alter table bb import tablespace;
alter table aa import tablespace;
6、查询表数据
use school;
select * from bb;
select * from aa;
查询表数据正常,没有任何问题
mysql> select * from aa;
+------+-------+
| id | sname |
+------+-------+
| 1 | nihao |
+------+-------+
1 row inset (0.01 sec)
mysql> select * from bb;
+------+-------+
| id | sname |
+------+-------+
| 1 | nihao |
+------+-------+
1 row inset (0.00 sec)
查看表的数据文件,没什么问题
[root@2_mysql_68 school]# ll
total 228
-rw-r----- 1 mysql mysql 114688 Mar 4 16:51 aa.ibd
-rw-r----- 1 mysql mysql 781 Mar 4 16:52 bb.cfg
-rw-r----- 1 mysql mysql 114688 Mar 4 16:52 bb.ibd
7、开始做停服发版更新
对aa表做操作
...
8、如果发版出现问题,直接交换表名,最快速度恢复整个表的数据
ALTER TABLE aa RENAME TO aa_temp;
ALTER TABLE bb RENAME TO aa;
总结
整个操作最重要的是第4步,操作系统级别的拷贝就完成了整个表的备份,相比于数据倒来倒去在速度上要快不少。另外,第5步的备胎表也可以不用导入,只有当发现发版出现问题时候,再导入也可以。 实际上,如果需要更新的大表比较多的话,更加推荐使用第四种方法,在操作上也更加可控,时间上也能保证比较短时间内能够完成。但是如果生产环境没有条件做主从复制,只能单实例运行的话,那么只能使用传输表空间这种方法了。

本文版权归作者所有,未经作者同意不得转载。
MySQL 8.0下 200GB大表备份,利用传输表空间解决停服发版表备份问题的更多相关文章
- MySQL 8.0的十大新特性
今天,让我们看一下MySQL8.0提升数据库管理员工作效率的十大改进. 从一大堆特性你们找出十点并不太容易,以下是这十大特性: 1.临时表的改进 2.持续的全局变量 3.取消默认MyISAM系统表 4 ...
- MySQL 8.0.3性能大杀器 —— CATS 事务调度新算发
转载自:https://www.sohu.com/a/203933205_487483?sec=wd&spm=smpc.author.fd-d.2.1557386676880JSjtJwV 好 ...
- mysql 8.0下的SELECT list is not in GROUP BY clause and contains nonaggregated column
mysql的版本 mysql> select version();+-----------+| version() |+-----------+| 8.0.12 |+-----------+ 在 ...
- WebService下实现大数据量的传输
设置RemotingFormat = SerializationFormat.Binary;再序列化,通过WebService传输,客户端接收,再反序列化,确实效果大大的优于直接传送DataSet,不 ...
- MySQL入门(下)
1. 课程回顾(很清晰明了) mysql基础 1)mysql存储结构: 数据库 -> 表 -> 数据 sql语句 2)管理数据库: 增加: create database 数据库 de ...
- MySQL 8.0有什么新功能
https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...
- 【Mysql】- Mysql 8.0正式版新亮点
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- MySQL 8.0 正式版 8.0.11 发布:比 MySQL 5.7 快 2 倍
ySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8. ...
- mysql什么情况下会触发表锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...
- 牛逼!MySQL 8.0 中的索引可以隐藏了…
MySQL 8.0 虽然发布很久了,但可能大家都停留在 5.7.x,甚至更老,其实 MySQL 8.0 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...
随机推荐
- 综述😋Security and Privacy Challenges of ✌Large Language Models A Survey
- 小洋的Python入门笔记😀
小洋的python入门笔记 起因:发现自己前三年做的Python项目很多都是现做先学的,修改理解语法错误多依仗对C/C++的理解,对python缺乏一个系统的学习.趁此有空,补上! 特别鸣谢:B站找到 ...
- 开源即时通讯IM框架MobileIMSDK的H5端开发快速入门
► 相关链接: ① MobileIMSDK-H5端的详细介绍 ② MobileIMSDK-H5端的开发手册new(* 精编PDF版) 一.技术准备 您是否已对Web端即时通讯技术有所了解? 1)新手入 ...
- Solution -「NOI 2017」「洛谷 P3822」整数
\(\mathscr{Description}\) Link. 初始有整数 \(x=0\), 给出 \(n\) 次操作, 每次操作为 \(x\gets x+a\cdot2^b\) 或询问 \( ...
- 题解:AT_abc385_f [ABC385F] Visible Buildings
小学二年级就会的基本一次函数知识. 抽象一下题意: 求 \(n\) 个点 \((X_i, H_i)\) 中任意两个点组成的直线的截距的最大值(不小于 \(0\),\(X_i\) 递增). 先说结论:先 ...
- manim边做边学--动画联动
今天介绍Manim中的动画联动的技巧,在数学动画中,动画联动是常用的功能, 比如讲解平面几何中三角形与圆的位置关系变化,通过动画联动可以让圆沿着三角形的边滚动,或者让三角形的顶点在圆上移动,从而直观地 ...
- Java中的流操作
1. 字符流 1.1字符输入流 - Reader - FileReader 涉及到连接的,用完了就要关闭. **为什么read方法 返回的值是 int,而不是char?因为读到结尾的时候,cha ...
- jdk 5.0 新增的foreach循环(用于遍历集合、数组)
使用 foreach 循环遍历集合元素 Java 5.0 提供了 foreach 循环迭代访问 Collection和数组. 遍历操作不需获取Collection或数组的长度,无需使用索引访问元素 ...
- [BZOJ P2771] 天才ACM
[BZOJ P2771] 天才ACM 传送门 朴素算法 枚举终点 \(r\),对区间 \([l, r]\) 排序求校验值 \(sum\),比较 \(sum\) 和 \(t\) $ sum \le t ...
- oracle使用存储过程返回游标实现报表查询
最近在oracle中通过存储过程实现一个报表查询,查询涉及到数据计算这里使用了临时表和存储过程实现输出查询,java接受游标变量返回结果集 第一步.创建统计使用的临时表 CREATE GLOBAL T ...