别提桶跑路,MySQL 误删数据救命指南来了!

作者:微信小助手

发布时间:2024-12-03T17:13:10

一、背景

某天,张三打算操作数据库,删除自己项目的无用数据,但是一不小心数据删多了。被误删的数据,如何恢复呢?本文将介绍相关方法,以及现成的一些工具。

例子:

有一个表

create table person
(
  id   bigint primary key auto_increment comment 'id',
  name varchar(50comment '名称'
engine = innodb;

原本是要执行这条SQL语句:

delete from person where id > 500000;

不小心执行了这条SQL语句:

delete from person;

二、解决方案

处理这个问题的解决思路就是,基于binlog找回被删除的数据,将被删除的数据重新插入到数据库。

对于binlog文件来说,实际上保存的是对于数据库的正向操作。比如说,插入数据insert,binlog中保存的也是insert语句;删除数据delete,binlog中保存的也是delete语句。

因此,想要恢复被删除的数据,主要有两种方式:

下面就针对上面的两种方式,进行详细的讲解

1. 通用操作

首先介绍两种方式都需要使用到的一些通用的操作,主要用于设置binlog、找到binlog文件

unsetunset1.1 确认binlog开启unsetunset

1.1.1 查询开启状态

首先要保证binlog是开启的,不然数据肯定是没办法恢复回来的。

在MySQL中,可以通过执行以下SQL查询来检查是否已经开启了binlog:

SHOW VARIABLES LIKE 'log_bin';

这个查询将返回一个结果集,其中包含名为log_bin的系统变量的值。如果log_bin的值为ON,则表示binlog已经开启;如果值为OFF,则表示binlog没有开启。

mysql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.01 sec)

1.1.2 开启binlog

如果发现没有开启,可以通过修改MySQL配置文件(通常是my.cnfmy.ini,Linux下MySQL的配置文件目录一般是/etc/mysql)中的[mysqld]部分来开启binlog。如果在配置文件中找到了类似以下的设置,则表示binlog已经开启:

[mysqld]
log-bin=mysql-bin
server-id=1
  • 修改配置启用了binlog之后,需要重启MySQL服务才能使更改生效

  • mysql-bin表示binlog文件的前缀

  • server-id 设置了MySQL服务器的唯一ID,必须设置ID,否则没办法开启binlog

unsetunset1.2 binlog模式unset