首页 > 数据库 > MySQL > 利用binlog日志恢复mysql数据
1. 环境准备:
-- 创建数据库,创建表
create database ops;
create database ops1;
use ops;
CREATE TABLE member (
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,
classid char(6) DEFAULT NULL,
PRIMARY KEY (id)) ENGINE=InnoDB;
show tables;
use ops1;
CREATE TABLE member (
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,
classid char(6) DEFAULT NULL,
PRIMARY KEY (id)) ENGINE=InnoDB;
show tables;
--插入数据
use ops;
insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2');
use ops1;
insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2');
2. 场景模拟:
a. ops库进行一次全备份,记为时间t1
mysqldump -uroot -p -B -F -R -x --master-data=2 ops ops1|gzip >/u01/backup/ops_$(date +%F).sql.gz
b. 参数说明
-B: 指定数据库
-F: 刷新日志
-R: 备份存储过程等
-x: 锁表
--master-data: 在备份语句里添加change master语句以及binlog文件及位置点信息。
待到数据库备份完成,就不用担心数据丢失了,因为有完全备份数据,由于上面在全备份时使用了-F选项,当数据备份操作刚开始的时候系统就会自动刷新log,这样就会自动产生一个新的binlog日志,这个新的binlog日志就会用来记录备份之后的数据库‘增删改操作’。
可以用show master status;进行查询
3.insert 数据,记为时间t2
insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');
insert into ops1.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');

4. update数据,记为时间t3:
update ops.member set name='lisi' where id=4;
update ops1.member set name='lisi' where id=4;
update ops.member set name='xiaoer' where id=2;
update ops1.member set name='xiaoer' where id=2;

5.drop 数据库ops,ops1,创建ops2,记为时间t4:
drop database ops;
drop database ops1;
create database ops2;
CREATE TABLE member (
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,
classid char(6) DEFAULT NULL,
PRIMARY KEY (id))
ENGINE=InnoDB;
insert into ops2.member(`name`,`sex`,`age`,`classid`) values
('yiyi','w',20,'cls1'),
('xiaoer','m',22,'cls3'),
('zhangsan','w',21,'cls5'),
('lisi','m',20,'cls4'),
('wangwu','w',26,'cls6');
6. ops,ops1清除了:
先仔细查看最后一个binlog日志,并记录下关键的pos点,到底是那个pos点的操作导致了数据库的破坏(通常是最后几步);
a. 先备份最后一个binlog日志:

b. 执行一次刷新日志索引的操作,重新开始新的binlog日志记录文件。
flush logs;
show master status;

7. 使用mysqlbinlog 工具查看binlog的内容,查找数据破坏的位点:
a. 方法一: mysqlbinlog --no-defaults mysql-bin.000005
b. 方法二:登入服务器,show binlog events in 'mysql-bin.000005';
c. 方法三: show binlog events in 'mysql-bin.000005'\G;

造成ops库数据破坏的Pos点介于2172-2261之间,造成pos1库破坏的Pos区间是介于2326-2418之间,恢复相应pos点之前就可以了。
8.开始做恢复,先恢复时间点t1的数据:

ops,ops1两个库恢复回来了。

将数据恢复到2172这个位点,此时将数据恢复到了 t3时间点。
mysqlbinlog --no-defaults --stop-position=2172 mysql-bin.000005 | mysql -uroot -p
恢复完成后查看ops,ops1数据库的数据,可以看到是 t3时间点的数据。

9. drop ops2数据库,通过Binlog进行恢复:
创建ops2的pos点为2483,

mysqlbinlog --no-defaults --start-position=2483 mysql-bin.000005 | mysql -uroot -p
检查数据是否恢复:

参考文档:
https://www.cnblogs.com/Presley-lpc/p/9619571.html
https://www.cnblogs.com/tonnytangy/p/7779164.html
https://blog.csdn.net/weixin_40524659/article/details/105902881
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21374452/viewspace-2728060/ ,如需转载,请注明出处,否则将追究法律责任。