mysql恢复--flashback

author:skate
time:2013/07/23 
  
mysqlbinlog flashback功能是淘宝彭立勋(http://www.penglixun.com/)开源的一个工具
主要功能:对rows格式的binlog可以进行逆向操作,如delete反向生成insert,update生成反向的update,insert反向生成delete。在DBA误操作时,可以把数据库恢复到以前某个时间点

 

1.源码安装


下载:
http://mysql.taobao.org/index.php/Patch_source_code#Add_flashback_feature_for_mysqlbinlog

安装
#cd mysql-5.5.18
#wget http://mysql.taobao.org/images/0/0f/5.5.18_flashback.diff
#patch -p0 <5.5.18_flashback.diff

2.直接下载二进制文件:http://download.csdn.net/download/wyzxg/5809143


安装完之后,看mysqlbinlog是否带有“-B”参数,如果带有-B,说明具有flashback功能
  


使用场景


场景一:因误操作等原因,需要把数据库恢复到之前某个状态

测试:
测试表:
mysql> select * from zxg;
+------+------+
| a    | b    |
+------+------+
|    1 | 1    |
|    2 | 2    |
|    3 | 3    |
|    5 | 4    |
+------+------+
4 rows in set (0.00 sec)

查看position
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000018 |      459 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


开始做DML操作
mysql> insert into zxg select * from zxg;
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into zxg select * from zxg;
Query OK, 8 rows affected (0.03 sec)
Records: 8  Duplicates: 0  Warnings: 0

查看这时的position
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000018 |      893 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


用mysqlbinlog分析binlog,找到要要恢复的position位置:

[root@slave92 data]# /mysqlinstall/mysqlbinlog  -v --base64-output=decode-rows  --start-position=459 --stop-position=893  mysql-bin.000018  | more
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 459
#130723 22:19:15 server id 2  end_log_pos 530   Query   thread_id=141   exec_time=0     error_code=0
SET TIMESTAMP=1374589155/*!*/;
SET @@session.pseudo_thread_id=141/*!*/;
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 latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 530
# at 578
#130723 22:19:15 server id 2  end_log_pos 578   Table_map: `testdb2`.`zxg` mapped to number 44
#130723 22:19:15 server id 2  end_log_pos 635   Write_rows: table id 44 flags: STMT_END_F
### INSERT INTO testdb2.zxg
### SET
###   @1=1
###   @2='1'
### INSERT INTO testdb2.zxg
### SET
###   @1=2
###   @2='2'
### INSERT INTO testdb2.zxg
### SET
###   @1=3
###   @2='3'
### INSERT INTO testdb2.zxg
### SET
###   @1=5
###   @2='4'
# at 635
#130723 22:19:15 server id 2  end_log_pos 662   Xid = 2290949
COMMIT/*!*/;
# at 662
#130723 22:19:17 server id 2  end_log_pos 733   Query   thread_id=141   exec_time=0     error_code=0
SET TIMESTAMP=1374589157/*!*/;
BEGIN
/*!*/;
# at 733
# at 781
#130723 22:19:17 server id 2  end_log_pos 781   Table_map: `testdb2`.`zxg` mapped to number 44
#130723 22:19:17 server id 2  end_log_pos 866   Write_rows: table id 44 flags: STMT_END_F
### INSERT INTO testdb2.zxg
### SET
###   @1=1
###   @2='1'
### INSERT INTO testdb2.zxg
### SET
###   @1=2
###   @2='2'
### INSERT INTO testdb2.zxg
### SET
###   @1=3
###   @2='3'
### INSERT INTO testdb2.zxg
### SET
###   @1=5
###   @2='4'
### INSERT INTO testdb2.zxg
### SET
###   @1=1
###   @2='1'
### INSERT INTO testdb2.zxg
### SET
###   @1=2
###   @2='2'
### INSERT INTO testdb2.zxg
### SET
###   @1=3
###   @2='3'
### INSERT INTO testdb2.zxg
### SET
###   @1=5
###   @2='4'
# at 866
#130723 22:19:17 server id 2  end_log_pos 893   Xid = 2290950
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
[root@slave92 data]#

说明:如果binlog很大,可以搜索表名,找到start-position和stop-position,在这例子中可以看找到的position是否可记录的一样。

 

用mysqlbinlog验证flashback的binlog是否和预期的一样

[root@slave92 data]# /mysqlinstall/mysqlbinlog  -B -v --base64-output=decode-rows  --start-position=459 --stop-position=893  mysql-bin.000018  | more
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 459
# at 530
# at 578
# at 635
# at 662
# at 733
# at 781
# at 866
DELIMITER ;
#130723 22:19:17 server id 2  end_log_pos 893   Xid = 2290950
COMMIT/*!*/;
#130723 22:19:17 server id 2  end_log_pos 781   Table_map: `testdb2`.`zxg` mapped to number 44
#130723 22:19:17 server id 2  end_log_pos 866   Write_rows: table id 44 flags: STMT_END_F
### DELETE FROM testdb2.zxg
### WHERE
###   @1=1
###   @2='1'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=2
###   @2='2'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=3
###   @2='3'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=5
###   @2='4'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=1
###   @2='1'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=2
###   @2='2'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=3
###   @2='3'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=5
###   @2='4'
#130723 22:19:17 server id 2  end_log_pos 733   Query   thread_id=141   exec_time=0     error_code=0
SET TIMESTAMP=1374589157/*!*/;
BEGIN
/*!*/;
#130723 22:19:15 server id 2  end_log_pos 662   Xid = 2290949
COMMIT/*!*/;
#130723 22:19:15 server id 2  end_log_pos 578   Table_map: `testdb2`.`zxg` mapped to number 44
#130723 22:19:15 server id 2  end_log_pos 635   Write_rows: table id 44 flags: STMT_END_F
### DELETE FROM testdb2.zxg
### WHERE
###   @1=1
###   @2='1'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=2
###   @2='2'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=3
###   @2='3'
### DELETE FROM testdb2.zxg
### WHERE
###   @1=5
###   @2='4'
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

 

确认无误的话,就可以恢复了

# /mysqlinstall/mysqlbinlog  -B   --start-position=459 --stop-position=893  mysql-bin.000018 | mysql testdb2

然后再查表zxg数据,发现表zxg已经恢复,如下

mysql> select * from zxg;
+------+------+
| a    | b    |
+------+------+
|    1 | 1    |
|    2 | 2    |
|    3 | 3    |
|    5 | 4    |
+------+------+
4 rows in set (0.00 sec)

 

说明:在生产环境这种场景使用不现实,但在开发测试环境或独有数据库,这种场景到可以一用,用之前最好备好

 

场景二:因对某个表误操作,只需要把表恢复到误操作之前


这种场景实际遇到比较多,只是在场景一的基础上把误操作的binlog位置找到,然后用mysqlbinlog反向解析,为了安全起见,
最好在另外一台机器上,创建相同的表(所在数据库也要一样),然后在此基础上恢复,最后在把恢复结果导入源库中。这样比较安全


参考:
http://www.mysqlsupport.cn/mysqlbinlog-flashback/  

 

 

--end--


   
  

对于MySQL删除数据库的恢复,可以通过以下方法进行: 1. 使用备份:如果你在删除数据库之前进行了备份,那么你可以从备份中恢复数据库。你可以使用MySQL的备份工具,如mysqldump命令,或者使用第三方备份工具来创建数据库备份。通过将备份文件导入到MySQL服务器中,可以还原误删的数据库。 2. 使用二进制日志(binlog):MySQL的二进制日志记录了所有的写操作,包括删除操作。你可以使用mysqlbinlog命令来解析二进制日志,并找到误删数据库的操作。然后,可以重新执行这些操作来恢复删除数据库。 3. 使用Flashback技术:对于使用DELETE语句误删数据行的情况,可以使用MySQLFlashback技术来恢复删除数据行。但对于使用TRUNCATE TABLE、DROP TABLE或DROP DATABASE命令误删数据的情况,无法通过Flashback来恢复数据。 需要注意的是,恢复误删数据库的方法需要在误删除后尽快采取行动,以免被覆盖或其他操作导致无法恢复。同时,要确保在恢复过程中遵循正确的步骤和安全措施,以防止进一步的数据损失。 引用中提到了使用Flashback来恢复使用DELETE命令删除数据行,但无法恢复使用TRUNCATE TABLE、DROP TABLE或DROP DATABASE命令删除数据。引用中指出,使用mysqlbinlog方法恢复数据可能不够快,并且无法指定只恢复一个表的操作。 因此,根据引用的信息,对于MySQL删除数据库的恢复,可以使用备份、二进制日志和Flashback等方法来进行恢复操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [31误删数据后除了跑路,还能怎么办?](https://blog.csdn.net/sdaujsj1/article/details/114561607)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值