万一删了库,别急着跑路,恢复数据轻松拿捏

我们最近在研究灾备,也就是说系统挂了,怎么办,库被删了怎么办。之前有被挟持过,问我们要0.000几个比特币,差不多几千还是几万块钱来着。不过是测试环境,推倒重建就好了。这次让出一个方案,说是生产库要是被删了,要如何处理。

我们的数据库是MySql8.0的,也就基于这个版本进行尝试

准备

首先,库被删了之后,有以下方案可以恢复丢失的数据:

  1. 备份恢复: 如果你有备份数据库,可以通过数据库备份进行恢复。最好的情况是,备份是在删除数据之前创建的,这样可以最大程度地还原数据状态。
  2. Binlog 恢复: MySQL 的 Binlog 记录了数据库的所有操作,包括删除操作。可以通过 Binlog 进行逐步恢复。首先,需要查找误删操作对应的 Binlog 日志,然后逐步执行这些操作的逆操作来恢复数据。可以使用 mysqlbinlog 命令来解析 Binlog。
  3. 第三方工具: 有些第三方工具可以帮助恢复被误删除的数据,比如 mysql-utilitiespt-table-sync 等。这些工具可以更快速地进行数据对比,找出误删除的数据并进行恢复。
  4. 事务回滚: 如果误删除是在一个事务中发生的,可以考虑回滚该事务来恢复数据。使用 ROLLBACK 命令可以撤销整个事务。

备份我们是一天一备,事务回滚当前这种情况不适用,第三方工具还没研究,所以这里细细说下Binlog恢复数据

操作步骤

首先呢,我们建一个测试库,并新建一个测试表

sql 复制代码
CREATE TABLE `user` (
  `user_id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) DEFAULT NULL,
  `sex` int DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert 两条数据

sql 复制代码
insert into user(user_name,sex) VALUES ('张三',1),('李四',0);

好了,我们的表现在是这样的:

现在演示,删除表的数据:

sql 复制代码
delete from user;

这时候,可以看到表里的数据已经没了

怎么办怎么办,跑路吗?别急别急,接下来才是正文:

现在,打开mysql应用的服务器,找到对应的binlog日志

每个里边都有可能有哈,我刚才执行的在binlog.000005文件里边。

这里有值得注意的点是,可以执行flush logs;进行日志的刷新,也就是让新的日志进入到新的日志文件里边,就不影响我们现在将要恢复的日志文件了。

接下来使用命令查看这个日志文件

bash 复制代码
mysqlbinlog binlog.000005

执行后展示如下:

看到没有,我框出来的,不就是我们刚才执行的sql吗?

但是这里有一点需要注意的,我开始研究的时候,binlog是不打印这个sql语句的。

需要执行:

sql 复制代码
set binlog_format=statement;

才会有,也就是说设置binlog的格式为statement才可以,但是这个并不影响我们接下来的操作。

若是已经设置了binlog_format=statement,那么我们可以找到对应的语句,重新执行一下就好,但是,若是没开呢。

我去把binlog_format改成默认的,set binlog_format=MIXED;再来一遍。我们查看binlog日志如下:

上边的是insert的日志,下边的是delete的日志,大概的分辨方法就是,起始的地方会有个BEGIN,结束的地方会有个COMMIT/*!*/;

然后我们要恢复的是我们上边insert的数据,找到前边和后边的编号起始位置是7553,结束位置是7522

sql 复制代码
mysqlbinlog --start-position=7319 --stop-position=7553 --database=demo binlog.000005 | mysql -uroot -p

至此我们可爱的数据就回来了。注意这里的数字是要包含所有的内容也就是,BEGIN的数字取BEGIN上边的,COMMIT的数字取COMMIT下边的。这样才可以成功。

还有一种方案,就是,在数据库连接工具中进行查询

执行

sql 复制代码
show binlog events in 'binlog.000005';

能看到如下结果

可以看到选中的三行就是我们需要的日志记录。取最前边的数字和最后边的数字执行上边的命令就行。

至此,数据就恢复啦。若是binlog日志很多很庞大的话,呢就只能一条一条找了,可以把 日志输出到文件里边mysqlbinlog binlog.000005 >binlog05.log,这样就可以在本地慢慢查找了。

总的来说恢复的思路是,找到对应的插入sql,然后一条条执行。

总结

总结一下,我们需要关注以下几点:

  1. 查找误删数据的 Binlog 日志: 使用 MySQL 命令行或其他 MySQL 管理工具,查找误删数据的时间点。确认误删操作的时间戳。
  2. 备份当前数据库状态(可选但强烈建议): 在执行任何恢复操作之前,确保备份当前数据库状态,以防恢复过程中发生问题。使用 mysqldump 或其他备份工具创建数据库备份。
  3. 查看 Binlog 文件: 使用 mysqlbinlog 命令查看误删数据时的 Binlog 文件。在输出中找到误删操作对应的 Binlog 事件,通常是 DELETE 语句。
  4. 逐步执行 Binlog 恢复: 通过 mysqlbinlog 或将 Binlog 文件导入到 MySQL 中,逐步执行误删操作的逆操作。
  5. 验证恢复结果: 在执行完 Binlog 恢复后,验证数据库中的数据是否已经恢复。确保没有其他问题或数据冲突。
  6. 监测数据库状态: 监测数据库的运行状态,确保数据库正常运行且没有其他异常。
  7. 修复可能的问题: 如果在恢复过程中遇到任何问题,根据具体情况进行修复。可能需要重新执行某些步骤或采取其他措施。

这里我的数据库是8.0.36的,系统是Ubuntu 22.04的,好啦,完结撒花。

相关推荐
rannn_1118 分钟前
【Javaweb学习|黑马笔记|Day1】初识,入门网页,HTML-CSS|常见的标签和样式|标题排版和样式、正文排版和样式
css·后端·学习·html·javaweb
柏油16 分钟前
Spring @Cacheable 解读
redis·后端·spring
柏油1 小时前
Spring @TransactionalEventListener 解读
spring boot·后端·spring
杰克尼1 小时前
mysql-条件查询案例
数据库·mysql
两码事3 小时前
告别繁琐的飞书表格API调用,让飞书表格操作像操作Java对象一样简单!
java·后端
shark_chili3 小时前
面试官再问synchronized底层原理,这样回答让他眼前一亮!
后端
你那是什么调调3 小时前
`SHOW PROCESSLIST;` 返回列详解(含义 + 单位)
mysql
灵魂猎手3 小时前
2. MyBatis 参数处理机制:从 execute 方法到参数流转全解析
java·后端·源码
易元4 小时前
模式组合应用-桥接模式(一)
后端·设计模式
柑木4 小时前
隐私计算-SecretFlow/SCQL-SCQL的两种部署模式
后端·安全·数据分析