MySQL闪回技术恢复误操作数据

php中文网
发布: 2016-06-07 17:37:53
原创
1026人浏览过

我之前写过一篇《update忘加where条件误操作恢复过程演示》,是通过分析binlog,把binlog用shell转换成误操作之前的SQL语句,再导入到数据库中恢复,这个操作过

我之前写过一篇《update忘加where条件误操作恢复过程演示》,是通过分析binlog,把binlog用shell转换成误操作之前的sql语句,再导入到数据库中恢复,这个操作过程很复杂。


如今,淘宝开发了一个闪回工具,,项目主页:,原理同上,但操作过程方便了很多。


下面我来演示一下:


1、下载MySQL5.5.18源代码

2、下载闪回补丁

# wget

3、打补丁

# cd mysql-5.5.18

# patch -p0

4、编译MySQL并安装

# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql_flashback
# make;make install


操作:

mysql> select * from t1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | +----+ 8 rows in set (0.00 sec) mysql> update t1 set id=id+10; Query OK, 8 rows affected (0.00 sec) Rows matched: 8 Changed: 8 Warnings: 0


首先把那条误操作的语句找出来,并且得到Position点。

root@m1:/var/log/mysql# mysqlbinlog -vv mysql-bin.000001 |egrep -i -C 20 'update|t1' |more ROLLBACK/*!*/; BINLOG ' tpuGUg8BAAAAZwAAAGsAAAABAAQANS41LjMxLTArd2hlZXp5MS1sb2cAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAC2m4ZSEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 107 #131116 6:10:01 server id 1 end_log_pos 175 Query thread_id=44 exec_time=0 error_code=0 SET TIMESTAMP=1384553401/*!*/; SET @@session.pseudo_thread_id=44/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 175 # at 216 #131116 6:10:01 server id 1 end_log_pos 216 Table_map: `test`.`t1` mapped to number 42 #131116 6:10:01 server id 1 end_log_pos 326 Update_rows: table id 42 flags: STMT_END_F BINLOG ' uZuGUhMBAAAAKQAAANgAAAAAACoAAAAAAAEABHRlc3QAAnQxAAEDAAA= uZuGUhgBAAAAbgAAAEYBAAAAACoAAAAAAAEAAf///gEAAAD+CwAAAP4CAAAA/gwAAAD+AwAAAP4N AAAA/gQAAAD+DgAAAP4FAAAA/g8AAAD+BgAAAP4QAAAA/gcAAAD+EQAAAP4IAAAA/hIAAAA= '/*!*/; ### UPDATE `test`.`t1` ### WHERE ### @1=1 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @1=11 /* INT meta=0 nullable=0 is_null=0 */ ### UPDATE `test`.`t1` ### WHERE ### @1=2 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @1=12 /* INT meta=0 nullable=0 is_null=0 */ ### UPDATE `test`.`t1` ### WHERE ### @1=3 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @1=13 /* INT meta=0 nullable=0 is_null=0 */ ### UPDATE `test`.`t1` ### WHERE ### @1=4 /* INT meta=0 nullable=0 is_null=0 */ ### SET ### @1=14 /* INT meta=0 nullable=0 is_null=0 */ --More--


开始的起点以107为准,因为107下面紧跟着BEGIN,结束的点以end_log_pos 326下一个点为准,


root@m1:/var/log/mysql# mysqlbinlog -vv --start-position=326 mysql-bin.000001 |more /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #131116 6:09:58 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.31-0+wheezy1-log created 131116 6:09:58 at startup # Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; BINLOG ' tpuGUg8BAAAAZwAAAGsAAAABAAQANS41LjMxLTArd2hlZXp5MS1sb2cAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAC2m4ZSEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA== '/*!*/; # at 326 #131116 6:10:01 server id 1 end_log_pos 395 Query thread_id=44 exec_time=0 error_code=0 SET TIMESTAMP=1384553401/*!*/; SET @@session.pseudo_thread_id=44/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; COMMIT /*!*/; DELIMITER ; --More--

这里

# at 326
#131116  6:10:01 server id 1  end_log_pos 395

10分钟内自己学会PHP
10分钟内自己学会PHP

10分钟内自己学会PHP其中,第1篇为入门篇,主要包括了解PHP、PHP开发环境搭建、PHP开发基础、PHP流程控制语句、函数、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、日期和时间等内容;第2篇为提高篇,主要包括MySQL数据库设计、PHP操作MySQL数据库、Cookie和Session、图形图像处理技术、文件和目录处理技术、面向对象、PDO数据库抽象层、程序调试与错误处理、A

10分钟内自己学会PHP 524
查看详情 10分钟内自己学会PHP


那么结束的点就是395,因为下面紧跟着COMMIT


现在我们已经找到了开始起点为107,结束点为395,下面开始恢复。


# mysqlflashback -B -vv --start-position=107 --stop-position=395 mysql-bin.000001 | mysql


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


大功告成。


同样的方法,delete操作也一样


mysql> select * from t1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | +----+ 8 rows in set (0.00 sec) mysql> delete from t1; Query OK, 8 rows affected (0.08 sec) mysql> select * from t1; Empty set (0.00 sec)


我们可以看到binlog里,把刚刚delete的行,变成了insert

133658584.jpg


注:这里一定要设置binlog格式ROW,否则不能恢复。


mysqlflashback我已经编译完,如果嫌麻烦自己不想编译,请在附件里下载我编译好的,64位版本。



本文出自 “贺春旸的技术专栏” 博客,请务必保留此出处

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号