大家有没有碰到过由于误操作把测试数据库的一张表给删除了,导致测试的数据都被删除了,然后手足无措,测试把你一定数落,顿时感觉自己要死了?今天就教你即使误删了也可以将删除的数据恢复,以后误删再也不用惊吓了。当然,实际操作中最好还是认真对待,小心操作。还有就是在大公司内,数据也不是你想删就能删掉的,有无数权限/备份阻拦着你,所以通常情况下你都不会有机会,但还是备着以防万一。

Binlog简述

MySql数据恢复主要依赖的是Binlog日志,在之前的文章中MYSQL专题-MySQL三大日志binlog、redo log和undo log也有讲过,大家有兴趣可以去看看,这里简单介绍一下:

  • binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志;
  • binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。

通过Binlog日志,我们解决以下的问题:

  • 恢复数据:(今天要说的重点);
  • 数据库复制:主从数据库是通过将binlog传给从库,从库有两个线程,一个I/O线程,一个SQL线程,I/O线程读取主库传过来的binlog内容并写入到relay log,SQL线程从relay log里面读取内容,写入从库的数据库;
  • 审计:用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击。

所以说,想要能够恢复数据,首先你得打开Mysql的binlog,在平常你自己安装的单机Mysql中,默认情况下不会开启。下面就一步步地实践下如何开启你服务器上的Binlog日志。

Binlog开启(Windows示范)

首先进入数据库控制台,运行指令:

可以看到我们的binlog是开启的(MySql8.0.21默认是开启的状态,8.0以后都是默认开启,加了反而会报错),如果你的是低版本的没有开启,输入 net stop mysql停止MySql,修改mysql的配置文件my.ini。添加如下配置:

# Binary Logging.
server_id=1(高版本,需要指定server-id,唯一就可以)
log-bin=mysql-bin
binlog-format=Row

输入 net start mysql重启mysql服务,然后再执行show variables like 'log_bin’就可以看到已经开启了,执行 show binary logs,发现有对应的binlog日志:

当然你也可以到对应的Mysql安装目录的data中进行查看:

如果想关闭binlog日志,低版本的直接去掉就行,自动默认的加入skip-log-bin,然后重启即可。需要说明的是,每当我们重启MySQL一次,会自动生成一个binlog文件。我们也可以手动的来刷新binlog文件,通过 flush logs,同样会新创建一个binlog文件。实际上当服务器在重启时,也会调用flush logs操作。

Binlog实操

首先新建数据库binLogTest,新建一张表tableLog1,SQL代码如下:

CREATE DATABASE `binLogTest` ;
USE `binLogTest`;
DROP TABLE IF EXISTS `tableLog1`;
CREATE TABLE `tableLog1` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后插入两条数据,分别是 (1,‘tom’),(2,‘jack’)

INSERT INTO `tableLog1` VALUES (1,'tom'),(2,'jack');

执行完成以后,我们再控制台使用show master status看以下binlog日志的状态:

可以看到,现在我们正在使用 binlog.0000004 ,并且这个文件现在正在记录到1207行。
然后,使用flush logs来主动刷新一次binlog,然后再次查看状态:

可以看到,现在日志文件在 binlog.000005 文件中,位置为156。也就是我们主动刷新了一次binlog,生成了新的binlog.000005,而binlog.000004则已经归档了,不会再写入新的日志进去了。
接下来我们再插入两条数据:

insert into 'tableLog1' values (3,'Lili'),(4,'Jim');

可以看到我们已经成功插入了4条数据:

我们再次flush logs,把binlog.000005日志存档,开启新的binlog.000006日志,这样,每次我们插入的数据彼此独立。实际情况下,binlog会比较复杂,这里也是做了简化,为了理解更方便。

然后我们删除id为4的数据,并且再次刷新binlog,如此一来,binlog.000006里面只有一条删除操作:

我们来好好观察下binlog.00005和binlog.00006两个binlog,使用命令:show binlog events in 'binlog.000005’和show binlog events in ‘binlog.000006’:

一条插入操作的完整日志如上面标注所示。我们的目的是恢复误删的数据,其实就是将binlog.000005日志的插入记录重演一遍,而不需要理会binlog.000006的操作(因为删除是一个误操作)。在实际的线上环境中,我们肯定需要将binlog导出后,仔细筛选出误操作,并将其排除,之后再运行binlog,这里为了方便演示直接进行。我们只做一个恢复两条插入语句的操作。
首先看到我们的数据库中的确是不存在id为4的记录。


然后我们执行以下语句:

mysqlbinlog --no-defaults binlog.000005 --start-position 156 --stop-position 470 | mysql -uroot -p binLogTest

需要说明的是,这里的语句执行不要在Mysql中执行,否则会报错:

应该在binlog所在地方再开一个执行窗口执行:

执行完成以后我们在看一下数据:

看到的确是恢复了数据,为什么会有两条id为3的数据,是因为我们执行的文件是插入id为3和4的binlog,大家可以依据自己数据的情况进行恢复,只要配置不同的起始位置即可:

--start-position:从二进制日志中读取指定position 事件位置作为开始
--stop-position:从二进制日志中读取指定position 事件位置作为事件截至

还有一点需要说明的,在最开始执行语句没有加入–no-defaults,导致出错:

大家加入即可。

看完binlog日志恢复数据的原理,希望大家以后在定期备份数据库的脚本里,也能够加上刷新binlog日志的命令,这样一旦某天丢失数据,可以将当天binlog数据单独拿出来还原,做到清晰可辨,也加快恢复效率。

猜你感兴趣
MYSQL专题-绝对实用的MYSQL优化总结
MYSQL专题-MySQL事务实现原理
MYSQL专题-MVCC多版本并发控制
MYSQL专题-MySQL三大日志binlog、redo log和undo log

更多文章请点击:更多…

MYSQL专题-使用Binlog日志恢复MySQL数据相关推荐

  1. mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法

    binlog日志简介: binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间. b ...

  2. 使用MySQL的binlog日志恢复误删数据

    使用binlog日志恢复误删数据 1.查看binlog是否开启并锁表 # 进入mysql mysql -uroot -proot#查看binlog是否开启 show variables like '% ...

  3. Mysql 如何通过binlog日志恢复数据

    一.起因: 由于误删数据,造成服务报错,经排查发现误删了一个表,造成数据不一致.但由于时间较近,范围不太确定,所以采用mysqlbinlog日志进行时间恢复. 二.恢复: 1.将前一天的mysql-b ...

  4. mysql日志恢复数据_Mysql 通过binlog日志恢复数据

    Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日 ...

  5. MySQL 之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  6. MySQL二进制binlog日志说明以及利用binlog日志恢复数据

    MySQL的binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全量备份+binlog日志恢复增量数据部分). 一.关于 ...

  7. binlog日志_【删库跑路】使用Binlog日志恢复误删的MySQL数据

    前言 "删库跑路"是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文, ...

  8. 【删库跑路】使用Binlog日志恢复误删的MySQL数据

    前言 "删库跑路"是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文, ...

  9. Mysql 通过 binlog日志 恢复数据(数据搞丢看过来)

    1.查看binlog是否开启 #查看binlog是否开启 show variables like '%log_bin%'; 2.锁表,防止数据被污染(可根据需求,不阻塞业务的情况) #锁表,防止数据被 ...

最新文章

  1. es分布式结构原理是什么?
  2. mysql中的主从复制slave-skip-errors参数使用方法
  3. Linux fork()一个进程内核态的变化
  4. react 组件与组件之间通讯
  5. PHP Mysql-创建数据表
  6. OpenCV中基本数据结构(7)_Vec
  7. Xcode7.0.1:升级Xcode7上传AppStore失败问题
  8. vscode 调试找不到对应的python模块(根本,简单,有效)
  9. 带薪休假,运维汪的春天来了?
  10. R for data science 之 stringr包
  11. Datatypes In SQLite Version 3
  12. 计算机二级c语言数组ppt,计算机二级C语言考试C语言学习第5讲.ppt
  13. 面试准备——mybatis相关
  14. 解决windows软件默认安装到C盘问题
  15. java作品_50幅惊艳的分形艺术作品
  16. 国庆头像生成器小程序源码
  17. halcon例程学习笔记(10)---图像灰度共生矩阵cooc_feature_image.hdev
  18. 小清新风格的微信公众号文章排版有这些素材就够了
  19. 元宇宙007 | 沉浸式家庭治疗,让治疗像演情景剧一样!
  20. 最最最详细的springboot项目中集成微信扫码登入功能.步骤代码超级详细(OAuth2)

热门文章

  1. [ARM异常]-SPIs(共享中断)routing到指定CPU的方法
  2. 2017年CISCN初赛
  3. JAVASE_File类(实践)——目录拷贝
  4. C/C++使用socket实现server和client
  5. windbg基本命令
  6. 【MySQL】记录 Navicat连接 docker mysql 容器,备份docker mysql 注意事项
  7. 将指定日期字符串转换为Calendar对象
  8. 【PAT乙级】1082 射击比赛 (20 分)
  9. linux 相册管理,图片管理(时间线、相册管理)- 深度看图 -Deepin深度系统用户手册...
  10. 蓝桥杯练习系统习题-算法提高1