问题描述:创建测试库和测试表,先update数据,在delete数据,在update数据,通过gtid查找两次update的值。

参考文档:https://baijiahao.baidu.com/s?id=1661214737415657389&wfr=spider&for=pc

1.创建测试数据

create database back_gtid charset utf8mb4;
use back_gtid; create table tmp(id int, name varchar(20));
insert into tmp values(1,'zs'),(2,'ls'),(3,'ww'),(4,'zl'),(5,'qb');
commit;

2.全库导出

mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction -S /data/3308/mysql.sock | gzip > /tmp/full_$(date +%F).sql.gz

3.修改数据

use back_gtid;
update tmp set name = 'ZS' where id=1;
commit;
update tmp set name = 'LS' where id =2;
commit;
insert into tmp values(6,'aa'),(7,'bb'),(8,'cc');
commit;
delete from tmp where id = 5;
commit;

4.删除所有数据

use back_gtid;
delete from tmp;
commit;

5.再插入数据新的数据

use back_gtid;
insert into tmp values(9,"dd"),(10,"ee");
commit;

6.准备多实例测试库3309,做中转库做数据测试

systemctl start mysqld3309.service

7.全库恢复

cd /tmp
gunzip full_2021-02-01.sql.gz

8.从备份中找到创建库时的GTID,跳过误删除部分,加上新插入的数据行,查找删除库前的position号,从6开始

[root@mysql-test /tmp 20:00:05]# grep -A 10 "GTID_PURGED" full_2021-02-01.sql
SET @@GLOBAL.GTID_PURGED='b7ccf235-5f7b-11eb-a983-000c29a61c0a:1-5'; --
-- Position to start replication or point-in-time recovery from
-- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000021', MASTER_LOG_POS=1180; --
-- Current Database: `back_gtid`
--

9.查看当前的gtid值,现在的位置号是11,说明从备份数据到现在为止的操作是6-11,现在要在6-11的区间内排除误删数据的操作

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000021 | 2890 | | | b7ccf235-5f7b-11eb-a983-000c29a61c0a:1-11 |
+------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

10.每一次事务的提交,都对应一个GTID号,从模拟执行过程看,需要10就是删除表数据的元凶,恢复时要排除它

从下面的events中可以看到,delete操作的位置号是10,

mysql> show binlog events in 'mysql-bin.000021';
+------------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| mysql-bin.000021 | 4 | Format_desc | 8 | 123 | Server ver: 5.7.32-log, Binlog ver: 4 |
| mysql-bin.000021 | 123 | Previous_gtids | 8 | 154 | |
| mysql-bin.000021 | 154 | Gtid | 8 | 219 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:1' |
| mysql-bin.000021 | 219 | Query | 8 | 325 | create database test3308 |
| mysql-bin.000021 | 325 | Gtid | 8 | 390 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:2' |
| mysql-bin.000021 | 390 | Query | 8 | 497 | drop database back_gtid |
| mysql-bin.000021 | 497 | Gtid | 8 | 562 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:3' |
| mysql-bin.000021 | 562 | Query | 8 | 687 | create database back_gtid charset utf8mb4 |
| mysql-bin.000021 | 687 | Gtid | 8 | 752 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:4' |
| mysql-bin.000021 | 752 | Query | 8 | 878 | use `back_gtid`; create table tmp(id int, name varchar(20)) |
| mysql-bin.000021 | 878 | Gtid | 8 | 943 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:5' |
| mysql-bin.000021 | 943 | Query | 8 | 1020 | BEGIN |
| mysql-bin.000021 | 1020 | Table_map | 8 | 1074 | table_id: 109 (back_gtid.tmp) |
| mysql-bin.000021 | 1074 | Write_rows | 8 | 1149 | table_id: 109 flags: STMT_END_F |
| mysql-bin.000021 | 1149 | Xid | 8 | 1180 | COMMIT /* xid=21 */ |
| mysql-bin.000021 | 1180 | Gtid | 8 | 1245 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:6' |
| mysql-bin.000021 | 1245 | Query | 8 | 1322 | BEGIN |
| mysql-bin.000021 | 1322 | Table_map | 8 | 1376 | table_id: 111 (back_gtid.tmp) |
| mysql-bin.000021 | 1376 | Update_rows | 8 | 1428 | table_id: 111 flags: STMT_END_F |
| mysql-bin.000021 | 1428 | Xid | 8 | 1459 | COMMIT /* xid=650 */ |
| mysql-bin.000021 | 1459 | Gtid | 8 | 1524 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:7' |
| mysql-bin.000021 | 1524 | Query | 8 | 1601 | BEGIN |
| mysql-bin.000021 | 1601 | Table_map | 8 | 1655 | table_id: 111 (back_gtid.tmp) |
| mysql-bin.000021 | 1655 | Update_rows | 8 | 1707 | table_id: 111 flags: STMT_END_F |
| mysql-bin.000021 | 1707 | Xid | 8 | 1738 | COMMIT /* xid=652 */ |
| mysql-bin.000021 | 1738 | Gtid | 8 | 1803 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:8' |
| mysql-bin.000021 | 1803 | Query | 8 | 1880 | BEGIN |
| mysql-bin.000021 | 1880 | Table_map | 8 | 1934 | table_id: 111 (back_gtid.tmp) |
| mysql-bin.000021 | 1934 | Write_rows | 8 | 1993 | table_id: 111 flags: STMT_END_F |
| mysql-bin.000021 | 1993 | Xid | 8 | 2024 | COMMIT /* xid=654 */ |
| mysql-bin.000021 | 2024 | Gtid | 8 | 2089 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:9' |
| mysql-bin.000021 | 2089 | Query | 8 | 2166 | BEGIN |
| mysql-bin.000021 | 2166 | Table_map | 8 | 2220 | table_id: 111 (back_gtid.tmp) |
| mysql-bin.000021 | 2220 | Delete_rows | 8 | 2263 | table_id: 111 flags: STMT_END_F |
| mysql-bin.000021 | 2263 | Xid | 8 | 2294 | COMMIT /* xid=656 */ |
| mysql-bin.000021 | 2294 | Gtid | 8 | 2359 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:10' |
| mysql-bin.000021 | 2359 | Query | 8 | 2436 | BEGIN |
| mysql-bin.000021 | 2436 | Table_map | 8 | 2490 | table_id: 111 (back_gtid.tmp) |
| mysql-bin.000021 | 2490 | Delete_rows | 8 | 2581 | table_id: 111 flags: STMT_END_F |
| mysql-bin.000021 | 2581 | Xid | 8 | 2612 | COMMIT /* xid=661 */ |
| mysql-bin.000021 | 2612 | Gtid | 8 | 2677 | SET @@SESSION.GTID_NEXT= 'b7ccf235-5f7b-11eb-a983-000c29a61c0a:11' |
| mysql-bin.000021 | 2677 | Query | 8 | 2754 | BEGIN |
| mysql-bin.000021 | 2754 | Table_map | 8 | 2808 | table_id: 111 (back_gtid.tmp) |
| mysql-bin.000021 | 2808 | Write_rows | 8 | 2859 | table_id: 111 flags: STMT_END_F |
| mysql-bin.000021 | 2859 | Xid | 8 | 2890 | COMMIT /* xid=666 */ |
+------------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
45 rows in set (0.00 sec)

11.将二进制文件导出为sql文件,从6-11也就是现在位置,但是需要排除恢复误删除的区间内的10

mysqlbinlog --skip-gtids --include-gtids="b7ccf235-5f7b-11eb-a983-000c29a61c0a:6-11" --exclude-gtids="b7ccf235-5f7b-11eb-a983-000c29a61c0a:10" /data/3308/mysql-bin.000021 > /tmp/gtid-bin.sql;

12.将备份恢复到临时库,先恢复之前备份的数据,在恢复提取出来的数据是否正确

mysql -uroot -p -S /data/3309/mysql.sock

 set sql_log_bin=0;
 source /tmp/full_2021-02-01.sql;
 source /tmp/gtid-bin.sql;

13.查询验证

use back_gtid;
select * from tmp;

14.没问题可以恢复到生产

mysqldump -uroot -p --set-gtid-purged=OFF -S /data/3309/mysql.sock back_gtid tmp > /tmp/gtid-tmp.sql

mysql -uroot -p -S /data/3308/mysql.sock
set sql_log_bin=0;
use back_gtid;
source /tmp/gtid-tmp.sql;

15.查询验证3308是否恢复

use back_gtid;
select * from tmp;
set sql_log_bin=1;

基于GTID恢复误篡改数据的更多相关文章

  1. Mysql基于GTID复制模式-运维小结 (完整篇)

    先来看mysql5.6主从同步操作时遇到的一个报错:mysql> change master to master_host='192.168.10.59',master_user='repli' ...

  2. mysqlbinlog工具基于日志恢复详细解释

    如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作 1)RESET MASTER在上面查看日志存放的文件夹中 ...

  3. Mysql基于GTID主从复制

    Mysql5.6基于GTID全局事务的复制 什么是GTID?   GTID(Global Transaction Identifiers)是全局事务标识 当使用GTIDS时,在主上提交的每一个事务都会 ...

  4. 基于GTID的Mysql-Mha高可用方案探索

    声明: 本篇文章内容整理来源于互联网以及本人自己的梳理总结,目的是从零到一的搭建起来mysql mha高可用架构. 一.软件概述 MHA(Master High Availability)目前在MyS ...

  5. 深入MySQL复制(二):基于GTID复制

    相比传统的MySQL复制,gtid复制无论是配置还是维护都要轻松的多.本文对gtid复制稍作介绍. MySQL基于GTID复制官方手册:https://dev.mysql.com/doc/refman ...

  6. Mysql5.7实现主从复制、基于GTID的主从复制、并行复制

    (一.主从复制) 一.mysql主从复制原理    mysql的默认复制方式是主从复制.Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制, ...

  7. Centos7.5部署MySQL5.7基于GTID主从复制+并行复制+半同步复制+读写分离(ProxySQL) 环境- 运维笔记 (完整版)

    之前已经详细介绍了Mysql基于GTID主从复制的概念,原理和配置,下面整体记录下MySQL5.7基于GTID主从复制+并行复制+增强半同步复制+读写分离环境的实现过程,以便加深对mysql新特性GT ...

  8. MySQL 5.7基于GTID复制的常见问题和修复步骤(二)

    [问题二] 有一个集群(MySQL5.7.23)切换后复制slave报1236,其实是不小心在slave上执行了事务导致 Got fatal error 1236 from master when r ...

  9. MySQL5.7配置基于GTID的复制

    MySQL5.7下配置GTID复制的方法: 修改主库和从库的配置文件,加入下列部分的配置项:主库:[mysqld]log-bin=mysql-binbinlog_format= ROWgtid-mod ...

随机推荐

  1. 【NC基础操作】开发环境配置初体验

    当我们拿到开发工具UAP-STUDIO-6.5.0.2和Home文件的时候,意味着我们可以用这两样东西开始进行项目开发了(默认其他准备已就绪). 运行UAP-STUDIO-6.5.0.2 双击进入&q ...

  2. Azure Service Bus(三)在 .NET Core Web 应用程序发送ServiceBus Queue

    一,引言 在之前上一篇讲解到 Azure ServiceBus Queue 中,我们实地的演示了在控制台中如何操作ServiceBus Queue ,使用 Azure.Messgae.Service ...

  3. Centos7上以RPM包方式安装Oracle 18c XE

    Centos7上以RPM包方式安装Oracle 18c XE 安装阿里云 YUM 源 https://opsx.alibaba.com/mirror?lang=zh-CN 一.安装oracle数据库 ...

  4. 腾讯IOT安卓开发初探

    目录 腾讯IOT 安卓开发初探 Tecent IOT 开发平台的使用 新建项目 创建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 安卓开发 前置配置 data.json ...

  5. mysql performance storage engine

    mysql performance storage engine 概要 mysql的运行时状态记录的存储引擎,实现了PSI(Performance Storage Interface) 通过WITH_ ...

  6. 探索 .NET团队对API的设计流程

    在这篇文章中,我想介绍一些我觉得非常有趣的东西,.NET 团队是如何设计API的? 我们先来看下.NET团队面临的有哪些挑战,您正在设计一套API库,每天有数百万的开发人员在使用这些库,它们在世界各地 ...

  7. Liunx运维(十二)-Liunx系统常用内置命令

    文档目录: 一.Liunx内置命令概述 二.LIunx常用内置命令实例 1.help查看内置命令帮助2.查看内置命令使用方法3.":" 占位符4. "." 与s ...

  8. 两个很赞的用法(count函数里的表达式+计算时间间隔)

    1.count函数里写表达式 #无效写法,这样写不会判断表达式(ischecked=0),会全部列出来 SELECT cardid FROM search_detail GROUP BY cardid ...

  9. netty之EventLoop源码分析

    我们在讲解服务端和客户端时经常会看到提交一个任务到channel对应的EventLoop上,后续的io事件监听和任务执行都在EventLoop完成,可以说EventLoop是netty最核心的组件,我 ...

  10. Sentry(v20.12.1) K8S 云原生架构探索, SENTRY FOR JAVASCRIPT 手动捕获事件基本用法

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...