作者 | 平头哥的技术博文

责编 | 唐小引

头图 | CSDN 下载自东方 IC

出品 | CSDN 博客

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

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

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

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

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

show variables like 'log_%';

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

2、开启 binlog 日志

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

# 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

create database pingtouge;

2、创建 student 表

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、插入数据

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 日志文件后,使用 show binlog events in 'mysql-bin.000043'; 命令查看 binlog 日志文件,如下图所示:

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

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

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

 mysqlbinlog binlog日志文件 --start-position 初始偏移量的位置 --stop-position 结束偏移量的位置 | mysql -u root -p 数据库名称;

mysqlbinlog binlog 日志文件 --start-position 初始偏移量的位置 --stop-position 结束偏移量的位置 | mysql -u root -p 数据库名称;

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

执行:

 mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 710 --stop-position 996 | mysql -u root -p pingtouge;

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

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

场景二:误删了数据表

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

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

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

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

 mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 393 --stop-position 1997 | mysql -u root -p pingtouge

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

场景三:误删了数据库

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

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

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

mysqlbinlog d:\Mysql-binlog\mysql-bin.000043 --start-position 219 --stop-position 3861 | mysql -u root -p

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

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

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

本文为 CSDN 博主「平头哥的技术博文」原创文章,CSDN 官方经授权发布。

原文地址:https://blog.csdn.net/z694644032/article/details/104463920

【End】

在中国企业与「远程办公」正面相遇满月之际,2月29日,CSDN 联合广大「远程办公」工具服务企业共同举办【抗击疫情,科技公司在行动】系列之【远程办公】专题线上峰会活动:中国「远程办公」大考
扫下方二维码免费报名直播+抽取奖品+与大牛交流

提前了解峰会详情,可加小助手微信csdnai,回复远程办公,进直播群

推荐阅读 

☞划重点!Android 11 首个开发者预览版新功能抢先看

☞Go 大败!Google 宣布 Fuchsia 终端开发只支持 C/C++/Dart

☞2020 无春招

☞新知识点!一文告诉你如何调试运行在Docker容器中的远程Node.js应用程序

☞2020 AI人才报告:每年74%人才需求增长,创业公司平均薪水约20万美元

☞DeFi中的De是什么意思?这对区块链行业意味着什么?

你点的每一个在看,我认真当成了喜欢

删库只能跑路?程序员自救宝典!| 原力计划相关推荐

  1. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复

    日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA. 相关文章 MySQL备份策略:https://segmentfa ...

  2. 从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库

    从删库到跑路,就是这么迅速!程序员为了报复同事删了公司数据库 一只有头发的程序猿 2019-08-23 09:38 做过互联网行业的都知道,数据库对公司是至关重要的,存储了大量的数据在里面,要是没有这 ...

  3. Linux 下谨慎使用 rm,避免从删库到跑路的悲剧发生

    我们该如何再次避免删库"跑路"等事件的再次发生? 对此,在企业首先做好权限管理以及多重审核机制的同时,CSDN 也曾教诸多程序员们如何在 Linux 下谨慎使用 rm,避免从删库到 ...

  4. mysql高级-15-数据库备份与恢复(删库不跑路)

    mysql高级 前言 1.物理备份与逻辑备份 2.mysqldump实现逻辑备份 2.1 备份一个数据库 2.2 备份全部数据库 2.3 备份部分数据库 2.4 备份部分表 2.5 备份单表的部分数据 ...

  5. MySQL从删库到跑路(5):in and not

     "哈哈哈哈,看你这几天没来上课,我还以为你去拜什么高人为师了?原来就是这个烂番薯.臭鸟蛋的小卖部大爷学装逼,你逗我玩呢?哈哈哈哈哈"  "哈哈哈哈,一个老屌丝,一个小屌 ...

  6. 手误【删库】 == 跑路,不存在的 ——删瓦辛格

    手误[删库] ==  跑路,不存在的  --删瓦辛格 前言 今天公司服务器的宝塔打不开,让我去修(ps:宝宝委屈) 打开找一下问题所在 问题: 发现是宝塔官方的cdn好像挂掉了 解决思路: (1)本地 ...

  7. MySQL从删库到跑路(2):大爷的SQL私房菜

    大爷的SQL私房菜 夜色如墨,月凉如水,一轮皎洁的圆月高高地挂在夜空之上,平日里鼾声如雷的室友今夜也停止了打鼾,如此静谧的夜晚,李有为却辗转难眠. 时间悄然来到凌晨一点半,他已经在窗边站了53分钟23 ...

  8. 告别从删库到跑路,linux回收站实现

    在linux 下操作时经常需要用到rm -rf,一招不慎轻者从删库到跑路,重者到跑路机会都没有.趁放假,试着结合实际生产环境,实现一下之前一直想的win回收站机制 实现思路 alias 给rm取别名, ...

  9. 删库不跑路,MySQL 数据库恢复教程

    在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回. 在 MySQL 数据库中,我们知道 binlog 日志记录了我们对数据库的所有操作,所 ...

最新文章

  1. 毕业仅1年,干Python赚了50W 网友:不是吹的
  2. 一份史上最全的深度学习资料,包括国内外顶尖学校课程以及顶会论文集
  3. 如何快速完成整理笔记?
  4. Java,C实现约瑟夫环,一元多项式运算器
  5. 设计素材|剪纸风新年春节烫金PSD分层模板,牛气!
  6. 【Java每日一题】20161019
  7. RabbitMQ的消息确认、消息持久化
  8. P3853 [TJOI2007]路标设置
  9. 数学建模经验分享及比赛时间汇总
  10. spring学习笔记 (6)使用mybatis操作数据库增删改查
  11. (三)基于PHP——复杂的WSDL的创建(WSDL篇)
  12. Cadence Allegro怎么从2层板添加层到4层板
  13. 字体图标在服务器上显示不出来,fontawesome图标字体库组件在服务器上显示不出来图标的解决...
  14. 展望未来~走向计算机之路
  15. 佐治亚理工学院计算机科学硕士,佐治亚理工学院
  16. 科普无穷小微积分是最大的知识共享项目
  17. 【Unity 22】 Unity 力,扭矩,刚体,触发器的简单使用
  18. 信用评分建模中样本容量不足怎么办
  19. KDJ指标详解包括什么kdj指标详解会发生钝化吗
  20. 省级面板数据(2000-2019)八:人民生活篇(城乡人均收入、支出、耐消品、住房)(stata版)

热门文章

  1. C#WebClient常见用法
  2. JS 实现 Tab标签切换功能
  3. 怎么用代码弹回 UITableView 中左滑出来的删除按钮
  4. opatch java.lang.OutOfMemoryError:Java heap space错误一例
  5. RedHat中squid简易配置
  6. csdn图片排版技巧
  7. linux本地时间与utc不一致_辽宁无新增 | 北京新增本地确诊病例31例,中高考时间目前不做调整...
  8. leetcode python3 简单题231. Power of Two
  9. leetcode python3 简单题101. Symmetric Tree
  10. Win10应用商店无法连接解决方案