MySQL DROP DB或TABLE场景下借助SQL Thread快速应用binlog恢复方案
【问题】
假设有这种场景,误操作DROP DB或TABLE,常规的恢复操作是还原全备份,并用mysqlbinlog追加到drop操作前的位置。
如果需要恢复的binlog的日志量比较大而我们只希望恢复某个DB或某张表,常规操作会花费较长的时间。
在网上看到了借助SQL Thread来应用binlog的方法,做测试验证是可行的。
【原理】
1、Binlog是MySQL Server产⽣的,记录数据库的逻辑变化
2、Relay-log 是Master/Slave结构中Slave的IO_thread从主库获取变更日志,记录到slave本地
3、binlog和Relay-log实际记录的内容是完全一致的
【实现思路】
1、将源服务器需要追加的binlog文件拷贝到目标服务器数据目录下,修改为relay-log的命名规范
2、CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(db1.t1);设置过滤只复制某个DB或某张表
3、然后使用START SLAVE SQL_THREAD UNTIL SQL_BEFORE_GTIDS语法还原到指定的GTID位置
4、开启并行复制加速binlog应用的速度,最新的MySQL5.7.23可以使用基于WRITESET的并行复制
【测试脚本】
(以MySQL5.7下误DROP TABLE test.test1为例,5.6也可以用同样的思路,但位置信息和筛选信息的脚本有差异,下面脚本供参考)
1、源实例做全备
innobackupex --socket=/data/mysql/mysql-replica01/mysql.sock --user=root --password= /data/backup
2、清空目标实例数据目录并还原全备
innobackupex --apply-log /data/backup/2018-10-24_13-22-09
innobackupex --defaults-file=/etc/my.cnf.d/replica02.cnf --copy-back /data/backup/2018-10-24_13-22-09
3、修改数据目录文件权限
chown -R mysql:mysql *
4、启动目标实例
systemctl start mysqld@replica02.service
5、连接目标实例,随便指定一个master_host信息,这个命令只是为了标识目标实例是slave角色
CHANGE MASTER TO MASTER_HOST='192.192.192.192';
6、systemctl stop mysqld@replica02.service
7、清理数据目录下生成的relay-log相关文件
rm -rf *relay*
8、将源实例的binlog备份拷贝到目录实例数据目录下,并修改命名规则,并修改权限
cp /data/mysql/mysql-replica01/TEST-bin.000414 /data/mysql/mysql-replica02
cp /data/mysql/mysql-replica01/TEST-bin.000415 /data/mysql/mysql-replica02
mv TEST-bin.000414 TEST-relay-bin.000414
mv TEST-bin.000415 TEST-relay-bin.000415
echo './TEST-relay-bin.000414' > TEST-relay-bin.index
echo './TEST-relay-bin.000415' >> TEST-relay-bin.index
chown -R mysql:mysql *
9、systemctl start mysqld@replica02.service
10、依据还原目录下的xtrabackup_info文件指定Relay_Log_File位置,但注意需要将binlog文件名称替换为relay log的命名规则
CHANGE MASTER TO Relay_Log_File='TEST-relay-bin.000414',relay_log_pos=1126;
11、指定筛选条件,只还原某个DB或某个表
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(test.test1);
12、还原到drop table之前的位置
START SLAVE SQL_THREAD UNTIL SQL_BEFORE_GTIDS='86c67cfe-8b18-11e8-9e4c-246e965710f8:478351666';
13、将目标表导入到需要恢复的源实例

MySQL DROP DB或TABLE场景下借助SQL Thread快速应用binlog恢复方案的更多相关文章
- 在Docker应用场景下 如何使用新技术快速实现DevOps
在Docker应用场景下 如何使用新技术快速实现DevOps @Container容器技术大会是由国内容器技术社区DockOne组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强调实践和交 ...
- 【转】MySQL乐观锁在分布式场景下的实践
背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...
- MySQL乐观锁在分布式场景下的实践
背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...
- Ubuntu下借助URLOS实现快速安装DzzOffice企业办公套件
如今,越来越多的个人.团队甚至企业都在使用GSuite或者Office365等网络办公套件,为什么人们越来越喜爱使用网络办公套件?一方面是考虑数字资产的安全性以及管理效率,另一方面则是日益增大的协同办 ...
- MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"
本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据” ...
- MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】
删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCAD ...
- 秒杀场景下MySQL的低效(转)
秒杀场景下MySQL的低效 2016-01-14 17:12 178人阅读 评论(0) 收藏 举报 最近业务试水电商,接了一个秒杀的活.之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己 ...
- 不同场景下 MySQL 的迁移方案
一 目录 一 目录 二 为什么要迁移 三 MySQL 迁移方案概览 四 MySQL 迁移实战 4.1 场景一 一主一从结构迁移从库 4.2 场景二 一主一从结构迁移指定库 4.3 场景三 一主一从结构 ...
- 【转载】秒杀场景下MySQL的低效原因和改进以及Redis的处理
分享的PPT在如下网址: http://www.doc88.com/p-4199037770087.html 秒杀场景下mysql的低效原因和改进 另外有一个篇文章是针对以上内容的总结: http:/ ...
随机推荐
- AdaBoost原理详解
写一点自己理解的AdaBoost,然后再贴上面试过程中被问到的相关问题.按照以下目录展开. 当然,也可以去我的博客上看 Boosting提升算法 AdaBoost 原理理解 实例 算法流程 公式推导 ...
- python命名空间与闭包函数详解
python命名空间与闭包函数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的知识点如下: 1>.三元运算 2>.命名空间 3>.globa ...
- ★itext-为pdf文件添加页眉页脚 | 3步完成 |
由于上一篇自定义生成pdf的功能需求又增加了,需要加上页码.所以本博客诞生了~ 1. 通过继承PdfPageEventHelper类,实现需要实现的方法 import com.lowagie.text ...
- 设置 Linux 服务器中 MySQL 允许远程访问
开启 MySQL 远程访问权限: 在linux系统上登陆mysql服务. -- root 是用户名 [root@localhost ~]# mysql -u root -p Enter passwor ...
- waven 常用构建命令
常用命令 mvn compile : 编译maven项目 mvn test : 运行项目测试用例 mvn package : 将项目打成jar包 mvn clean : 删除target目录下生成的文 ...
- bzoj 1432 数学(找规律)
我们可以发现所有的情况(除n=1时),都可以找到两个交叉的直线,就是第一层的那 两个线段所在的直线如图中左 那么我们以这个为准,两边对称着加直线,会得到右图,每一层是折线,且每 加一对儿就多两条线段, ...
- python 的print和特殊方法 __str__和__repr__
先提出一个疑问,为什么print函数可以直接打印参数呢?即使是数字?例如print 1,就会打印1.我们知道1的类型是整型(题外话,在python中1是常量,也是类int的对象,而java中1只是常量 ...
- mysql5.7主从复制--在线变更复制类型【转】
这里说一下关于如何在线变更复制类型(日志复制到全局事物复制),参考课程:mysql5.7复制实战 先决条件 (1)集群中所有的服务器版本均高于5.7.6(2)集群中所有的服务器gtid_mod ...
- [转]mitmproxy套件使用攻略及定制化开发
mitmproxy是一款支持HTTP(S)的中间人代理工具.不同于Fiddler2,burpsuite等类似功能工具,mitmproxy可在终端下运行.mitmproxy使用Python开发,是辅助w ...
- C# 每月第一天和最后一天
//每月第一天 - DateTime.Now.Day); //每月最后一天 var endTime=DateTime.Now.AddDays(1 - DateTime.Now.Day).AddMont ...