首页 > 数据库 >记一次mysql生产误删表抢救操作

记一次mysql生产误删表抢救操作

时间:2024-07-25 12:29:47浏览次数:11  
标签:binlog sql 确认 误删 抢救 mysql path 数据

背景

数据库的操作必须要采取一系列的措施来规范流程和管理。然而,不同客户群体管理水平不一,删库跑路也并不是茶余饭后的笑话,它真真实实的,突如其来的就发生在你身边。
接项目经理前线打来电话,某医院突发生产故障,通过业务日志得知,数据库缺表,需要紧急恢复数据,恢复生产。

思路

确认环境和条件

0.已确认生产受影响,关闭应用防止报错业务日志堆积。
1.好端端的生产库怎么可能缺一张至关重要的表,除了人为删除找不到其他合理的解释。
2.恢复数据,肯定是先找最近的备份记录及文件。
3.确认备份策略(mysqldump备份,一天一全备,凌晨1点执行,保留7天备份数据)
4.确认是否有开启binlog(正常生产上线,必须是开着的)

梳理恢复流程

大致分两个步骤:
1.通过全备,建表并恢复表数据到今天凌晨1点。
2.读取binlog日志,恢复从凌晨1点到最后生产故障时间点的数据。(保证这一天下来的增量数据)

具体恢复流程开始

1.通过binlog定位误删操作的时间,命令等信息。

mysqlbinlog -d 数据库名 -v --skip-gtids binlog文件名  |grep 'DROP TABLE' -C 10


通过mysqlbinlog命令,可得:
找到误删操作的时间点:20240724 17:42:52
对应的binlog文件名为:bin.000399
最后故障前的数据库恢复点pos:444959948
操作进程id:thread_id=159424
对方可能是跑了脚本,DROP TABLE IF EXISTS,可能是想在测试库上跑脚本建表,结果执行到了生产,把生产库表删了。

2.确认全备时的点位



凌晨一点备份,对应的binlog文件名为:bin.000396(可以从图片看到396的binlog是从23号的20:00多一直写到24号01:07)
后续捞全备后一天的增量数据,就从bin.000396这个日志开始捞最全,不怕数据重复,顶多插不进去,最怕数据丢失。

3.抽取全备里面的建表语句+表数据,恢复到生产库。(数据最新到凌晨1点)

抽取建表语句

cat {全备sql文件} |grep 'CREATE TABLE `XXXXXXXX`' -A 50 |more

抽取表数据

cat {全备sql文件} |grep 'INSERT INTO `XXXXXXXX`' >> data_insert.sql

建表

通过上面抽取的建表语句,要么直接执行,要么放到create_table.sql文件里,use {db};source /path/to/create_table.sql

锁表

lock tables XXXXXXXX write;

导入全量表数据

use {db};source  /path/to/data_insert.sql

或者
/path/to/bin/mysql -h {ip} -P {端口} -u root -p{密码} -S /path/to/tmp/mysql.sock {数据库} < /path/to/data_insert.sql
亦可

通过业务数据确认最新表数据的时间戳

确认最新数据为故障前20240724 01:00:00之前的最新数据

4.利用my2sql,读取binlog,捞取从凌晨1点的数据追到最后生产故障时间点的最新数据。(补充这一天下来的增量数据)

./my2sql -host {服务器ip} -port {端口} -user root -password 'XXXXX' -mode file -work-type 2sql -databases ehc  -tables {要恢复的表名} -local-binlog-file ./bin.000396 -start-file bin.000396  -stop-file bin.000399 -start-datetime "2024-07-24 00:40:00" -stop-datetime "2024-07-24 18:00:00"  -output-dir ./tmpdir

前提工作

1.my2sql工具传进去(我是直接放到binlog的目录下)
2.确保my2sql可以执行
3.确保开始捞增量的开始和结束的时间点和binlog文件(前面已经确认过了)
3.创建tmpdir文件夹

执行成功后,在tmpdir目录下生成forward.396.sql/forward.397.sql(中间有多少binlog,就会生成多少个sql)

通过head -n 进行sql确认

导入增量数据

/path/to/bin/mysql -h {ip} -P {端口} -u root -p{密码} -S /path/to/tmp/mysql.sock  {数据库}  <  /path/to/forward.396.sql
/path/to/bin/mysql -h {ip} -P {端口} -u root -p{密码} -S /path/to/tmp/mysql.sock  {数据库}  <  /path/to/forward.397.sql

通过业务数据确认最新表数据的时间戳

确认最新数据为故障前20240724 17:42:52之前的最新数据

解锁表

UNLOCK TABLES;

数据恢复结束,确认业务是否恢复。

业务数据再次确认,启动应用,观察应用是否正常,业务拨测,观察数据库数据是否正常。

故障溯源

1.从操作进程id:thread_id=159424出发,SHOW PROCESSLIST或者通过查询information_schema数据库中的PROCESSLIST表来获取类似的信息。
2.结合审计日志。

标签:binlog,sql,确认,误删,抢救,mysql,path,数据
From: https://www.cnblogs.com/haiyoyo/p/18322729

相关文章

  • MySQL配置开发文章:学习路线、使用案例及代码示例
    引言MySQL是一个广泛使用的开源关系型数据库管理系统,由于其性能高、成本低、可靠性强,成为了许多开发者的首选工具,本文将介绍MySQL的基本配置、学习路线、使用案例及代码示例,帮助你更好地掌握MySQL的使用MySQL配置开发教程学习路线基础知识:了解关系型数据库的基本概念,熟......
  • 整合Apache Hudi+Mysql+FlinkCDC2.1+CDH6.3.0
    一、环境准备1.环境准备:flink1.13.1+hudi0.10+hive2.1.1+cdh6.3.0+mysql5.7+flinkcdc2.1+flinkweb平台二.编译hudi(这个编译是以前的一个测试版本,编译大同小异)1.使用git命令下载hudi0.10的代码steven@wangyuxiangdeMacBook-Pro~gitclonehttps://github.com/ap......
  • SpringBoot整合Flink CDC,实时追踪mysql数据变动
    ❃博主首页:「码到三十五」,同名公众号:「码到三十五」,wx号:「liwu0213」☠博主专栏:<mysql高手><elasticsearch高手><源码解读><java核心><面试攻关>♝博主的话:搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,......
  • 无法在我的 apache 服务器内对 Flask 应用程序(用于 MySQL 连接)进行远程 api 调用
    我有一个在AlmaLinux上运行的apache服务器。我有Flask代码设置来接受来自远程连接的API调用。所以我的API调用命中了Flask,然后它连接到MySQL数据库。当我尝试在服务器内部本地运行此数据库连接代码时,它工作正常。但是当我尝试通过远程API调用来访问Flask应......
  • 计算机专业论文 (SpringBoot/SpringCloud+Vue+MySql)
    (可辅导论文)需要源码dd毕业设计(论文)  论文题目:基于Vue和SpringCloud的旅游网站设计与实现 摘 要 本论文主要介绍了基于Vue和SpringCloud的旅游网站的设计与实现。如今,旅游业已成为社会发展中的重要组成部分,旅游平台聚集多种多样的旅行方案以及攻略,越来越多的人......
  • MySQL8新特性底层原理
    降序索引什么是降序索引MySQL8.0开始真正支持降序索引(descendingindex)。只有InnoDB存储引擎支持降序索引,只支持BTREE降序索引。另外MySQL8.0不再对GROUPBY操作进行隐式排序。在MySQL中创建一个t2表 createtablet2(c1int,c2int,indexidx1(c1asc,c2desc)); ......
  • 使用docker的mysql镜像,gin后端服务连接数据库失败。
    我的配置文件是这样的:(账号、密码、数据库名字都正确)mysql:host:127.0.0.1port:3306database:idealusername:rootpassword:1我的docker-mysql是这样的:(端口也暴露出来了)但是还是出现以下错误:[error]failedtoinitializedatabase,goterrordialt......
  • MySQL PXC 集群死锁分析案例
    前不久一个系统死锁导致部分业务受到影响,今次补上详细的节点日志分析过程。这个PXC集群有三个节点,分别是108、109、110,日志信息的ip6地址、节点编号等信息均已做脱敏处理。以下日志里面,3个节点对应的配置信息是:10899999999-99089999:9999:9999:9999::6c10999999999-99099......
  • MYSQL基础知识之DML
    数据库备份与还原备份 mysqldump.exe-hlocalhost-P3306(端口号) -uroot -p库名>E:/库名20240719.sql还原 mysql.exe-h106.55.169.91-P3306-uroot-phaha<E:/xiao2.sql数据表的新增 insertinto表名(字段名,字段名,....,字段名) values/......
  • WEB:Mysql 备份与多表设计 - 04
     mysql数据库的备份与恢复备份数据库:cmd窗口中使用mysqldump备份数据库mysqldump-uroot-pdb_name> c:/xxx.sql例如:mysqldump-uroot-pmydb2 > c:/mydb2.sql恢复数据库:方式1:cmd窗口中使用mysql命令恢复数据库,注意,只能恢复数据库中的数据,不能恢复数据......