写在前面

估计二狗子这几天是大姨夫来了,心情很郁闷,情绪也很低落,工作的时候也有点心不在焉。让他发个版本,结果,一行命令下去把线上的数据库删了!你没听错:是删掉了线上的数据库!运营那边顿时炸了锅:怎么回事?系统不能访问了!什么情况啊?!很多客户都在投诉了!!

尽管运营那边慌慌张张的不知所措,但是,我们作为技术人员还是要淡定,不就是删了数据库吗?没事,哥帮你搞定!

事件背景

  • MySQL数据库每日零点自动全备

  • 某天上午9点,二狗子不小心drop了一个数据库

  • 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢复

主要思想与原理

  • 利用全备的sql文件中记录的CHANGE MASTER语句,binlog文件及其位置点信息,找出binlog文件增量的部分

  • 用mysqlbinlog命令将上述的binlog文件导出为sql文件,并剔除其中的drop语句

  • 通过全备文件和增量binlog文件的导出sql文件,就可以恢复到完整的数据

过程示意图

操作过程

模拟数据

CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(20) NOT NULL,`age` tinyint(2) NOT NULL DEFAULT '0',PRIMARY KEY (`id`),KEY `index_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 mysql> insert student values(1,'zhangsan',20);
mysql> insert student values(2,'lisi',21);
mysql> insert student values(3,'wangwu',22);

全备命令

# mysqldump -uroot -p -B -F -R -x --master-data=2 test|gzip >/server/backup/test_$(date +%F).sql.gz

参数说明:

  • -B 指定数据库

  • -F 刷新日志

  • -R 备份存储过程等

  • -x 锁表

  • --master-data 在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息

继续插入数据并删库

mysql> insert student values(4,'xiaoming',20);
mysql> insert student values(5,'xiaohong',20);

在插入数据的时候我们模拟误操作,删除test数据库。

mysql> drop database test;

此时,全备之后到误操作时刻之间,用户写入的数据在binlog中,需要恢复出来。

查看全备之后新增的binlog文件

# cd /server/backup/
# ls
test_2020-08-19.sql.gz
# gzip -d test_2020-08-19.sql.gz
# grep CHANGE test_2020-08-19.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=107;

这是全备时刻的binlog文件位置,即mysql-bin.000003的107行,因此在该文件之前的binlog文件中的数据都已经包含在这个全备的sql文件中了

移动binlog文件,并读取sql,剔除其中的drop语句

# cp /data/3306/mysql-bin.000003 /server/backup/
# mysqlbinlog -d test mysql-bin.000003 >mysql-bin.000003.sql

接下来,使用vim编辑mysql-bin.000003.sql文件,剔除drop语句

注意:在恢复全备数据之前必须将该binlog文件移出,否则恢复过程中,会继续写入语句到binlog,最终导致增量恢复数据部分变得比较混乱

恢复数据

# mysql -uroot -p < test_2020-08-19.sql
# mysql -uroot -p -e "select * from test.student;"
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | zhangsan |  20 |
|  2 | lisi     |  21 |
|  3 | wangwu   |  22 |
+----+----------+-----+

此时恢复了全备时刻的数据,然后使用mysql-bin.000003.sql文件恢复全备时刻到删除数据库之间,新增的数据。

# mysql -uroot -p test < mysql-bin.000003.sql
# mysql -uroot -p -e "select * from test.student;"
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | zhangsan |  20 |
|  2 | lisi     |  20 |
|  3 | wangwu   |  20 |
|  4 | xiaoming |  20 |
|  5 | xiaohong |  20 |
+----+----------+-----+

此时,整个恢复过程结束,是不是很简单呢?没错,就是这么简单!!

总结

  • 适合人为SQL语句造成的误操作或者没有主从复制等的热备情况宕机时的修复。

  • 恢复条件要全备和增量的所有数据。

  • 恢复时建议对外停止更新,即禁止更新数据库。

  • 先恢复全量,然后把全备时刻点以后的增量日志,按顺序恢复成SQL文件,然后把文件中有问题的SQL语句删除(也可通过时间和位置点),再恢复到数据库。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

【MySQL】记一次线上重大事故:二狗子竟然把线上数据库删了!!相关推荐

  1. 记一次线上重大事故:二狗子竟然把线上数据库删了!!

    推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 最全面试题新鲜出炉:70+算法题 ...

  2. 夜空中最靓的二狗子是如何让 HTTPS 快上加快的?

    二狗子是某不知名网站的站长,他热衷于通过博客分享日常的一些工作.生活.技术等,立志要成为夜空中最靓的仔. 但是前段时间有几个用户反馈,网站总是莫名会跳转到一个 xx 网站,除此之外访问速度也有点慢.作 ...

  3. 二狗子翻车了,只因上了这个网站……

    今天故事的主角还是大家熟识的二狗子.二狗子拿到了一笔项目奖金,在好好犒劳了自己一顿后,决定把剩下的钱在银行存个定期. 他用浏览器访问了 www.bank.com,输入了用户名和密码后,成功登录. ba ...

  4. java科目二踩线原理_科目二曲线行驶老“踩线”?掌握这些技巧,顺利通关不“踩线”!...

    #驾考常识解答#在科目二测验名目中,曲线行驶算是对照中性的一个测验名目了,说难不难不过想要完善通关却也没有辣么轻易,朋友们需求控制好角度和偏向,并且"套路"少许小本领,信赖在不久以 ...

  5. 记一次线上coredump事故

    转自:http://www.likecs.com/show-16439.html 记一次线上coredump事故 1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发 ...

  6. MySQL选错索引导致的线上慢查询事故复盘

    前言 又和大家见面了!又两周过去了,我的云笔记里又多了几篇写了一半的文章草稿.有的是因为质量没有达到预期还准备再加点内容,有的则完全是一个灵感而已,内容完全木有.羡慕很多大佬们,一周能产出五六篇文章, ...

  7. java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw

    java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B ...

  8. java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库

    java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库 java计算机毕业设计线上花店购物商城源码+lw文档+系统+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

  9. 由上海地铁10号线发生追尾事故所想到的

    网站形象与企业发展潜力 -- 由上海地铁10号线发生追尾事故说开去 今天上网,又看到列车追尾. 我是一个很少发表任何攻击性言论的人,不过看到这种不断重复的低级而又影响重大的错误,实在是想说两句. 在新 ...

最新文章

  1. Spring 学习笔记
  2. 掌握这35 个小细节,助你有效提升 Java 代码的执行效率!
  3. 计算机与生物学交叉学科,美国本科开设了哪些交叉学科?
  4. 进程外Session和进程内Session存储
  5. 为什么说嵌入式开发比单片机要难很多?
  6. 解决非javascript浏览器的问题
  7. 对于over-posting的防御
  8. ios怎么引入masonry_iOS-Masonry的简单使用
  9. andorid使能ftrace失败
  10. 计算机网络原理的思维导图汇总
  11. tp6 多关联withJoin查询
  12. Docker - 分布式任务调度中心 - xxl-job
  13. One or more errors occurred 报错
  14. ios应用不通过应用商店下载
  15. java-php-python-ssm网上购物超市系统计算机毕业设计
  16. 自适应,响应式以及图片的性能优化(响应式图片)
  17. 扫码支付java,详解JAVA后端实现统一扫码支付:微信篇
  18. 数字IC后端设计技术全局观
  19. 展望 | 2023年十大科技趋势
  20. 查看Linux内核版本及发行版本

热门文章

  1. 关于mouseenter、mouseover、mouseout、mouseleave的理解
  2. 是什么轮胎_为什么现在的车轮胎轮毂尺寸越来越大
  3. 关于报错Incorrect username or password ( access token ) Authentication failed for ‘https://gitee.com
  4. 关于学习Python的一点学习总结(31->继承及多态)
  5. 组合计数 ---- 732 Div2 D. AquaMoon and Chess
  6. 把python语言翻译出来_Python语言实现翻译小工具(Python打包成exe文件)
  7. python初始化_Python list初始化
  8. SWPU 2021年团队程序设计天梯赛选拔赛 题解
  9. P1996 约瑟夫问题
  10. cygwin编译生成hello world_自己动手实现Lua:虚拟机、编译器、标准库(一)——搭建开发环境...