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 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...
随机推荐
- Qt音视频开发03-ffmpeg倍速播放(半倍速/2倍速/4倍速/8倍速)
一.前言 用ffmpeg做倍速播放,是好多年都一直没有实现的功能,有个做法是根据倍速参数,不断切换播放位置,实现效果不是很好,ffplay中的倍速就做得很好,而且声音无论倍速多少还非常柔和,有特别的降 ...
- FFmpeg命令行选项
如下内容取自官网文档"Documentation-ffmpeg"和"Documentation-ffmpeg-all" 1 帮助信息 如下选项适用于 ff 系列 ...
- WxPython跨平台开发框架之列表数据的通用打印处理
在WxPython跨平台开发框架中,我们大多数情况下,数据记录通过wx.Grid的数据表格进行展示,其中表格的数据记录的显示和相关处理,通过在基类窗体 BaseListFrame 进行统一的处理,因此 ...
- Spring基础 02 | JdbcTemplate
JdbcTemplate Spring对Jdbc的Api简单封装 开发步骤 1.导入Spring-jdbc.spring-tx坐标 2.创建数据库表和实例 3.创建jdbcTemplate对象 4.执 ...
- 重温Go语法笔记 | 函数
函数 返回值带有变量名 return时可以不写返回值,在返回值位置声明即可 func namedRetvalue() (a, b int) { a = 1 b = 2 return } 匿名函数 定义 ...
- 前端学习openLayers配合vue3(面的绘制,至少三个点)
我们学习了点和线的绘制,当然我们也可以绘制一个面 关键代码,需要注意的一点就是面的绘制需要三维数组,线的绘制是个二维数组 const polygonLayer = new VectorLayer({ ...
- 彻底讲透Spring Bean生命周期,源码深度剖析!
前言本篇文章主要是要介绍如何在Spring IoC 容器中 如何管理Spring Bean生命周期. 在应用开发中,常常需要执行一些特定的初始化工作,这些工作都是相对比较固定的,比如建立数据库连接,打 ...
- springboot-总结列表
一.Spring Boot 具有以下特点: 1. 独立运行的 Spring 项目 Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令" jav ...
- w3cschool-Spark 编程指南
https://www.w3cschool.cn/spark/ Spark 编程指南 spark特性: 提供了java scala python 和R的api支持. 在生产环境上扩展超过8000个节点 ...
- 告别虚拟机!WSL2安装配置教程!!!
作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 由于Linux的系统的稳定以及在环境管理方面的优越性,同时Linux对于ROS系统的独占,很多时候我们都乐意在L ...