轻松完成mysql误操作恢复

场景

当用户误操作对数据库的数据进行改动,此时操作的方式可以使用以下几种方式进行:

一、在有备份的情况下,通过mysqlbinlog方式对日志文件基于时间点恢复

二、通过binlog2sql方式对数据库进行数据回滚

第一种方式估计大家都比较熟悉,这里就不再重复,以下以介绍第二种操作方式为主。

恢复前提条件必须设置日志模式为row,曾几何时,一个朋友日志模式设置Statement,导致数据数据恢复失败。

以下就介绍binlog2sql数据回滚操作

相关软件安装

binlog2ql介绍

binlog2sql是一开源工具,其可以从MySQL binlog解析出你要的SQL。根据不同选项,你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。

主要用途如下:

(1)数据快速回滚(闪回)

(2)主从切换后数据不一致的修复

(3)从binlog生成标准SQL,带来的衍生功能

安装相应软件

1、去官方页面https://github.com/danfengcao/binlog2sql下载

2、安装setuptools-0.6c11.tar.gz、PyMySQL、mysql-replication等相应软件

数据误操作案例模拟

插入操作

INSERT INTO psb_warninglog VALUES ('12704', '82', '124', '2018-01-09 15:12:53', '2018-01-09 15:12:53', '2018-01-09 15:12:53',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12706', '82', '126', '2018-01-09 15:12:53', '2018-01-09 15:12:53', '2018-01-09 15:12:53',

null, null, '[测试] 服务器停止', '0', '2', 'vm 测试', 'vm 测试');

INSERT INTO psb_warninglog VALUES ('12708', '82', '124', '2018-01-09 15:25:43', '2018-01-09 15:25:43', '2018-01-09 15:25:43',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12710', '82', '124', '2018-01-09 15:18:01', '2018-01-09 15:18:01', '2018-01-09 15:18:01',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12712', '82', '126', '2018-01-09 15:18:01', '2018-01-09 15:18:01', '2018-01-09 15:18:01',

null, null, '[测试] 服务器停止', '0', '2', 'vm 测试', 'vm 测试');

INSERT INTO psb_warninglog VALUES ('12714', '82', '124', '2018-01-09 15:31:04', '2018-01-09 15:31:04', '2018-01-09 15:31:04',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12716', '82', '124', '2018-01-09 15:19:33', '2018-01-09 15:19:33', '2018-01-09 15:19:33',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12718', '82', '126', '2018-01-09 15:19:33', '2018-01-09 15:19:33', '2018-01-09 15:19:33',

null, null, '[测试] 服务器停止', '0', '2', 'vm 测试', 'vm 测试');

INSERT INTO psb_warninglog VALUES ('12720', '82', '124', '2018-01-09 15:21:14', '2018-01-09 15:21:14', '2018-01-09 15:21:14',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12722', '82', '126', '2018-01-09 15:21:14', '2018-01-09 15:21:14', '2018-01-09 15:21:14',

null, null, '[测试] 服务器停止', '0', '2', 'vm 测试', 'vm 测试');

INSERT INTO psb_warninglog VALUES ('12724', '82', '124', '2018-01-09 15:36:25', '2018-01-09 15:36:25', '2018-01-09 15:36:25',

null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12726', '82', '124', '2018-01-09 15:24:34', '2018-01-09 15:24:34', '2018-01-09 15:24:34', null, null, '[测试] 服务器停止', '0', '1', '测试', '测试');

INSERT INTO psb_warninglog VALUES ('12728', '82', '126', '2018-01-09 15:24:34', '2018-01-09 15:24:34', '2018-01-09 15:24:34',

null, null, '[测试] 服务器停止', '0', '2', 'vm 测试', 'vm 测试');

删除数据

delete from psb_warninglog where warninglog_id in (12704,12706,12708);

解析回滚SQL

python binlog2sql.py --flashback -h127.0.0.1 -P3306 -uroot -p'xxxx' -debs -t psb_warninglog --start-file='mysql-bin.000003' >psb_warninglog.undo

注:通过上面的命令能够快速找回delete操作的数据会转化成insert的语句

把delete操作部分转化能insert在数据库中执行

这里语句省略,请从psb_warninglog.undo文件中去找

总结

binlog2sql可以只针对特定表,不需要进行针对整库操作,只需要知道时间点就能快速恢复,而且其对数据库性能影响更小(相对恢复操作,针对全库)

大家多提提意见,分享分享更好的恢复手段,谢谢!

发表评论

发表评论

*

沙发空缺中,还不快抢~