mysql误删数据如何恢复

mysql误删数据如何恢复

   运维菜鸟     2021年3月23日 09:45     1901    

1.数据的误操作

updatedelete表的时候可能会出现失误的操作,比如update的时候或者delete的时候没有加where或者where后边跟的条件出错从而导致很多无关数据被更改。

或者drop掉了一个表,甚至drop掉了一个数据库,都有可能出现失误,所以在执行命令的会后一定要非常谨慎,但是毕竟会有失误的时候,我们如何去通过技术手段防患于未然,或者出现错误了,我们可以及时找回相应数据。

 

2.恢复方式

以上使用定期备份肯定是没有办法找回数据的,定期备份的前提就是允许丢失一定时间的数据。所以最新的数据肯定会丢失,这时候就可以用binlog日志的方式来防止这一阶段的数据的丢失。那么是否有了binlog日志就不需要去做全量的备份了呢。因为binlog的记载的数据量是比较大的,他会将插入的数据,之后又删除的数据都会记录,所以会执行很多没有用的语句,从而造成恢复过程效率低下。而在备份中肯定不会有这些无用的语句。其实这就是mysql的全量备份和增量备份的策略。

这里只说binlog日志恢复数据的方式。

 

3.binlog相关

1)查看binlog日志相关

show variables like '%log_bin%';

1.png

可以看到已经开启了binlog日志,以log_bin来命令

一些相关的可以看以下文章

Mysqlbinlog日志的启动和关闭

查看mysqlbin-log日志

清理binlog日志

 

2)刷新binlog日志

flush logs

这个命令会产生新的binlog日志,当然在重启数据库之后也会产生新的binlog日志文件。

 

4.恢复示例

这里的步骤是,创建数据库,插入数据,更新数据,删除表,删除数据库。

create database testdb;

create table player(name varchar(20) , age int);

INSERT INTO `testdb`.`player`(`name`, `age`) VALUES ('xiaoA', 14);

INSERT INTO `testdb`.`player`(`name`, `age`) VALUES ('xiaoB', 15);

INSERT INTO `testdb`.`player`(`name`, `age`) VALUES ('xiaoC', 16);

INSERT INTO `testdb`.`player`(`name`, `age`) VALUES ('xiaoD', 13);

这时我们误删了数据

DELETE FROM `testdb`.`player`;

现在恢复这些数据

查看binlog日志中的内容

2.png

show binlog events in 'log_bin.000001';

1)以pos节点恢复

参数

开始pos --start-position

结束pos --stop-position

可以看到出问题的地方是从1456—1609这个区间,所以我们只要恢复到1456即可。

并且库和表都存在所以没有必要从头开始恢复,只要从插入数据进行回复即可。也就是从428pos节点开始。

可以通过命令mysqlbinlog命令转换为sql文件

mysqlbinlog log_bin.000001 --start-position 428 --stop-position 1456 >> data.sql 

这样就产生了一个可执行的sql,查看data.sql文件。

恢复语句:mysql -u root -p testdb < data.sql

或者直接使用以下命令

mysqlbinlog log_bin.000001 --start-position 428 --stop-position 1456 | mysql -u root -p testdb

直接进行了恢复。

 

2)以时间节点恢复

参数就是

开始时间--start-datetime=

结束时间--stop-datetime=

示例:

mysqlbinlog log_bin.000001 --start-datetime=”2018-08-09 00:09:30” --stop-datetime=”2018-08-09 00:10:00” | mysql -u root -p testdb

 

相关文章:https://www.iteye.com/blog/flyer0126-2210993

 


文章评论

0

其他文章