本文章配套视频 https://www.ixigua.com/7092706197576516110
本专栏全部文章 https://blog.csdn.net/tonghu_note/category_11716546.html
总目录 https://blog.csdn.net/tonghu_note/article/details/124333034

来我的dou音 aa10246666, 看配套视频


一、实战环境

节点 node4 mysql 8.0.28 10.211.55.7

本文主要讲解如何基于gtid的方式使用“备份文件+bin log”把数据库恢复到任意一个我们期望的时间点


二、操作场景

步骤 会话 命令
第1步 session 1 reset master;
第2步 session 1 use d1;create table t1(id int);
第3步 session 1 insert into t1 select 1;
第4步 session 2 mysqldump -uroot -proot --single-transaction --triggers --routines --events --source-data=2 -A > alldb.dump
第5步 session 1 insert into t1 select 2;
第6步 session 1 insert into t1 select 3;
第7步 session 1 drop table t1;
...

我们在第4步的时侯做了一个备份,在第7步做了一个删除表的操作,接下来我们要将数据库恢复到删除表t1之前的状态,也就是第6步(包含第6步)的状态


三、恢复数据库

1、查看备份alldb.dump文件中关于GTID的记录

root@node4:~# more alldb.dump 
-- MySQL dump 10.13  Distrib 8.0.28, for Linux (aarch64)
--
-- Host: localhost    Database: 
-- ------------------------------------------------------
-- Server version    8.0.28

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!50606 SET @OLD_INNODB_STATS_AUTO_RECALC=@@INNODB_STATS_AUTO_RECALC */;
/*!50606 SET GLOBAL INNODB_STATS_AUTO_RECALC=OFF */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;

--
-- GTID state at the beginning of the backup 
--

SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ 'd2cc5f08-b823-11ec-890f-001c42165ccf:1-2';

--
-- Position to start replication or point-in-time recovery from
--

-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=576;

--
-- Current Database: `mysql`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `mysql`;

--
-- Table structure for table `columns_priv`
--

可以看到备份结束时系统的bin log已执行到了 d2cc5f08-b823-11ec-890f-001c42165ccf:1-2' 这个gtid的位置,所以我们bin log的起始位置必须是的这个以后的第一个位置

2、查看bin log日志文件中关于GTID的记录

root@node4:/usr/local/mysql/data# mysqlbinlog --base64-output=decode-rows -vv binlog.000001
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#220501  2:41:07 server id 4  end_log_pos 126     Start: binlog v 4, server v 8.0.28 created 220501  2:41:07 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
# at 126
#220501  2:41:07 server id 4  end_log_pos 153     Previous-GTIDs
# [empty]
# at 153
#220501  2:42:45 server id 4  end_log_pos 226     GTID    last_committed=0    sequence_number=1    rbr_only=no    original_committed_timestamp=1651387365698133    immediate_commit_timestamp=1651387365698133    transaction_length=176
# original_commit_timestamp=1651387365698133 (2022-05-01 02:42:45.698133 EDT)
# immediate_commit_timestamp=1651387365698133 (2022-05-01 02:42:45.698133 EDT)
/*!80001 SET @@session.original_commit_timestamp=1651387365698133*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'd2cc5f08-b823-11ec-890f-001c42165ccf:1'/*!*/;
# at 226
#220501  2:42:45 server id 4  end_log_pos 329     Query    thread_id=69    exec_time=0    error_code=0    Xid = 12943
use `d1`/*!*/;
SET TIMESTAMP=1651387365/*!*/;
SET @@session.pseudo_thread_id=69/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1168113696/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
/*!80013 SET @@session.sql_require_primary_key=0*//*!*/;
create table t1(id int)
/*!*/;
# at 329
#220501  2:42:50 server id 4  end_log_pos 402     GTID    last_committed=1    sequence_number=2    rbr_only=yes    original_committed_timestamp=1651387370854559    immediate_commit_timestamp=1651387370854559    transaction_length=247
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1651387370854559 (2022-05-01 02:42:50.854559 EDT)
# immediate_commit_timestamp=1651387370854559 (2022-05-01 02:42:50.854559 EDT)
/*!80001 SET @@session.original_commit_timestamp=1651387370854559*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'd2cc5f08-b823-11ec-890f-001c42165ccf:2'/*!*/;
# at 402
#220501  2:42:50 server id 4  end_log_pos 471     Query    thread_id=69    exec_time=0    error_code=0
SET TIMESTAMP=1651387370/*!*/;
BEGIN
/*!*/;
# at 471
#220501  2:42:50 server id 4  end_log_pos 513     Table_map: `d1`.`t1` mapped to number 1862
# at 513
#220501  2:42:50 server id 4  end_log_pos 549     Write_rows: table id 1862 flags: STMT_END_F
### INSERT INTO `d1`.`t1`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
# at 549
#220501  2:42:50 server id 4  end_log_pos 576     Xid = 12944
COMMIT/*!*/;
# at 576
#220501  2:43:05 server id 4  end_log_pos 649     GTID    last_committed=2    sequence_number=3    rbr_only=yes    original_committed_timestamp=1651387385428623    immediate_commit_timestamp=1651387385428623    transaction_length=247
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1651387385428623 (2022-05-01 02:43:05.428623 EDT)
# immediate_commit_timestamp=1651387385428623 (2022-05-01 02:43:05.428623 EDT)
/*!80001 SET @@session.original_commit_timestamp=1651387385428623*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'd2cc5f08-b823-11ec-890f-001c42165ccf:3'/*!*/;
# at 649
#220501  2:43:05 server id 4  end_log_pos 718     Query    thread_id=69    exec_time=0    error_code=0
SET TIMESTAMP=1651387385/*!*/;
BEGIN
/*!*/;
# at 718
#220501  2:43:05 server id 4  end_log_pos 760     Table_map: `d1`.`t1` mapped to number 1923
# at 760
#220501  2:43:05 server id 4  end_log_pos 796     Write_rows: table id 1923 flags: STMT_END_F
### INSERT INTO `d1`.`t1`
### SET
###   @1=2 /* INT meta=0 nullable=1 is_null=0 */
# at 796
#220501  2:43:05 server id 4  end_log_pos 823     Xid = 13615
COMMIT/*!*/;
# at 823
#220501  2:43:19 server id 4  end_log_pos 896     GTID    last_committed=3    sequence_number=4    rbr_only=yes    original_committed_timestamp=1651387399105569    immediate_commit_timestamp=1651387399105569    transaction_length=247
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1651387399105569 (2022-05-01 02:43:19.105569 EDT)
# immediate_commit_timestamp=1651387399105569 (2022-05-01 02:43:19.105569 EDT)
/*!80001 SET @@session.original_commit_timestamp=1651387399105569*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'd2cc5f08-b823-11ec-890f-001c42165ccf:4'/*!*/;
# at 896
#220501  2:43:19 server id 4  end_log_pos 965     Query    thread_id=69    exec_time=0    error_code=0
SET TIMESTAMP=1651387399/*!*/;
BEGIN
/*!*/;
# at 965
#220501  2:43:19 server id 4  end_log_pos 1007     Table_map: `d1`.`t1` mapped to number 1923
# at 1007
#220501  2:43:19 server id 4  end_log_pos 1043     Write_rows: table id 1923 flags: STMT_END_F
### INSERT INTO `d1`.`t1`
### SET
###   @1=3 /* INT meta=0 nullable=1 is_null=0 */
# at 1043
#220501  2:43:19 server id 4  end_log_pos 1070     Xid = 13616
COMMIT/*!*/;
# at 1070
#220501  2:43:24 server id 4  end_log_pos 1143     GTID    last_committed=4    sequence_number=5    rbr_only=no    original_committed_timestamp=1651387404343323    immediate_commit_timestamp=1651387404343323    transaction_length=192
# original_commit_timestamp=1651387404343323 (2022-05-01 02:43:24.343323 EDT)
# immediate_commit_timestamp=1651387404343323 (2022-05-01 02:43:24.343323 EDT)
/*!80001 SET @@session.original_commit_timestamp=1651387404343323*//*!*/;
/*!80014 SET @@session.original_server_version=80028*//*!*/;
/*!80014 SET @@session.immediate_server_version=80028*//*!*/;
SET @@SESSION.GTID_NEXT= 'd2cc5f08-b823-11ec-890f-001c42165ccf:5'/*!*/;
# at 1143
#220501  2:43:24 server id 4  end_log_pos 1262     Query    thread_id=69    exec_time=0    error_code=0    Xid = 13617
SET TIMESTAMP=1651387404/*!*/;
DROP TABLE `t1` /* generated by server */
/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
root@node4:/usr/local/mysql/data#

通过bin log可以看到 d2cc5f08-b823-11ec-890f-001c42165ccf:2 之后的第一个gtid是 d2cc5f08-b823-11ec-890f-001c42165ccf:3,所以这个gtid就是我们要从bin log是解析的第1个gtid,我们接着看DROP TABLE `t1`所在的gtid是d2cc5f08-b823-11ec-890f-001c42165ccf:5,所以我们要找到它之前的第一个gtid ,即d2cc5f08-b823-11ec-890f-001c42165ccf:4,最终我们要恢复的bin log的gtid区间是 d2cc5f08-b823-11ec-890f-001c42165ccf:3-4

3、我们按照上述总结的区间进行bin log的解析工作

注意下面这个命令就不需要 --base64-output=decode-rows -vv 参数了, --skip-gtids的意思是解析后的文件中不存在gtid信息,否则可能与数据库中现有的gtid冲突

mysqlbinlog --skip-gtids --include-gtids='d2cc5f08-b823-11ec-890f-001c42165ccf:3-4' binlog.000001 > a.txt

4、开始恢复备份

将alldb.dump文件中的,如下内容注释掉

-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ 'd2cc5f08-b823-11ec-890f-001c42165ccf:1-2';

否则会报如下的错误:

ERROR 3546 (HY000) at line 26: @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED

开始进行备份的恢复

root@node4:~# mysql -uroot -proot  < alldb.dump 
mysql: [Warning] Using a password on the command line interface can be insecure.
root@node4:~#

查看数据库的状态,已经恢复到第3步状态

mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql>

下一步我们用追加bin log的方式使数据库恢复到第6步的状态,用bin log解析后的a.txt进一步恢复

root@node4:/usr/local/mysql/data# mysql -uroot -proot  < a.txt
mysql: [Warning] Using a password on the command line interface can be insecure.
root@node4:/usr/local/mysql/data#

查看数据库的状态,已经恢复到第6步状态

mysql> select * from t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)


四、作业

mysqlbinlog 还有一个参数 --exclude-gtids 大家可以试下,这个参数的用途

《童虎学习笔记》11分钟学会MySQL基于时间点的恢复(gtid方式)相关推荐

  1. 《童虎学习笔记》20分钟实战ProxySQL MGR高可用及读写分离架构

    本文章配套视频 https://www.ixigua.com/7086085500540289572?id=7087546160079962660 本专栏全部文章 https://blog.csdn. ...

  2. 《童虎学习笔记》5分钟Citus之SQL命令参考

    本专栏全部文章 ​​​​​​​https://blog.csdn.net/tonghu_note/category_11713514.html 总目录 https://blog.csdn.net/to ...

  3. 《童虎学习笔记》PostgreSQL超简单新手入门教程

    总目录:https://blog.csdn.net/tonghu_note/article/details/124333034 第1节 3分钟学会在linux下安装PostgreSQL 第2节 2分钟 ...

  4. 《童虎学习笔记》3分钟学会如何优雅的重启MySQL MGR集群

     本文章配套视频 https://www.ixigua.com/7086085500540289572?id=7083884629215674911 本专栏全部文章 https://blog.csdn ...

  5. 《童虎学习笔记》3分钟学会PostgreSQL实时监控利器pgCenter

       本文章配套视频 https://www.ixigua.com/7077056019024904717?id=7078684048586965512 本专栏全部文章 https://blog.cs ...

  6. 《童虎学习笔记》14分钟结合ProxySQL处理超半数MGR节点故障

    本文章配套视频 https://www.ixigua.com/7086085500540289572?id=7088719800846778910 本专栏全部文章 https://blog.csdn. ...

  7. 《童虎学习笔记》5分钟了解Citus核心系统表

    本专栏全部文章 https://blog.csdn.net/tonghu_note/category_11713514.html 总目录 https://blog.csdn.net/tonghu_no ...

  8. 《童虎学习笔记》15分钟ShardingSphere搭建PostgreSQL分库分表

    本文章配套视频 https://www.ixigua.com/7077056019024904717?id=7082741456641163790 本专栏全部文章 https://blog.csdn. ...

  9. 《童虎学习笔记》5分钟入门PG分布式集群Citus

    本专栏全部文章 https://blog.csdn.net/tonghu_note/category_11713514.html 总目录 https://blog.csdn.net/tonghu_no ...

最新文章

  1. 应该知道的Linux技巧
  2. javascript的时间段选择
  3. Gym 100431E Word Cover 题解:KMP上跑dp
  4. 刀与枪的碰撞zhajinhua2012
  5. 网络合作伙伴通信协议指南:NETWORK ASSOCIATES GUIDE TO COMMUNICATIONS PROTOCOLS
  6. Django 踩过的坑(二)
  7. 台式计算机显示器的分辨率,台式电脑分辨率多少合适,测试电脑分辨率
  8. 激光打印机无线服务器,插上无线翅膀 兄弟1218W激光打印机评测
  9. 操作系统——信号量机制(PV操作)
  10. 第十四届全国大学生信息安全竞赛部分wp
  11. 计算机搜索栏历史记录,如何打开搜索历史记录
  12. 搜索引擎都有哪几种类型?
  13. 2018东北四省赛 Spell Boost DP
  14. 计算机应用中的CAI,使用计算机来进行翻译属于计算机应用领域中的()。A.AIB.CAEC.CADD.CAI...
  15. Android架构之高可用移动网络连接
  16. 01 双重差分与三重差分分析法
  17. 公司企业邮箱怎么群发邮件?如何在工作中脱颖而出
  18. python 小说人物分析_Python文章相关性分析---金庸武侠小说分析
  19. 测试apk-异常管控Gps攻击者开发
  20. 文华财经指标安装使用步骤,开多开空成功率95%公式指标多空买卖点信号

热门文章

  1. python中mean的用法_Python Pandas dataframe.mean()用法及代码示例
  2. SDK(Software Development Kit, 即软件开发工具包 )
  3. Selenium 底层实现原理详解
  4. 金蝶eas账套连接外部数据库
  5. 四招让你在疫情期间每天只需工作2小时~
  6. 令人拍案叫绝的算法学习网站,算法入门到精通,算法面试冲刺资料这里都有
  7. 【转载】OpenCV-Python系列之直方图均衡(三十五)
  8. 学软件技术计算机二级考什么,计算机二级考试科目有哪些
  9. 第3关:函数的使用范围:Python 作用域
  10. 工科小论文引言的写法(精简),自己总结