11MySQL误操作后如何快速恢复数据
22========================
33
4- 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表 ,忘加限制条件,整张表都没了。假如这还是线上环境核心业务数据,那这事就闹大了。误操作后,能快速回滚数据是非常重要的。
4+ 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,不小心update了整张表的某个字段,或者delete一张表 ,忘加限制条件,整张表都没了。假如这还是线上环境核心业务数据,那这事就闹大了。误操作后,能快速回滚数据是非常重要的。
55
66
77传统解法
88===
9- 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态。然后跳过误操作的SQL,再继续应用binlog。此法费时费力,不值得再推荐。
9+ 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态。然后跳过误操作的SQL,再继续应用binlog。对于DML的回滚, 此法费时费力,不值得再推荐。
1010
1111利用binlog2sql快速闪回
1212===
@@ -79,23 +79,23 @@ DELETE FROM `test`.`tbl` WHERE `addtime`='2016-12-13 20:25:00' AND `id`=3 AND `n
7979DELETE FROM ` test` .` tbl` WHERE ` addtime` =' 2016-12-12 00:00:00' AND ` id` =4 AND ` name` =' 小李' LIMIT 1; # start 728 end 938 time 2016-12-13 20:28:05
8080` ` `
8181
82- 3. 我们得到了误操作sql的准确位置在728-938之间,再根据位置进一步过滤 ,使用flashback模式生成回滚sql,检查回滚sql是否正确
82+ 3. 我们得到了误操作sql的准确位置在728-938之间,再根据位置过滤 ,使用flashback模式生成回滚sql,检查回滚sql是否正确(注:真实环境下,此步经常会进一步筛选出需要的sql。结合grep、编辑器等)
8383
84- ` ` ` bash
85- shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p' admin' -dtest -ttbl --start-file=' mysql-bin.000052' --start-pos=3346 --end-pos=3556 -B
84+ ` ` ` bash
85+ shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p' admin' -dtest -ttbl --start-file=' mysql-bin.000052' --start-pos=3346 --end-pos=3556 -B > rollback.sql | cat
8686输出:
8787INSERT INTO ` test` .` tbl` (` addtime` , ` id` , ` name` ) VALUES (' 2016-12-12 00:00:00' , 4, ' 小李' ); # start 728 end 938 time 2016-12-13 20:28:05
8888INSERT INTO ` test` .` tbl` (` addtime` , ` id` , ` name` ) VALUES (' 2016-12-13 20:25:00' , 3, ' 小孙' ); # start 728 end 938 time 2016-12-13 20:28:05
8989INSERT INTO ` test` .` tbl` (` addtime` , ` id` , ` name` ) VALUES (' 2016-12-10 00:04:48' , 2, ' 小钱' ); # start 728 end 938 time 2016-12-13 20:28:05
9090INSERT INTO ` test` .` tbl` (` addtime` , ` id` , ` name` ) VALUES (' 2016-12-10 00:04:33' , 1, ' 小赵' ); # start 728 end 938 time 2016-12-13 20:28:05
9191` ` `
9292
93- 3 . 确认回滚sql正确,执行回滚语句。登录mysql确认,数据回滚成功。
93+ 4 . 确认回滚sql正确,执行回滚语句。登录mysql确认,数据回滚成功。
9494
95- ` ` ` bash
96- shell> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p' admin' -dtest -ttbl --start-file= ' mysql-bin.000052 ' --start-pos=3346 --end-pos=3556 -B | mysql -h127.0.0.1 -P3306 -uadmin -p ' admin '
95+ ` ` ` bash
96+ shell> mysql -h127.0.0.1 -P3306 -uadmin -p' admin' < rollback.sql
9797
98- mysql> select * from tbl;
98+ mysql> select * from tbl;
9999+----+--------+---------------------+
100100| id | name | addtime |
101101+----+--------+---------------------+
@@ -104,7 +104,7 @@ mysql> select * from tbl;
104104| 3 | 小孙 | 2016-12-13 20:25:00 |
105105| 4 | 小李 | 2016-12-12 00:00:00 |
106106+----+--------+---------------------+
107- ` ` `
107+ ` ` `
108108
109109至此,不用再担心被炒鱿鱼了。
110110
0 commit comments