利用binlog日志恢复mysql数据

来源:这里教程网 时间:2026-03-01 15:24:33 作者:

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库进行一次全备份,记为时间t1mysqldump -uroot -p -B -F -R -x --master-data=2 ops ops1|gzip >/u01/backup/ops_$(date +%F).sql.gzb. 参数说明-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.000005b. 方法二:登入服务器,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

相关推荐