-- 8.1 利用官方mysqlbinlog 闪回批量误删除操作
binlog_format=row
create table itpuxfg2 (
`id` int(10) unsigned not null auto_increment,
`name` varchar(16) not null,
`sex` enum('m','w') not null default 'm',
`age` tinyint(3) unsigned not null,
primary key (`id`)
) engine=innodb default charset=utf8;
insert into itpux.itpuxfg2(`name`,`sex`,`age`) values
('itpux1','w',21),
('itpux2','m',22),
('itpux3','w',23),
('itpux4','m',24),
('itpux5','w',25);
commit;
select * from itpux.itpuxfg2;
今天上午误操作:
delete from itpuxfg2 where id=2; -- 想象很美好。
delete from itpuxfg2; -- 现实很骨感。
commit; -- 完了。发现弄错了
select * from itpux.itpuxfg2;
开始恢复,生产高峰:锁表 防止数据继续读入表中
lock tables itpuxfg2 read;
show master status; -- 00001:1465
show binlog events in 'itpuxdb-binlog.000001'; 1153-1465
mysqlbinlog --base64-output=decode-rows -v -v itpuxdb-binlog.000001
mysqlbinlog --base64-output=decode-rows -v -v itpuxdb-binlog.000001 |sed -n '/### DELETE FROM `itpux`.`itpuxfg2`/,/COMMIT/p' > itpuxfg2.txt
--修改 语句 delete - insert
cat itpuxfg2.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@4.*),/\1;/g' | sed 's/@[1-9]=//g' > recover_itpuxfg2.sql
然后解锁表:
unlock tables;
替换recover_itpuxfg2.sql,记得加上commit;
lock tables itpuxfg2 write;
......
commit;
unlock tables;
source recover_itpuxfg2.sql
mysql> select * from itpuxfg2;
-- 8.2 利用第三方mysqlbinlog 闪回误删除的表
通过mysqlbinlog_flashback 闪回,选项-B
-B, --flashback Flashback data to start_postition or start_datetime.
create table itpuxfg3 (
`id` int(10) unsigned not null auto_increment,
`name` varchar(16) not null,
`sex` enum('m','w') not null default 'm',
`age` tinyint(3) unsigned not null,
primary key (`id`)
) engine=innodb default charset=utf8;
insert into itpux.itpuxfg3(`name`,`sex`,`age`) values
('itpux1','w',21),
('itpux2','m',22),
('itpux3','w',23),
('itpux4','m',24),
('itpux5','w',25);
commit;
误操作:(连错数据库,以为这是测试库,结果把生产这张表做很多增删表)
insert into itpux.itpuxfg3(`name`,`sex`,`age`)
values('itpux100','w',25);
commit;
update itpuxfg3 set name='itpux04' where id=4;
commit;
delete from itpuxfg3 where id=3;
commit;
发现问题:发现边生产库了,把生产的表变干掉了。
恢复过程:
lock tables itpuxfg3 read;
show master logs;
show master status; -- 00003.2157
show binlog events in 'itpuxdb-binlog.000003'; 1153-2157
(自己的)show master status; -- 00001.2101
show binlog events in 'itpuxdb-binlog.000001'; 1097-2101
通过mysqlbinlog_flashback 闪回,选项-B
-B, --flashback Flashback data to start_postition or start_datetime.
create table itpuxfg3 (
`id` int(10) unsigned not null auto_increment,
`name` varchar(16) not null,
`sex` enum('m','w') not null default 'm',
`age` tinyint(3) unsigned not null,
primary key (`id`)
) engine=innodb default charset=utf8;
insert into itpux.itpuxfg3(`name`,`sex`,`age`) values
('itpux1','w',21),
('itpux2','m',22),
('itpux3','w',23),
('itpux4','m',24),
('itpux5','w',25);
commit;
误操作:(连错数据库,以为这是测试库,结果把生产这张表做很多增删表)
insert into itpux.itpuxfg3(`name`,`sex`,`age`)
values('itpux100','w',25);
commit;
update itpuxfg3 set name='itpux04' where id=4;
commit;
delete from itpuxfg3 where id=3;
commit;
发现问题:发现边生产库了,把生产的表变干掉了。
恢复过程:
lock tables itpuxfg3 read;
show master logs;
show master status; -- 00001.2101
show binlog events in 'itpuxdb-binlog.000001'; 1097-2101
/mysql/mysqlbinlog_flashback -v -v --start-position=1097 --stop-position=2101 itpuxdb-binlog.000001
/mysql/mysqlbinlog_flashback -B -v -v --start-position=1097 --stop-position=2101 itpuxdb-binlog.000001
unlock tables;
回滚:
/mysql/mysqlbinlog_flashback -B -v -v --start-position=1153 --stop-position=2157 itpuxdb-binlog.000003 > mysql.sql
修改文件:itpuxfg3.sql +commit
登录mysql
source mysql.sql
检查:
select * from itpuxfg3;
-- 8.3 利用开源binlog2sql 闪回误删除的表
使用前提:binglog_format=row,binlog_row_image=full
外网安装:https://github.com/danfengcao/binlog2sql
内网安装:按博客安装:binlog2sql-fg.zip(https://blog.csdn.net/ichglauben/article/details/81429107)
create table itpuxfg4 (
`id` int(10) unsigned not null auto_increment,
`name` varchar(16) not null,
`sex` enum('m','w') not null default 'm',
`age` tinyint(3) unsigned not null,
primary key (`id`)
) engine=innodb default charset=utf8;
insert into itpux.itpuxfg4(`name`,`sex`,`age`) values
('itpux1','w',21),
('itpux2','m',22),
('itpux3','w',23),
('itpux4','m',24),
('itpux5','w',25);
commit;
select now(); --2018-08-05 10:32:36
误操作:
delete from itpuxfg4;
commit;
select * from itpuxfg4;
恢复:
show master status; -- itpuxdb-binlog.000003:4199
show master status; -- itpuxdb-binlog.000001:3356
select now(); -- 2018-08-05 10:33:30
show binlog events in 'itpuxdb-binlog.000001'\G; 2540-3356
-- 先查找已经被删除的数据:
方法2:按日志位置:
binlog2sql -h192.168.0.104 -P3306 -uroot -proot -ditpux -t itpuxfg4 --start-file='itpuxdb-binlog.000001' --stop-file='itpuxdb-binlog.000001' --start-position=2979 --stop-position=3386
[root@mysqldb mysql]# binlog2sql -h192.168.0.104 -P3306 -uroot -proot -ditpux -t itpuxfg4 --start-file='itpuxdb-binlog.000001' --stop-file='itpuxdb-binlog.000001' --start-position=2979 --stop-position=3386 --flashback > itpux.sql