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

我们最近在研究灾备,也就是说系统挂了,怎么办,库被删了怎么办。之前有被挟持过,问我们要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的,好啦,完结撒花。

相关推荐
J_liaty34 分钟前
分库分表深度解析
后端
陌上丨2 小时前
MySQL8.0高可用集群架构实战
数据库·mysql·架构
一只自律的鸡3 小时前
【MySQL】第十一章 存储过程和存储函数
数据库·mysql
翔云1234563 小时前
MySQL 中的 utf8 vs utf8mb4 区别
数据库·mysql
AIFQuant3 小时前
如何通过股票数据 API 计算 RSI、MACD 与移动平均线MA
大数据·后端·python·金融·restful
x70x803 小时前
Go中nil的使用
开发语言·后端·golang
强子感冒了3 小时前
MySQL学习随笔:数据类型与字段约束
学习·mysql
一只酸奶牛^_^3 小时前
解决LinuxDeploy部署mysql、redis数据库无法启动问题。
redis·mysql
CodeBlossom3 小时前
MySQL进阶 索引
数据库·mysql
REDcker3 小时前
libwebsockets库原理详解
c++·后端·websocket·libwebsockets