mysqlbinlog flashback 使用最佳实践
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 使用最佳实践的更多相关文章
- ASP.NET跨平台最佳实践
前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- ASP.NET MVC防范CSRF最佳实践
XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...
- 快速web开发中的前后端框架选型最佳实践
这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...
- Spring Batch在大型企业中的最佳实践
在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- PHP核心技术与最佳实践——全局浏览
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
- Abp集成Swagger的最佳实践
1.在项目中添加nuget包 Abp.Web.Api.SwaggerTool 2.在项目Abp模块的DependsOn添加AbpWebApiSwaggerToolModule Run It,启动项目, ...
- MySQL · 答疑解惑 · MySQL 锁问题最佳实践
http://mysql.taobao.org/monthly/2016/03/10/ 前言 最近一段时间处理了较多锁的问题,包括锁等待导致业务连接堆积或超时,死锁导致业务失败等,这类问题对业务可能会 ...
随机推荐
- Android进程间通信之内部类作为事件监听器
在Android中,使用内部类能够在当前类里面发用改监听器类,由于监听器类是外部类的内部类.所以能够自由訪问外部类的全部界面组件. 下面是一个调用系统内部类实现短信发送的一个样例: SMS类: pac ...
- Angular CLI: 1.6.7 入门
当你使用npm或者yarn也安装不了angular-cli时,请使用淘宝镜像. Step1 npm i -g cnpm --registry=https://registry.npm.taobao.o ...
- redis 事务 及发布于订阅功能
事务: Redis事务可以一次执行多个命令,事务具有以下特征: 1.隔离操作:事务中的所有命令都会序列化.按顺序地执行,不会被其他命令打扰. 2.原子操作:事务中的命令要么全部被执行,要么全部都不执行 ...
- WindowFromPoint -- 获得包括指定点的窗体的句柄
WindowFromPoint 函数功能: 该函数获得包括指定点的窗体的句柄. 函数原型: HWND WindowFromPoint(POINT Point): 參数: Point:指定一个被检 ...
- CSS总结01
1 CSS 的作用是? 2 如何引入 CSS 样式? 3 CSS 选择器的基本类型和复合选择器分别是? 4 字体.背景.列表和链接和鼠标的属性有哪些? 5 如何理解盒子模型? 6 浮动的方式有哪些,如 ...
- 蓝桥 PREV-34 历届试题 矩阵翻硬币
历届试题 矩阵翻硬币 时间限制:1.0s 内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第 ...
- Vijos 1144 小胖守皇宫 【树形DP】
小胖守皇宫 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步 ...
- ubuntu14安装docker-ce
先卸载旧的docker sudo apt-get remove docker docker-engine docker.io docker-ce 通过HTTPS使用存储库(repository) su ...
- [疑问] C# 多线程程序,如果在并行程序块中开空间会远远慢于将空间开在并行块之外
// int[,] label = new int[m, n]; Parallel.For(, thread_num, (n) => { ]; i++) { int[] tmp = new in ...
- 【JSOI 2011】 分特产
[题目链接] 点击打开链接 [算法] 考虑求每个人可以不分的方案 那么,对于每件物品,我们把它分成n份,每一份对应分给每一个人,有C(a[i]+n-1,m-1)种方案,而总方案数就是每种 物品方案数的 ...