MySQL--------基于binlog实现闪回最佳实战

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

1. 背景

   * 为了数据安全,搭建了主从。实时主从备份只能防止硬件问题,比如主库的硬盘损坏。但对于误操作,则无能为力。比如在主库误删一张表,或者一个update语句没有指定where条件,导致全表被更新。当操作被同步到从库上后,则主从都“回天无力”。

   * 闪回用于快速恢复由于误操作丢失的数据。在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos)。比如忘了带where条件的update、delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,相比于传统的全备+增备,flashback显然更为快速、简单。

wKioL1lx2fHROzBVAABWHTvREUU212.jpg

2. 测试环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mysql> show variables  like  'version' ;
+ ---------------+------------+
| Variable_name | Value      |
+ ---------------+------------+
| version       | 5.6.36-log |
+ ---------------+------------+
1 row  in  set  (0.03 sec)
 
mysql> show variables  like  'datadir' ;
+ ---------------+--------------------+
| Variable_name | Value              |
+ ---------------+--------------------+
| datadir       | /data/mysql_data6/ |
+ ---------------+--------------------+
1 row  in  set  (0.00 sec)
 
mysql> show variables  like  'log_bin' ;
+ ---------------+-------+
| Variable_name | Value |
+ ---------------+-------+
| log_bin       |  ON     |
+ ---------------+-------+
1 row  in  set  (0.00 sec)
 
mysql> show variables  like  'binlog_format' ;
+ ---------------+-------+
| Variable_name | Value |
+ ---------------+-------+
| binlog_format | ROW   |
+ ---------------+-------+
1 row  in  set  (0.00 sec)
 
mysql> show variables  like  'binlog_row_image' ;
+ ------------------+-------+
| Variable_name    | Value |
+ ------------------+-------+
| binlog_row_image |  FULL   |
+ ------------------+-------+
1 row  in  set  (0.00 sec)


3. 闪回实战

  * 创建数据库与测试表,并插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql>  create  table  users(
     -> id  BIGINT  NOT  NULL  AUTO_INCREMENT,
     ->  name  VARCHAR (255)  NOT  NULL ,
     -> sex ENUM( 'M' 'F' NOT  NULL  DEFAULT  'M' ,
     -> age  INT  UNSIGNED  NOT  NULL  DEFAULT  '0' ,
     ->  PRIMARY  KEY  (id)
     -> )ENGINE=InnoDB  DEFAULT  CHARSET=utf8mb4;
Query OK, 0  rows  affected (0.04 sec)
 
mysql>  insert  into  users  values ( null 'tom' 'M' , 25), ( null 'jak' 'F' , 32), ( null 'ses' 'M' , 45), ( null 'lisea' 'M' , 35);
Query OK, 4  rows  affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0
 
mysql>  select  from  users;
+ ----+-------+-----+-----+
| id |  name   | sex | age |
+ ----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | jak   | F   |  32 |
|  3 | ses   | M   |  45 |
|  4 | lisea | M   |  35 |
+ ----+-------+-----+-----+
rows  in  set  (0.00 sec)


   * 下载闪回工具binlog2sql[ 由上海美团DBA团队出品 ]

1
2
3
4
5
6
[root@MySQL ~] # git clone https://github.com/danfengcao/binlog2sql.git
Initialized empty Git repository  in  /root/binlog2sql/ .git/
remote: Counting objects: 244,  done .
remote: Total 244 (delta 0), reused 0 (delta 0), pack-reused 244
Receiving objects: 100% (244 /244 ), 121.72 KiB | 27 KiB /s done .
Resolving deltas: 100% (124 /124 ),  done .


   * 安装相关依赖

1
2
3
[root@MySQL ~] # yum install pip -y
[root@MySQL ~] # pip install --upgrade pip
[root@MySQL ~] # pip install -r binlog2sql/requirements.txt


   * 提前刷新binlog [ 测试中好区分文件 ]

1
2
mysql> flush logs;
Query OK, 0  rows  affected (0.02 sec)


   * 查看当前binlog信息

1
2
3
4
5
6
7
mysql> show master status;
+ ------------+----------+--------------+------------------+-------------------------------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+ ------------+----------+--------------+------------------+-------------------------------------------+
| bin.000006 |      191 |              |                  | c7f82640-6b2d-11e7-9316-000c29f0b169:1-22 |
+ ------------+----------+--------------+------------------+-------------------------------------------+
1 row  in  set  (0.01 sec)


   * 误操作,delete没带where条件

1
2
mysql> delete from  users ;
Query OK, 4 rows affected (0.01 sec)


   * binlog2sql工具通过文件输出操作信息,定位SQL开始位置与结束位置

   可通过--start-datetime与--stop-datetime定位时间

     由此得到开始position为239,结束position为483

1
2
3
4
5
[root@MySQL ~]# python binlog2sql/binlog2sql/binlog2sql.py  -hlocalhost -P3306 -uroot -p '123'  -dmytest -tusers  --start-file='bin.000006' 
DELETE  FROM  `mytest`.`users`  WHERE  `age`=25  AND  `sex`= 'M'  AND  `id`=1  AND  ` name `= 'tom'  LIMIT 1; #start 239  end  483  time  2017-07-19 01:02:49
DELETE  FROM  `mytest`.`users`  WHERE  `age`=32  AND  `sex`= 'F'  AND  `id`=2  AND  ` name `= 'jak'  LIMIT 1; #start 239  end  483  time  2017-07-19 01:02:49
DELETE  FROM  `mytest`.`users`  WHERE  `age`=45  AND  `sex`= 'M'  AND  `id`=3  AND  ` name `= 'ses'  LIMIT 1; #start 239  end  483  time  2017-07-19 01:02:49
DELETE  FROM  `mytest`.`users`  WHERE  `age`=35  AND  `sex`= 'M'  AND  `id`=4  AND  ` name `= 'lisea'  LIMIT 1; #start 239  end  483  time  2017-07-19 01:02:49


   * binlog2sql通过flashback生成回滚SQL

1
[root@MySQL ~] # python binlog2sql/binlog2sql/binlog2sql.py -hlocalhost -P3306 -uroot -p'123' -dmytest -tusers --start-file='bin.000006' --start-position=239 --stop-position=483 -B > rollback.sql


   * 导入回滚SQL [ 导入前检查SQL语句是否正常 ]

1
[root@MySQL ~] # mysql -hlocalhost -uroot -p'123' < rollback.sql


   * 查看

1
2
3
4
5
6
7
8
9
10
mysql>  select  from  mytest.users;
+ ----+-------+-----+-----+
| id |  name   | sex | age |
+ ----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | jak   | F   |  32 |
|  3 | ses   | M   |  45 |
|  4 | lisea | M   |  35 |
+ ----+-------+-----+-----+
rows  in  set  (0.00 sec)

 

4. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。



      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1949859,如需转载请自行联系原作者





相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
SQL 运维 关系型数据库
|
8天前
|
SQL 关系型数据库 MySQL
MySQL性能优化实战:从索引策略到查询优化
MySQL性能优化聚焦索引策略和查询优化。创建索引如`CREATE INDEX idx_user_id ON users(user_id)`可加速检索;复合索引考虑字段顺序,如`idx_name ON users(last_name, first_name)`。使用`EXPLAIN`分析查询效率,避免全表扫描和大量`OFFSET`。通过子查询优化分页,如LIMIT配合内部排序。定期审查和调整策略以提升响应速度和降低资源消耗。【6月更文挑战第22天】
101 2
|
13天前
|
关系型数据库 MySQL 数据挖掘
MySQL窗口函数详解(概念+练习+实战)
MySQL窗口函数详解(概念+练习+实战)
46 1
|
4天前
|
存储 监控 关系型数据库
MySQL普通表转换为分区表实战指南
MySQL普通表转换为分区表实战指南
|
6天前
|
关系型数据库 MySQL 数据库
MySQL SELECT查询实战:练习题精选,提升你的数据库查询技能
MySQL SELECT查询实战:练习题精选,提升你的数据库查询技能
|
15天前
|
关系型数据库 MySQL
蓝易云 - MySQL自动删除binlog日志
注意,这个参数只影响新的binlog文件。如果你的服务器上已经有超过7天的日志文件,你需要手动删除它们,或者使用PURGE BINARY LOGS命令来删除它们。
14 0
|
2月前
|
存储 安全 关系型数据库
Mysql 的binlog日志的优缺点
MySQL的binlog(二进制日志)是一个记录数据库更改的日志文件,它包含了所有对数据库执行的更改操作,如INSERT、UPDATE和DELETE等。binlog的主要目的是复制和恢复。以下是binlog日志的优缺点: ### 优点: 1. **数据恢复**:当数据库出现意外故障或数据丢失时,可以利用binlog进行点恢复(point-in-time recovery),将数据恢复到某一特定时间点。 2. **主从复制**:binlog是实现MySQL主从复制功能的核心组件。主服务器将binlog中的事件发送到从服务器,从服务器再重放这些事件,从而实现数据的同步。 3. **审计**:b
|
2月前
|
SQL 关系型数据库 MySQL
mysql的binlog恢复数据
mysql的binlog恢复数据
56 0
|
2月前
|
存储 SQL 安全
浅谈MySQL Binlog
浅谈MySQL Binlog
55 0
|
2月前
|
SQL 存储 关系型数据库
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
解析MySQL Binlog:从零开始的入门指南【binlog入门指南】
2750 0