ITPub博客

首页 > 数据库 > MySQL > 利用binlog日志恢复mysql数据

利用binlog日志恢复mysql数据

原创 MySQL 作者:kakaxi9521 时间:2020-10-20 15:58:58 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: redis安装
请登录后发表评论 登录
全部评论

注册时间:2009-04-13

  • 博文量
    136
  • 访问量
    179046