MySQL 通过binlog 日志恢复数据-flashback 闪回(官方 | mysqlbinlog工具 | binlog2sql)

-- 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

猜你喜欢

转载自blog.csdn.net/ichglauben/article/details/81429001