【问题】

假设有这种场景,误操作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恢复方案的更多相关文章

  1. 在Docker应用场景下 如何使用新技术快速实现DevOps

    在Docker应用场景下 如何使用新技术快速实现DevOps @Container容器技术大会是由国内容器技术社区DockOne组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强调实践和交 ...

  2. 【转】MySQL乐观锁在分布式场景下的实践

    背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...

  3. MySQL乐观锁在分布式场景下的实践

    背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...

  4. Ubuntu下借助URLOS实现快速安装DzzOffice企业办公套件

    如今,越来越多的个人.团队甚至企业都在使用GSuite或者Office365等网络办公套件,为什么人们越来越喜爱使用网络办公套件?一方面是考虑数字资产的安全性以及管理效率,另一方面则是日益增大的协同办 ...

  5. MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"

    本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据” ...

  6. MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】

    删表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCAD ...

  7. 秒杀场景下MySQL的低效(转)

    秒杀场景下MySQL的低效 2016-01-14 17:12 178人阅读 评论(0) 收藏 举报 最近业务试水电商,接了一个秒杀的活.之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己 ...

  8. 不同场景下 MySQL 的迁移方案

    一 目录 一 目录 二 为什么要迁移 三 MySQL 迁移方案概览 四 MySQL 迁移实战 4.1 场景一 一主一从结构迁移从库 4.2 场景二 一主一从结构迁移指定库 4.3 场景三 一主一从结构 ...

  9. 【转载】秒杀场景下MySQL的低效原因和改进以及Redis的处理

    分享的PPT在如下网址: http://www.doc88.com/p-4199037770087.html 秒杀场景下mysql的低效原因和改进 另外有一个篇文章是针对以上内容的总结: http:/ ...

随机推荐

  1. $.AJAX参数提交及后台获取方式

    $.AJAX默认是get方式提交,所以你在后台只能用获取url参数的方式获取,可指定type为post更改提交方式: 在后台可通过Request["控件name/url参数key" ...

  2. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  3. [Leetcode]找到出现不同次数的数字(通用解法)

    今天在leetcode上遇到了 137. Single Number II 这道题: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素.(Give ...

  4. 错误 1 无法将文件“obj\Debug\XXX.exe”复制到“bin\Debug\XXX.exe”。文件“bin\Debug\XXX.exe”正由另一进程使用,因此该进程无法访问该文件

    在重新生成Windows服务的时候出现的这个问题,原因是因为你的Windows服务已经在运行了,你可以卸载掉这个服务,也可以在资源管理器里直接关闭.

  5. SQL记录-PLSQL运算符

    PL/SQL运算符 运算符是一个符号,告诉编译器执行特定的数学或逻辑操作. PL/SQL语言有丰富的内置运算符,运算符提供的以下几种类型: 算术运算符 关系运算符 比较运算符 逻辑运算符 字符串运算符 ...

  6. HTTP记录-HTTP介绍

    超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议.是一个应用程序级的 ...

  7. myBatis 3.2.7 如何打印 sql

    该文中使用的log框架为logback myBatis3.0.6左右的版本时 打印sql的时候只需要配置如下属性: <logger name="java.sql.Connection& ...

  8. zTree的简单例子

    <%@ page language="java" pageEncoding="UTF-8" %> <%@ include file=" ...

  9. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  10. CF232C Doe Graphs

    传送门 Solution:  (不理解时对着图研究一下就清楚啦!!!) sm[i]为|D(i)|  (x,y,n)为x,y在D(n)中的最短路 已知sm[i-1]+1为D(i)的割点 于是x-y的最短 ...