mysqlbinlog限制

该软件利用binlog中记录了操作前的数据镜像和操作后的数据镜像。有如下限制

1)binlog_format=row

2)必须打开binlog

3)只支持insert、update、delete

4)不支持drop 、truncate、alter等ddl语句

特别说明:自带的mysqlbinlog 命令如果没有 -B 参数,则不可用于下面范例。

预备知识:

egrep 参数:

-i :忽略大小写。

-C :后面的数字表示打印符合要求的行以及上下的行。

insert范例

创建测试数据

mysql> create database liangdb character set utf8;

Query OK, 1 row affected (0.01 sec)

mysql> use liangdb;

Database changed

创建测试表并插入数据

mysql> create table t_user_info(id int(20) auto_increment primary key ,name varchar(20));

mysql> insert into t_user_info values(1,'谢广坤'),(2,'赵四'),(3,'刘能'),(4,'王长贵');

mysql> insert into t_user_info values(11,'王大拿'),(12,'王木生'),(13,'谢永强'),(14,'王小蒙');

mysql>  select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 刘能    |

|  4 | 王长贵 |

| 11 | 王大拿 |

| 12 | 王木生 |

| 13 | 谢永强 |

| 14 | 王小蒙 |

+----+-----------+

8 rows in set (0.00 sec)

mysql> show master status \G

*************************** 1. row ***************************

File: mysql-bin.000004

Position: 4720

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

现在假设上面的id 11-14 误插入了,现在需要闪回,操作如下:

/opt/mysqlbinlog -vv mysql-bin.000004 |egrep -i -C 20 'insert'

BEGIN

/*!*/;

# at 4491

#170914 14:31:44 server id 3307105  end_log_pos 4551 CRC32 0x1099afaa    Table_map: `liangdb`.`t_user_info` mapped to number 96

# at 4551

#170914 14:31:44 server id 3307105  end_log_pos 4689 CRC32 0x6078cb75   Write_rows: table id 96 flags: STMT_END_F

BINLOG '

UCK6WRNhdjIAPAAAAMcRAAAAAGAAAAAAAAEAB2xpYW5nZGIAC3RfdXNlcl9pbmZvAAIDDwI8AAKq

r5kQ

UCK6WR5hdjIAigAAAFESAAAAAGAAAAAAAAEAAgAC//wLAAAAFMOnxb3igLnDpcKkwqfDpuKAucK/

/AwAAAAUw6fFveKAucOmxZPCqMOn4oCdxbj8DQAAABLDqMKwwqLDpsKwwrjDpcK8wrr8DgAAABXD

p8W94oC5w6XCsMKPw6jigJnihKJ1y3hg

'/*!*/;

### INSERT INTO `liangdb`.`t_user_info`

### SET

###   @1=11 /* INT meta=0 nullable=0 is_null=0 */

###   @2='????¤§???' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### INSERT INTO `liangdb`.`t_user_info`

### SET

###   @1=12 /* INT meta=0 nullable=0 is_null=0 */

###   @2='?????¨?”?' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### INSERT INTO `liangdb`.`t_user_info`

### SET

###   @1=13 /* INT meta=0 nullable=0 is_null=0 */

###   @2='è°¢?°???o' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### INSERT INTO `liangdb`.`t_user_info`

### SET

###   @1=14 /* INT meta=0 nullable=0 is_null=0 */

###   @2='????°è’?' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

# at 4689

#170914 14:31:44 server id 3307105  end_log_pos 4720 CRC32 0xad3890a3   Xid = 4313

COMMIT/*!*/;

在上面的记录中,找到对应insert语句end_log_pos ,找到关键字 BEGIN 往后看的第一个pos(BEGIN后面的 at 4491)和COMMIT往前看的最后一个end_log_pos(end_log_pos 4720)。

在上面中,分别找到开始和结束的end_log_pos 为:

--start-position=4491

--stop-position=4720

执行下述恢复命令:

/opt/mysqlbinlog -B -vv --start-position=4491 --stop-position=4720  mysql-bin.000004 | mysql -uXXXXXXXXX -pXXXXXXXXX -hXXXXXXXXX -PXXXXXXXXX liangdb

登录到数据库查看验证:

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 刘能    |

|  4 | 王长贵 |

+----+-----------+

4 rows in set (0.00 sec)

至此数据现已恢复。

update范例

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 刘能    |

|  4 | 王长贵 |

+----+-----------+

4 rows in set (0.00 sec)

mysql> update t_user_info set name='梁国军' where id >=3;

Query OK, 2 rows affected (0.00 sec)

Rows matched: 2  Changed: 2  Warnings: 0

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 梁国军 |

|  4 | 梁国军 |

+----+-----------+

4 rows in set (0.00 sec)

mysql> show master status\G

*************************** 1. row ***************************

File: mysql-bin.000004

Position: 5324

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

查看binlog

/opt/mysqlbinlog -vv mysql-bin.000004 |egrep -i -C 20 'update'

BEGIN

/*!*/;

# at 5099

#170914 15:02:36 server id 3307105  end_log_pos 5159 CRC32 0x6ec97416   Table_map: `liangdb`.`t_user_info` mapped to number 96

# at 5159

#170914 15:02:36 server id 3307105  end_log_pos 5293 CRC32 0xf089ad91    Update_rows: table id 96 flags: STMT_END_F

BINLOG '

jCm6WRNhdjIAPAAAACcUAAAAAGAAAAAAAAEAB2xpYW5nZGIAC3RfdXNlcl9pbmZvAAIDDwI8AAIW

dMlu

jCm6WR9hdjIAhgAAAK0UAAAAAGAAAAAAAAEAAgAC///8AwAAAAzDpcuGy5zDqMaSwr38AwAAABXD

psKiwoHDpeKAusK9w6XigKDigLr8BAAAABTDp8W94oC5w6nigKLCv8OowrTCtfwEAAAAFcOmwqLC

gcOl4oC6wr3DpeKAoOKAupGtifA=

'/*!*/;

### UPDATE `liangdb`.`t_user_info`

### WHERE

###   @1=3 /* INT meta=0 nullable=0 is_null=0 */

###   @2='???è??' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### SET

###   @1=3 /* INT meta=0 nullable=0 is_null=0 */

###   @2='?¢??????' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### UPDATE `liangdb`.`t_user_info`

### WHERE

###   @1=4 /* INT meta=0 nullable=0 is_null=0 */

###   @2='???é??è′μ' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### SET

###   @1=4 /* INT meta=0 nullable=0 is_null=0 */

###   @2='?¢??????' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

# at 5293

#170914 15:02:36 server id 3307105  end_log_pos 5324 CRC32 0x2f825c70    Xid = 4384

COMMIT/*!*/;

恢复

/opt/mysqlbinlog -B -vv --start-position=5099 --stop-position=5324  mysql-bin.000004 | mysql -uXXXXXXXXX -pXXXXXXXXX -hXXXXXXXXX -PXXXXXXXXX liangdb

验证。

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 刘能    |

|  4 | 王长贵 |

+----+-----------+

4 rows in set (0.00 sec)

至此,已恢复。

delete范例

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 刘能    |

|  4 | 王长贵 |

+----+-----------+

4 rows in set (0.00 sec)

mysql>  delete from t_user_info   where id >=3;

Query OK, 2 rows affected (0.01 sec)

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

+----+-----------+

2 rows in set (0.00 sec)

mysql> show master status\G

*************************** 1. row ***************************

File: mysql-bin.000004

Position: 5869

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

查看binlog

/opt/mysqlbinlog -vv mysql-bin.000004 |egrep -i -C 20 'delete'

BEGIN

/*!*/;

# at 5699

#170914 15:08:31 server id 3307105  end_log_pos 5759 CRC32 0x81532552   Table_map: `liangdb`.`t_user_info` mapped to number 96

# at 5759

#170914 15:08:31 server id 3307105  end_log_pos 5838 CRC32 0x8eca6af1    Delete_rows: table id 96 flags: STMT_END_F

BINLOG '

7yq6WRNhdjIAPAAAAH8WAAAAAGAAAAAAAAEAB2xpYW5nZGIAC3RfdXNlcl9pbmZvAAIDDwI8AAJS

JVOB

7yq6WSBhdjIATwAAAM4WAAAAAGAAAAAAAAEAAgAC//wDAAAADMOly4bLnMOoxpLCvfwEAAAAFMOn

xb3igLnDqeKAosK/w6jCtMK18WrKjg==

'/*!*/;

### DELETE FROM `liangdb`.`t_user_info`

### WHERE

###   @1=3 /* INT meta=0 nullable=0 is_null=0 */

###   @2='???è??' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

### DELETE FROM `liangdb`.`t_user_info`

### WHERE

###   @1=4 /* INT meta=0 nullable=0 is_null=0 */

###   @2='???é??è′μ' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

# at 5838

#170914 15:08:31 server id 3307105  end_log_pos 5869 CRC32 0x7ea27b47   Xid = 4402

COMMIT/*!*/;

恢复

/opt/mysqlbinlog -B -vv --start-position=5699 --stop-position=5869  mysql-bin.000004 | mysql -uXXXXXXXXX -pXXXXXXXXX -hXXXXXXXXX -PXXXXXXXXX liangdb

验证。

mysql> select * from t_user_info;

+----+-----------+

| id | name      |

+----+-----------+

|  1 | 谢广坤 |

|  2 | 赵四    |

|  3 | 刘能    |

|  4 | 王长贵 |

+----+-----------+

4 rows in set (0.00 sec)

至此,已恢复。

mysqlbinlog flashback 使用最佳实践的更多相关文章

  1. ASP.NET跨平台最佳实践

    前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...

  2. 《AngularJS深度剖析与最佳实践》简介

    由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...

  3. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

  4. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  5. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  6. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  7. PHP核心技术与最佳实践——全局浏览

    难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...

  8. Abp集成Swagger的最佳实践

    1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...

  9. MySQL · 答疑解惑 · MySQL 锁问题最佳实践

    http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...

随机推荐

  1. 手游产品经理初探(二)从营销角度看loading界面

    近期開始写产品相关的专题,准备从细节入手去思考.总结一些不为人注意的细节地方. 今天给大家分享的是游戏里面都有的loading界面. 还是从几个在Facebook上排名靠前的Casino游戏的load ...

  2. Android上拉查看详情实现

    京东淘宝有那么一种效果就是,上拉能够查看宝贝的详情,这里我也实现了一个类似的效果,也能够移植到商业项目上:先看看简单的效果图 实现原理事实上是利用了ScrollView的滚动和view的touch事件 ...

  3. EJB之JPA

    在前一篇文章中大概了解了EJB是什么?那么接下来就进一步介绍一下它与JPA有什么样的关系?及什么是JPA?JPA怎样用? 一.是什么? 第一次听说JPA是在EJB视屏中,所以一直感觉他们有不解的渊源. ...

  4. Android自己定义组件系列【5】——进阶实践(2)

    上一篇<Android自己定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这 ...

  5. android XXXActivity和getApplicationContext()差别

    从接触android起,到处都能看到context(上下文)的身影,查看源代码之后你会发现,它仅仅是个抽象类,详细实现都在ContextWrapper实现. 当你去查看android的源代码时,你会发 ...

  6. 鸟哥的Linux私房菜-----9、vi文本处理器

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  7. Bridge Page

    http://www.zzbaike.com/wiki/%E6%A1%A5%E9%A1%B5 桥页(Bridge Page),又叫“门页”(Doorway/Portal/Jump/Entry Page ...

  8. c# Java 微信红包算法

    int total_money_cent = 1000; // 红包总金额 单位:分 int total_people = 8; // 抢红包总人数 int[] array = new int[tot ...

  9. 【USACO 2017Feb】 Why Did the Cow Cross the Road

    [题目链接] 点击打开链接 [算法] dist[i][j][k]表示当前走到(i,j),走的步数除以3的余数为k的最小花费 spfa即可 [代码] #include<bits/stdc++.h& ...

  10. MSD3458开发资料

    MSD3458HB是mstar最新推出的普通4K数字电视解决方案,不带操作系统,是一个低成本的4K方案,156脚的LQFP普通封装,开发难度低,支持HDMI2.0输入,支持4K输出.1. Suppor ...