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

1. 背景

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

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

2. 测试环境

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. 闪回实战

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

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 |
+----+-------+-----+-----+
4 rows in set (0.00 sec)

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

[[email protected] ~]# 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.

* 安装相关依赖

[[email protected] ~]# yum install pip -y
[[email protected] ~]# pip install --upgrade pip
[[email protected] ~]# pip install -r binlog2sql/requirements.txt

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

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

* 查看当前binlog信息

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条件

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

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

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

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

[[email protected] ~]# 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

[[email protected] ~]# 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语句是否正常 ]

[[email protected] ~]# mysql -hlocalhost -uroot -p‘123‘ < rollback.sql

* 查看

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 |
+----+-------+-----+-----+
4 rows in set (0.00 sec)

4. 总结

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

时间: 2024-10-26 13:32:40

MySQL--------基于binlog实现闪回最佳实战的相关文章

mysql基于binlog回滚工具_flashback(python版本)

    update.delete的条件写错甚至没有写,导致数据操作错误,需要恢复被误操作的行记录.这种情形,其实时有发生,可以选择用备份文件+binlog来恢复到测试环境,然后再做数据修复,但是这样其实需要耗费一定的时间跟资源. 其实,如果binlog format为row,binlog文件中是会详细记录每一个事务涉及到操作,并把每一个事务影响到行记录均存储起来,能否给予binlog 文件来反解析数据库的行记录变动情况呢? 业界已有不少相关的脚本及工具,但是随着MySQL版本的更新.binlo

【练习】flashback基于scn的闪回查询

1.创建表dept1: 13:01:03 SCOTT@ORA11GR2>create table dept1 as select * from dept; Table created. 13:01:40 SCOTT@ORA11GR2>select * from dept1; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHI

Mysql基于binlog主从复制配置

上次配置mysql的主从复制还是年初的时候,没想到现在又开始使用mysql了.话不多说,进入正题 Master-Slave 搭建环境: Master: Os: rhel-server-6.3-x86_64 Mysql: MySQL -5.5.35-1 虚拟机:Virtual BOX Ip:192.168.56.12 Slave: Os: rhel-server-6.3-x86_64 Mysql: MySQL -5.5.35-1 虚拟机:Virtual BOX Ip:192.168.56.13 总

Mysql闪回工具之binlog2sql的原理及其使用

生产上误删数据.误改数据的现象也是时常发生的现象,作为运维这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太大,成本也大. 当然还有其他的一些操作方法,我们今天有主角. MySQL 闪回工具 --   binlog2sql 用途 数据回滚 主从切换后数据不一致的修复 从 binlog 生成标准 SQL,带来的衍生功能 闪回原理简析 开始之前,先说说闪回.我们都知道 MySQL binlog 以 event 为单

MySQL模拟Oralce闪回操作

在前面的文章中我们介绍了MySQL误操作后数据恢复(update,delete忘加where条件),大 概操作是通过sed命令把binlog中相关SQL误操作给逆向回来,然后导入SQL文件来恢复错误操作,sed相关命令也比较复杂.如果没有正则基础的 同学肯定搞不清楚在干嘛.今天无意中发现淘宝的大神(翻译高性能mysql第三版的作者之一)开发了一个补丁,该补丁能够模拟Oracle的闪回操作,这 样以来我们的MySQL也可以实现闪回咯.真是给力.注意:同样binlog格式需要是ROW 项目主页:ht

Oracle 闪回特性(FLASHBACK DATABASE)

--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --===================================== 闪回技术通常用于快速简单恢复数据库中出现的认为误操作等逻辑错误,从闪回的方式可以分为基于数据库级别闪回.表级别闪回.事务 级别闪回,根据闪回对数据的影响程度又可以分为闪回恢复,闪回查询.闪回恢复将修改数据,闪回点之后的数据将全部丢失.而闪回查询则可 以查询数据被DML的

ORACLE 10G 闪回建议

Flashback Tips The following tips and restrictions apply to using flashback features. Flashback Tips – Performance For better performance, generate statistics on all tables involved in a Flashback Query by using the DBMS_STATS package, and keep the s

Oracle 闪回 flashback

闪回:修复逻辑错误,从当前的点往回退 1.闪回有专门的闪回日志,存放在FIA中,但是只有闪回数据库会用到 2.如果做全数据库的闪回,相当于一次不完全恢复 基于时间点的闪回 SQL> flashback table t_wh_prodlib to timestamp to_timestamp('2015-03-03 12:10:07', 'yyyy-mm-dd hh24:mi:ss'); 将数据库闪回到20150303 12:10:07 如果基于时间点的闪回报错 ERROR at line 1:

4. Oracle 闪回特性(Flashback Version、Flashback Transaction)

转载自:https://blog.csdn.net/leshami/article/details/6112981 Oracle闪回特性为数据的快速回复某一对象的特定数据提供了更多的便利.前面介绍了闪回的几种特性,包括flashback database,flashback drop ,flashback query ,flashback table .接下来本文将介绍Flashback Version与Flashback Transaction. 一.Flashback Version Que