MySQL binlog 数据恢复
不求人,MySQL Binlog数据恢复
文章目录
- 不求人,MySQL Binlog数据恢复
- 浅谈恢复形式
- 开启 binlog 及配置
- 删库跑路(搭建测试数据库,然后删除它)
- 起死回生(分析binlog,然后恢复数据)
- 再显神通(根据时间恢复数据)
- 永久封印(定时备份,防止老6偷家)
浅谈恢复形式
本地模拟一次数据恢复。在说数据恢复之前,先说一下数据恢复的过程,防止有些童鞋带有偏见,一直以为数据恢复就像是我们编辑文档 Ctrl+Z
撤回操作一样,至少我在刚开始接触数据恢复就是这样以为的。实际上不是这样的。
准确的来说,在开启 binlog
之后,mysql 会记录此后的每一步操作,就像是日志一样
创建库 > 创建表 > 插入数据 > 删库 > 跑路
binlog
会依次记录在小本本上,等到发现有人删库跑步之后,就对其进行恢复操作,而恢复的步骤,不是 ctrl+z 形式的回滚,而是找到开始点和结束点,就比如上面的例子,我们只要找到 创建库 到 插入数据那一段的日志,然后重新执行一遍。
创建库 > 创建表 > 插入数据
这样数据就能恢复回来,那既然如此,他能存多少天,具体恢复的步骤又是如何呢?
咱们下回揭晓!!!
开个玩笑
开启 binlog 及配置
在我们学习使用 mysql 的 binlog 日志之前,我们要先打开 binlog
使用 root 权限登录 MySQL
我这里是
8.0.23
版本的MySQL ,使用的是 DBeaver 数据库链接工具
show variables like '%log_bin%';
如果你查询出来的 log_bin 不是和我一样,找到 MySQL 的配置文件
这里解释一下
- server-id = 1(单个节点id)
- log-bin= /var/lib/mysql/mysql-bin(位置一般和mysql库文件所在位置一样)
- expire_logs_days = 10(表示此日志保存时间为10天)
配置完成后,重启 MySQL,再次查询就可以看到 binlog 为 ON 状态啦
binlog日志包含两类文件
- 第一个是二进制索引文件,后缀名为
.index
- 第二个为日志文件,后缀为
00000*
,这个是记录数据库所有 DDL 和 DML (除了查询语句select)语句事件
可以通过
show master logs;
查看所有 binlog 日志文件列表
那一个文件能存多少呢,存太多了,会不会撑着了呢!mysql 为我们想好了,所以你可以看到上图,有 00001、00002 这样的文件
show master status;
查看最后一个 binlog 日志的编号名称及最后一个操作事件pos结束点,说的直白一点,每一个操作都会有一个 position
操作点。他可以理解为操作的流水ID 是唯一的而且是逐渐增长的
如果我们觉得一个这个文件有点撑着了,可以执行
Flush logs
这里我执行了5遍,再查看,就有5个文件了。除了我们自己手动执行之外,每次重启 mysqld 服务时,都会自动刷新 binlog 日志,mysqldump 备份数据,如果加 -F 选项也会刷新 binlog 日志
删的时候,执行 :
reset master;
删完之后,只会保留初始的那个 binlog.00001
这些文件都是真实存在于服务器磁盘中的,我们直接通过 vi
、cat
命令去查看是看不出个什么玩意儿出来的
要想搞懂里面写了个啥,可以通过这个sql查看
show binlog events in 'binlog.000001';
上面说了 pos 的作用,我们也可以指定从 Pos 125 开始查起
他也支持 limit
用法,这个我就不过多解释了
show binlog events in 'binlog.000001' from 125 limit 2,4
好,知道了日志文件在什么地方,知道了怎么看历史记录。我们来准备删库吧!!!
删库跑路(搭建测试数据库,然后删除它)
不是让你真去 drop
掉生产环境上的表,你要这样干,可别说是我教的,我教不出这么傻的徒弟来。
我们自己创建一个数据库玩玩吧。
创建库之前,先清一下所有历史日志,方便我们后续的查找
reset master;
初始化一个 binlog_test
数据库,创建一张 user
表,并插入四条数据
create database binlog_test;
use binlog_test;
create table user(
id varchar(255),
name varchar(255),
passwd varchar(255)
);
insert into user values ('1','小明','123456');
insert into user values ('2','小张','111111');
insert into user values ('3','小李','999999');
insert into user values ('4','小虎','123456');
好!
二话不说,带着满腔热情,咱们就直接就给他 drop 掉
drop table user;
再来查询,表已经无了
搁以前,咱们 drop
表的时候,内心十分畏惧,生怕再也找不回来了,不要怕!咱们现在给他变回来!
哦,麻里麻里哄!
起死回生(分析binlog,然后恢复数据)
首先,查询 binlog 列表
show master logs;
再查询一下 binlog 具体的日志
show binlog events in 'binlog.000001';
看到这满屏的日志,是不是内心就不慌了
我们来解读一下
通过上面的分析,我们可以知道
- Pos 235 创建数据库 binlog_test
- Pos 443 创建 user 表
- Pos 844 - 2021(这里取 commit 结束)插入4条数据
- Pos 2098 最后删掉了 user 表
我们要恢复 user
表的数据,那就要从 创建user
表到插入4条数据这一块来恢复 ,选取 443 - 2021
请看如下语句
mysqlbinlog --start-position=443 --stop-position=2021 --database=binlog_test binlog.000001 | mysql -uroot -proot
注意,这个语句是一个 shell 脚本,可不是让在 sql 对话框执行的。
- 因为命令涉及到
binlog.000001
文件,所以要到这个文件下去执行,或者你在命令里补齐全路径 - 此外当前用户还需要 mysqlbinlog 的执行权限
|
管道符后面接mysql 的登录命令,所以需要输入密码
再去查询 select * from user
数据就回来了,就是这么 so easy
再显神通(根据时间恢复数据)
那有同学就说了,我就记的我昨天晚上不小心敲错了几个字母,昨天晚上到现在又有好多人执行了好多写入操作,这咋找呀!
mysql 统统都想到了,既然知晓时间概念,那我们就从时间的维度来进行分析
为了方便理解,我们还是用 binlog.00001 这个文件来操作,既然不能直接读取,我们用 mysqlbinlog 给他转换成可读文件!
mysqlbinlog --base64-output=decode-rows -v binlog.000001 --result-file=/Users/xiang/Desktop/binlog.000001.sql
然后我们就得到了这样一个文件
大家注意到没有,这里有时间信息,pos 信息,还有具体操作的日志文件,只能说比 show binlog events in 'binlog.000001';
更详细有没有!
老样子,你可以根据你自己的回忆评估大致的时间,也可以查看这个文件,找到具体的时间
这里我们找到:
#220915 14:20:29 创建表
#220915 14:22:49 插入最后一条记录先执行一遍 drop table,你甚至可以多执行几遍,确认给他drop
干净了
再执行
mysqlbinlog --start-datetime="2022-09-15 14:20:29" --stop-datetime="2022-09-15 14:22:49" --database=binlog_test binlog.000001 | mysql -uroot -proot
select * from user
它又神奇的回到了你的面前。
永久封印(定时备份,防止老6偷家)
既然我们清楚了他的恢复逻辑,只要我们定时对数据库进行 binlog 备份
打个比方,每隔1个小时 Flush logs;
一次,生成一个新的 binlog 文件。假设有一天,有老6偷了家,我们可以找到所有的 binlog,然后依次执行到被偷家的前一个小时。虽然保不住那最后1个小时的数据,但是,好比啥都没了要强,您说是吧!!
MySQL binlog 数据恢复相关推荐
- Mysql binlog数据恢复(使用mysqlbinlog_flashback逆向生成SQL语句)
这里有个建议,由于mysql默认是不开启binlog的,如果是线上数据库,或者比较重要的数据库,建议还是将binlog开启,而且格式设为ROW类型的. 防止出现问题时,也有恢复的退路,养成定期备份数据 ...
- mysql binlog update_mysql binlog 简单介绍与基于binlog数据恢复
mysql binlog 简单介绍与基于binlog数据恢复 通过备份文件恢复 binlog(本节重点) binlog 二进制日志文件 show variables like 'log_bin'; 二 ...
- log解析工具 px4_详解MySQL Binlog解析工具--binlog2sql,基于表级别的数据恢复
概述 最近碰到某个表需要做数据回退,如果回退整个数据库动作又太大,所以用了binlog2sql来实现,这里先介绍一下binlog2sql的相关内容. binlog2sql是一个开源的Python开发的 ...
- MySQL通过binlog数据恢复
MySQL数据恢复 binlog的作用 修改类型恢复 删除类型恢复 insert类型恢复 删库跑路-彻底删除 删库一时爽,事后火葬场 2020年微盟删库事件 2018年杭州 2017年北京 恢复数据也 ...
- Mysql binlog日志及binlog恢复数据库操作
初识MySQL 日志binlog MySQL重要log,二进制日志文件,记录所有DDL和DML语句(除select),事件形式记录,包含语句所执行的消耗时间,事务安全型. DDL(数据库定义语言),主 ...
- Mysql binlog应用场景与原理深度剖析
1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他M ...
- 阿里云rds mysql数据库数据恢复到ecs中
背景: aliyun上的rds数据库快满了,于是删除了某个备份的表 后面大boss说是有用的表,需要恢复回来,阿里云有7天内的物理全量备份(通过percona-xtrabackup备份的) 第一时间应 ...
- MySQL bin-log 日志清理方式
MySQL bin-log 作用 1.数据恢复:如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失. 2.主从服务器之间同步数据:主服务 ...
- 好文推荐 | MySQL binlog应用场景与原理深度剖析
作者:田守枝 来自:田守枝的博客(公众号) 本文深入介绍Mysql Binlog的应用场景,以及如何与MQ.elasticsearch.redis等组件的保持数据最终一致.最后通过案例深入分析binl ...
最新文章
- EIGRP和传统的距离矢量路由协议的区别
- MVC5 + EF6 入门完整教程
- 特老的文章:三层应该怎么划分。不知大家还有用否
- 基于java springboot+mybatis学生学科竞赛管理管理系统设计和实现
- js 读取excel 导入mysql_可以读取EXCEL文件的js代码
- js判断网页标题包含某字符串则替换
- href 和 src 区别
- 微信小程序地图组件去除iconPath
- 个人网盘搭建过程--资料来自腾讯云实验室
- java 数学公式编辑器_妈妈再也不用担心我的公式写不出来了:一款公式输入神器实测...
- 如何在matplotlib中使用新罗马字体
- 黑客必会之——Windows入侵痕迹清理--你学会了吗?
- 给UIButton设置不同状态下的背景色
- JAVA代码实现人物照片的人像分割 | 百度AI
- Linux之命令改ip
- 使用Wechaty实现微信机器人操作
- 如何运行单个.vue文件
- 知乎百万热议:程序员如何做到年薪 50 万?
- POJ 1737 Connected Graph(组合)
- 【EI快速稳定检索】第三届IEEE信息与计算机前沿技术国际学术会议(ICFTIC 2021)
热门文章
- python 如何封装dll_Python的扩展接口[2] - 动态链接库DLL[0] - 动态链接库及辅助工具...
- 1709. 访问日期之间最大的空档期(SQL)
- java将文件夹压缩成压缩包
- 惠普 Compaq 510 一些难找到的驱动
- python3 json解析_Python3 JSON 数据解析
- Netty详解(持续更新中)
- node.js的zip压缩包版安装【win10专业版】
- 武大计算机系自招,武汉大学自主招生考试模式及武大2017自招考试试题
- TCP两次挥手,你见过吗?那四次握手呢?
- 苹果cms百度自动推送链接提交