前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >删库了,我们一定要跑路吗?

删库了,我们一定要跑路吗?

原创
作者头像
平头哥的技术博文
修改于 2020-02-27 06:32:01
修改于 2020-02-27 06:32:01
7010
举报

在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。

mysql 数据库中,我们知道 binlog 日志记录了我们对数据库的所有操作,所以 binlog 日志就是我们自救的利器。

接下来就来开启程序员自救之路。

想要自救成功,binlog 这把利器一定要好,在自己之前,我们一定要确定我们有 binlog 这把利器,以下就是确保有 binlog 利器的操作。

1、确认数据库是否开启 binlog 日志

代码语言:txt
AI代码解释
复制
show variables like 'log_%';
查看binlog日志是否开启.png
查看binlog日志是否开启.png

查看红色圈出来的地方,如果为 ON 则表示开启,否则未开启。没有开启的话,就需要做以下操作。

2、开启 binlog 日志

如果未开启 binlog 日志的话,就需要开启 binlog 日志,在 MySQL 的配置文件中设置,如果你的是windowns 电脑则找到 my.ini 文件,unix 系统找到 my.cnf文件。在文件中修改或者配置如下参数:

代码语言:txt
AI代码解释
复制
# Binary Logging.
#日志文件的名字及存储路径
log-bin=D:\Mysql-binlog\mysql-bin
#设置日志格式
binlog-format=mixed

其中 binlog-format 有三种选项:

  • STATMENT:每一条会修改数据的 SQL 语句会记录在 binlog 中。
  • ROW:不记录每一条 SQL语句的上下文信息,仅记录哪条记录被修改。
  • MIXED:以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的 SQL 语句选择日志保存方式。

3、重启 MySQL 服务器

4、再次确认 binlog 日志开启成功。

好了,操作完上面几步之后,我们就可以学习如何自救了,我们使用三个场景来分别演示误删数据、误删表、误删库的情况下如何自救。

在进入具体的场景前,我们先来准备演示需要的数据库、表和数据。

1、创建数据库**pingtouge**

代码语言:txt
AI代码解释
复制
create database pingtouge;

2、创建 student 表

代码语言:txt
AI代码解释
复制
create table student(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(100) NOT NULL,
   num VARCHAR(40) NOT NULL,
   PRIMARY KEY (id )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、插入数据

代码语言:txt
AI代码解释
复制
insert into student(name,num)values('张三','1234');
insert into student(name,num)values('李四','1235');

有了数据之后,可以正式进入场景了, are you ready?

场景一:误删了某条数据

一不小心将 student 表中 id=1 的数据删除了。该怎么办?

凭着记忆手动插入这条数据吗?好像也不是不可以哇,能记住的都是天才,利用 binlog 日志才是王道。

使用 show master status命令,查看最新的 binlog 日志文件

查看最新的binlog日志.png
查看最新的binlog日志.png

获取到最新的 binlog 日志文件后,使用 show binlog events in 'mysql-bin.000043';命令查看 binlog 日志文件,如下图所示:

恢复删除id等于1的数据.png
恢复删除id等于1的数据.png

binlog 日志记录了我们对数据库的所有操作,包括语句提交前和提交后的偏移量,在数据恢复时会使用到这两个偏移量。

在正式进入数据恢复之前,我们先来认识 MySQL 提供的一个工具:mysqlbinlog 。mysqlbinlog 是用来操作 binlog 日志文件,我们数据恢复就需要使用到它。

使用 mysqlbinlog 来恢复二进制日志文件,命令格式为:

代码语言:txt
AI代码解释
复制
 mysqlbinlog binlog日志文件 --start-position 初始偏移量的位置 --stop-position 结束偏移量的位置 | mysql -u root -p 数据库名称;

我们在 binlog 日志文件中找到 student 表中 id=1 这条数据在删除之前的最后一次操作的起始偏移量和结束偏移量,在上图中,我已经标出,起始偏移量为:710,结束偏移量为:996。有了这两个参数之后,我们就可以使用 mysqlbinlog 命令来恢复数据了。

执行:

代码语言:txt
AI代码解释
复制
 mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 710 --stop-position 996 | mysql -u root -p pingtouge;

如果命令执行成功的话,再次执行 select * from student命令,查看数据是否恢复。

恢复数据id=1.png
恢复数据id=1.png

从上图中,可以看出,我们成功的恢复了 student 表中 id=1 的这条数据。

场景二:误删了数据表

又是一不小心把表 student 给删除了。

删除 student 表.png
删除 student 表.png

对于误删表,同样可以使用 binlog 日志来恢复,毕竟 binlog 日记记录的是我们对 MySQL 的所有操作,跟恢复单条数据一样,我们同样需要在 binlog 日志文件中查找到起始偏移量和结束偏移量,用来恢复数据。

与单条数据不一样的是,对于表的偏移量,起始偏移量是创建表之前的开始偏移量,结束偏移量是删除数据库之前的最后一个结束偏移量。 如下图示:

创建student表的开始偏移量.png
创建student表的开始偏移量.png
删除表之前的最后一个偏移量.png
删除表之前的最后一个偏移量.png

一张图截不全,我就分两张图了。同样我们使用 mysqlbinlog 来恢复 student 表,执行:

代码语言:txt
AI代码解释
复制
 mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 393 --stop-position 1997 | mysql -u root -p pingtouge

命令执行完成后,再次执行 select * from student;,你会发现我们的数据都回来了。

场景三:误删了数据库

你在工作中受气了,准备删库跑路啦,于是你就把pingtouge数据库给删除了,删完之后你就后悔了,怎么办?在线等。

删除 pingtouge 数据库.png
删除 pingtouge 数据库.png

不要慌,万能的 binlog 日志可以救你,跟前面两种场景一样,还是在 binlog 日志中查询到需要恢复数据库的起始偏移量和结束偏移量。这里我就不截图了。

通过查看 binlog 日志发现创建数据库pingtouge的开始偏移量为 219,删库之前的最后偏移量为 3861,有了这两个偏移量之后,执行:

代码语言:txt
AI代码解释
复制
mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 219 --stop-position 3861 | mysql -u root -p

需要注意的是最后不需要带上数据库,执行完之后,发现与数据库pingtouge相关的数据全部都回来了。

删库了,我们不一定需要跑路,一定要学习自救,少年。

以上就是今天分享的内容,希望对您的学习或者工作有所帮助,如果您觉得文章不错,欢迎点个赞和转发,谢谢。

最后

目前互联网上很多大佬都有 MySQL数据库相关文章,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

原文发布于微信公众号 -互联网平头哥(id:pingtouge_java)

作者:平头哥,学会伺机而动,实现弯道超车

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜!
我们常常听人说,只要你愿意,MySQL 可以恢复至半个月甚至一个月以内的任何一个状态。网上也有很多删库跑路的段子。。。
江南一点雨
2022/01/24
4040
手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜!
怎么避免从删库到跑路 -- 详解 mysql binlog 的配置与使用
使用数据库的时候,我们每个操作都十分小心,尤其是不能直接在数据库上执行 update、delete 等操作,否则万一忘记加全 where 条件,可能就会造成无法挽回的结果。 有一句十分流行的调侃 — “从删库到跑路”就很形象的说明了误操作后的结果,那么如果你真的不小心执行了删库操作,真的就无法挽回了吗? 当然不会了,通常对于线上数据库,我们都会定时冷备,dump 导出数据库的全量备份,并且保留一段时间内的所有修改日志,进而实现在必要时回滚到这段时间内的任何一秒。 这里提到的“日志”指的就是 binlog,那么究竟什么是 binlog 呢?本文我们就来详细介绍一下。
用户3147702
2022/06/27
8080
怎么避免从删库到跑路 -- 详解 mysql binlog 的配置与使用
如何删库跑路?教你使用Binlog日志恢复误删的MySQL数据
开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解到:
Rude3Knife的公众号
2020/01/16
2.2K0
如何删库跑路?教你使用Binlog日志恢复误删的MySQL数据
删库不跑路!我含泪写下了 MySQL 数据恢复大法…
点击关注公众号,Java干货及时送达 作者:程淇铭 来源:segmentfault.com/a/1190000020116271 日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。 相关文章 MySQL备份策略:https://segmentfault.com/a/1190000019955399 MySQL数据恢复:https://segmentfault.com/a/1190000020116271 1 前言 数据恢
Java技术栈
2022/03/18
6600
删库跑路不怕,用mysqldump和mysqlbinlog进行数据恢复
1.创建douyin数据库、tbl_douyin_author数据库表、插入测试数据。
用户2032165
2019/05/07
7620
删库跑路不怕,用mysqldump和mysqlbinlog进行数据恢复
删库不跑路:论MySQL数据恢复
日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA。
JavaFish
2020/07/21
1.6K0
MySQL数据误删以后不要跑路
Flashback恢复数据的原理是通过修改binlog内容,拿回原库进行回放,前提是binlog_format=row和binlog_row_image=FULL。
shysh95
2022/04/07
6710
图文结合带你搞懂MySQL日志之Binary log(二进制日志)
binlog可以说是MySQL中比较重要的日志了,在日常开发及运维过程中,经常会遇到。
GreatSQL社区
2023/08/11
5.5K0
图文结合带你搞懂MySQL日志之Binary log(二进制日志)
mysql数据恢复 转
binlog 基本认识     MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
wuweixiang
2018/12/24
3K0
当删库时如何避免跑路
删库跑路也是个老梗了,可见在运维数据库的过程中误删除数据,或者开发的代码有bug,造成数据的误删除屡见不鲜。不过现在也有许多用于恢复或预防误删除的方案,例如SQL管理系统,将要执行的SQL先交由管理员审核,然后由管理员备份一个镜像数据库,在镜像上执行该SQL,并在执行后还原镜像。这样经过层层把关就可以大大减小出现误操作的几率。
端碗吹水
2020/09/23
1.1K0
当删库时如何避免跑路
京东到家程序员删库跑路 ! 讲一讲 MySQL 数据备份杀手锏 binlog
网上也经常看到一些段子,某公司程序员对工作不满,删库跑路,老板损失惨重,欲哭无泪。这不最近又爆出一例,京东到家程序员离职当天删库跑路!
微观技术
2022/04/06
3660
京东到家程序员删库跑路 ! 讲一讲 MySQL 数据备份杀手锏  binlog
MySQL数据被误删怎么办?
很多年前,被公司外派到一家单位驻场开发一个OA项目,两个开发对接各部门的需求,需求还要及时生效(一边开发一边使用)。
王二蛋
2024/01/30
5700
Mysql资料 Binlog(下)
注意: –>binlog是二进制文件,普通文件查看器cat、more、vim等都无法打开,必须使用自带的mysqlbinlog命令查看 –>binlog日志与数据库文件在同目录中 –>在MySQL5.5以下版本使用mysqlbinlog命令时如果报错,就加上 “–no-defaults”选项
陈不成i
2021/06/11
1.6K0
聊聊基于docker部署的mysql如何进行数据恢复
偶然的机会朋友说他部门的数据库误删了,想恢复回来,他百度了一些资料,也跟着试了。但发现会报一些错,于是他就找我帮忙看一下。对于我来说,因为公司的数据库都是DBA在管控,平时都没机会操作,基本上都停留在理论上。
lyb-geek
2022/05/31
1.8K0
聊聊基于docker部署的mysql如何进行数据恢复
Mysql备份与还原——mysqldump结合binlog
MySQL 备份一般采取全库备份加日志备份的方式,例如每天执行一次全备份,每小时执行一次二进制日志备份。这样在 MySQL 故障后可以使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任意位置或时间。
L宝宝聊IT
2018/09/29
6K0
Mysql备份与还原——mysqldump结合binlog
服务器被黑,MySQL 数据库遭比特币勒索!该如何恢复?
​大纲 1.经过 2.追查 3.恢复数据库 4.安全设置 5.总结
PHP开发工程师
2021/04/22
11.6K0
服务器被黑,MySQL 数据库遭比特币勒索!该如何恢复?
聊聊基于docker部署的mysql如何进行数据恢复
偶然的机会朋友说他部门的数据库误删了,想恢复回来,他百度了一些资料,也跟着试了。但发现会报一些错,于是他就找我帮忙看一下。对于我来说,因为公司的数据库都是DBA在管控,平时都没机会操作,基本上都停留在理论上。
lyb-geek
2022/06/07
2.5K0
聊聊基于docker部署的mysql如何进行数据恢复
【MySQL】删库别着急跑路(三)--binlog2sql闪回工具的使用
再说binlog2sql闪回工具之前,我们先聊下binlog。Binlog记录了MySQL数据库所有的DDL和DML操作。它在MySQL数据库里起着至关重要的作用。
MySQL数据库技术栈
2020/08/05
6650
【MySQL】删库别着急跑路(三)--binlog2sql闪回工具的使用
Mysql之binlog日志说明及利用binlog日志恢复数据操作记录
众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的binlog日志操作解说: 一、初步了解binlog MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。 ---------
洗尽了浮华
2018/01/22
3K0
Mysql通过binlog恢复数据
前提要开启binlog日志 用到的sql脚本 drop database if exists demo; create database demo; use demo; drop table if exists rumenz; create table rumenz(id int,name varchar(30)); insert into rumenz(id,name) values(1,'qaz'); insert into rumenz(id,name) values(2,'qaz'); inser
入门笔记
2022/06/02
7610
Mysql通过binlog恢复数据
推荐阅读
相关推荐
手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档