Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 事故复盘
  3. 正文
                           

【八戒】一次误删除MySQL主库的恢复操作

2023-02-19 3016点热度 0人点赞 0条评论

数据库备份是保障猪八戒数据安全必不可少的一部分,在猪八戒MySQL数据库上我们通常进行热备和binlog备份,目的是能回溯、恢复企业生产数据。其中基于binlog和备份恢复是日常数据库运维中一定会遇到的操作,本文通过一次案例介绍如何在误删除之后基于已有备份和binlog恢复数据以及什么样的备份是可以进行数据恢复的。


背景:

MySQL5.6.40,库比较小,row+gtid复制环境,但由于以前种种原因,备份还原在从库后,开启复制存在大量1062,1032错误,gtid卡在靠前位置。做复制的时候没有任何从库,每小时的备份也被运维停了。

以前从来没遇到过这种情况,相对测试环境正式环境比较复杂,而且猜测可能是之前备份还原从来没用过备份一致性参数导致,并且发现错误也没有手工检查(这个问题还在研究中,有遇到并知道原因的小伙伴欢迎指导)。

为了今后避免因为恢复不及时导致的数据丢失,特别总结本次故障过程和大家讨论、分享。

 

下面按照我的记忆描述下当时的场景:

一、首次备份主库、搭建从库

第一次搭建从库,从主库的备份未使用master-data=2 single-transaction(保证事务备份时的一致性)参数迁移后,报大量1062和1032错误(家家有本难念的经,不多说了)在这里插入图片描述

二、第二次还原主库数据到从库

于是第二次重新导入。

同样报错。在导入从库前使用reset master;将从库binlog清除。

由于操作人员不了解reset master含义及执行结果,又在主库做了reset master;

结果导致主库所有binlog日志被清除并且binlog position重置为1;

这里贴以下官方说明,别没事干就在主库上用这条。

再次导入发现依旧大量报1032,1062错误。

由于怀疑是因为备份时没使用--single-transaction参数,准备删除从库,加参数重新备份主库。

三、误删除主库

结果误操作删除主库(这个锅一部分原因要甩给mysql naivcat这个工具,垂直排列库,稍微不注意就容易点错。还是建议大家听吴老师的用官方的workbench),删库还是两人校对,在操作系统上执行,删前没把握最好备份一遍。

删库这种操作谨慎谨慎再谨慎,重要的事情说三遍!

删库这种操作谨慎谨慎再谨慎,重要的事情说三遍!

删库这种操作谨慎谨慎再谨慎,重要的事情说三遍!

drop database;(在naivcat上右键删除库,但binlog日志中还是会记录DROP DATABASE这条记录)

这时候为了保证业务不中断,立马在主库上通过之前的备份文件恢复了一套库,当然数据肯定丢失了,但可以推算丢失数据的时间段(从备份完毕开始--->DROP DATABASE)。

PS.请不要问我为什么删库,为什么删完又恢复了一套库,因为都不是我干的。。。。。。

万幸的是误删除主库但并未删除从库,而且从库的io_thread仍然处于yes状态(回顾吴老师的课程,也就是说虽然库被删除了但其实删库前的数据=备份数据+io_thread已下载的删除主库前的数据),由于sql_thread仍然停到gtid靠前的位置

四、跳过大量1032,1062错误

这个时候只要看下备份文件的gtid位置,并purge到该位置(之前备份丢了,随便找了一个备份的截图,理解万岁)。

##这里说明一下为什么直接purge到备份的结尾位置,因为主库备份的数据中1032和1062错误太多,且主库已经删除没办法通过脚本对比跳过大量1032,1062错误(吴老师友情提供),在能够保证是从主库逻辑备份过来的情况下(主从数据一致),我们选择快速跳过大量错误(偷懒加情况急),直接purge到备份最后的位置。

##上图是随便截的一个备份文件最开头的位置,请忽略那个gtid的值,意思明白就行。

set @@gtid_purged='fb1f83af-1915-11e8-811b-000c29c4d77d:1-500';

注:‘500’代表备份文件最后一个执行的事务的gtid。gtid_purged代表数据库已经在从库上重放过1-500这段事务。

五、找到主库DROP DATABASE的GTID位置

purge到该位置然后再确定drop database的位置上(思路:如果不确定dropdatabase的位置就start slave 那么从库会应用主库的binlog也就会执行主库drop database的操作,为了避免从库重放主库drop database的操作,我们要设法让gtid在从库停到drop database前一个gtid的位置)

注:可以通过大致删库时间或者从从库的show slave status\G上看到主库的binlog位置从后往前找DROP DATABASE的位置,如果删库后做了reset master那就只能从从库的relay-bin-log上找了(切记主库没事别reset master);

mysqlbinlog    -vvv  --base64-output=decode-rows  relay-bin.000017

六、启动从库SQL_THREAD

在从库上执行start slave sql_thread until的命令,这里需要说明,因为主库已经还原,业务跑起来了,这时候开启io_thread没有什么意义,所以只用让从库的sql_thread线程重放DROP DATABASE之前的事务就行。

root@localhost[{none}]>start slave sql_thread until sql_before_gtid='fb1f83af-1915-11e8-811b-000c29c4d77d:2343';

启动slave,并且让从库gtid停在主库drop database操作之前一个gtid就可以,再还原到主库就能立马投入使用,还不会导致数据丢失。

确保从库executed_gtid_set到了我们before的前一个值就可以备份了,然后dump这份数据还原主库,当然如果从库性能不错的话可以考虑应用端更改连接,这样速度更快一些。

但比较麻烦的就是,要保证生产的实时性,删库后立即在主库上还原了之前用来恢复从库的备份文件,这就肯定会导致中间数据丢失。

七、数据对比还原

这时候只能使用用之前用来搭建从库的备份再恢复一个库,再用pt-table-checksum对比主库和恢复库,从库和恢复库不一致的数据,用pt-table-sync生成对应语句。然后手工把数据补进系统中。

对比1:主库:备份数据还原的库---->目标:找到主库在删库之后应用又写入了哪些数据。

对比2:从库:备份数据还原的库---->目标:找到备份数据之后,删库之前应用在主库里写了哪些数据。

因为量不是很大,手工对比一下就行,当然数据还原的坑也有很多,不过基本上都被研发填了。

总结:

第一次碰到删库情况还是有点蒙,还好主库用的是GTID找binlog日志中的位置相对容易一点。这次恢复最幸运的就是还好从库卡在靠前的位置,要不然即使有了从库,数据也会被删了,恢复起来相对更麻烦些。

更多文章:

  1. 系统设计入门:成为高级软件工程师的指南
  2. 分布式唯一 ID 生成方案浅谈
  3. 系统设计 | 搭建持续集成和部署流水线
  4. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  5. 45 个 Git 经典操作场景,专治不会合代码
  6. 从滴滴的故障我们能学到什么
  7. 构建一个布隆过滤器 —— Building a Bloom filter
  8. 生产环境JVM崩溃问题排查解决
  9. 研发日常踩坑-Mysql分页数据重复
  10. 一次访问Redis延时高问题排查与总结
标签: 八戒 备份 从库 数据恢复 主库 MySQL
最后更新:2023-02-19

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >
广告
文章目录
  • 一、首次备份主库、搭建从库
  • 二、第二次还原主库数据到从库
  • 三、误删除主库
  • 四、跳过大量1032,1062错误
  • 五、找到主库DROP DATABASE的GTID位置
  • 六、启动从库SQL_THREAD
  • 七、数据对比还原
  • 总结:
最新 热点 推荐
最新 热点 推荐
干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink? 如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?视频笔记:什么是AI 智能体?
2.软件架构预述(译) 系统设计 | 领域模型中的拓展点设计 如何画好一张架构图? 这些MQ概念你都懂吗:死信队列、重试队列、消息回溯等 系统设计 | 高性价比的测试策略("瓜藤"比喻) Elasticsearch 使用误区之六——富文本内容写入前不清洗 殷浩详解DDD系列 第一讲 - Domain Primitive 干货 | Elasticsearch基础但非常有用的功能之二:模板

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (2) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (18) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x