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 新增了许多重磅新特性,比如栈长今天要介绍的 "隐藏索引" 或者 " ...
随机推荐
- Specifications动态查询
[前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ...
- X64\X86\X86-64的区别
x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种指令集,ntel官方文档里面称为&qu ...
- shell中 ${}, ##, %%, :-,:+, ? 的使用
假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${}分别替换得到不同的值:${file#*/} 删掉第一个/及其左边的字符串:dir1/dir2/d ...
- Qt音视频开发10-ffmpeg内核硬解码
一.前言 为了极大的降低CPU的占用,实现硬解码(也叫硬件加速)非常有必要,一个视频文件或者一路视频流还好,如果增加到64路视频流呢,如果是4K.8K这种高分辨率的视频呢,必须安装上硬解码才是上上策. ...
- [转]来,让我们一起来盘盘 Nodejs 环境变量(process.env)
首先 process.env 是什么? node环境变量: process 是node的全局变量,类似浏览器的window: env 是process的一个属性. 官方解释:process 对象是一个 ...
- TestProject 使用汇总
1. 截图 from addons.screenshot_utils import ScreenshotUtils step_output = driver.addons().execute( Scr ...
- c# 多线程 lock
模拟10个线程,每个线程模拟100次取钱: 其实就是相当于1000个人来同时取钱.当然实际情况是取钱的人分布在不同的地区的取款机取钱.同一个取款机只能一个人操作. 关键是要保证取钱的余额要准确,不能在 ...
- w3cschool-Python3 教程
https://www.w3cschool.cn/python3/ Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单. 2.易于阅读: ...
- PDCA使用指南详解(史上最强)
PDCA循环,一个老话题了,大家都知道要这么做,但在平时的生活和工作当中,你是否真的都这样做呢? 当你发现你面对的困难重重,寸步难行时,是否反思过是因为自己一开始的方法就不正确? 本文包涵了PDCA循 ...
- 利用坦克PWA3快速为应用配置域名:以Gogs为例
全文概述 本文介绍了如何利用坦克PWA3平台快速为Gogs应用配置域名的过程.随着互联网技术的发展,自托管Git服务变得越来越受欢迎,其中Gogs凭借其轻量级和易于安装的特点受到众多开发者的青睐.为提 ...