有没有办法恢复一个月前删除的 Mysql 中已删除的行

Is there a way how to recover deleted rows in Mysql deleted over a month ago

我正在使用 Mysql 并且错误地删除了非常重要的 details.Is 有一种方法如何恢复 Mysql 中删除的记录?

您是否有自插入这些记录之日起的二进制日志文件?

那你就可以拿到插页再放回去

我知道这不是你真正要问的,但我发现你知道这一点很重要。

我建议的系统称为软删除。它的工作原理如下:

  1. 在您的 table 中创建一个新专栏(对于前 table 人):

    ID Name Deleted
    1 Bob 0
    2 Frank 1
    3 Alice 0

    在类型为 BOOLEAN 的最后一列中,0 为未删除,1 为已删除。 Name和ID分别是一个NVARCHAR和一个INT.

  2. 如果你想删除一条记录,你不会用DELETE语句删除它,而是像这样更新它:

    UPDATE people SET Deleted = 1 WHERE ID = 1
    

    结果:

    ID Name Deleted
    1 Bob 1
    2 Frank 1
    3 Alice 0

    您知道 ID 的 1 和 2 已被删除,因为 Deleted 列中的布尔值位于 1 上。 ID 为 3 的爱丽丝未被删除,因为布尔值位于 0.


本系统的pro就是只用一条语句就可以恢复数据!

UPDATE people SET Deleted = 0 WHERE Deleted = 1

结果:

ID Name Deleted
1 Bob 0
2 Frank 0
3 Alice 0

现在所有记录都已恢复,因为第 Deleted 列中的布尔值在 0 上。

如果使用DELETE语句,是不可能恢复所有记录的!它们将永远被删除,如果您使用 DELETE 语句,您将永远无法恢复它。您只能使用备份文件来恢复它,但也有类似的:

  • 这是一个旧的备份文件,
  • 忘记做一个了,
  • 我不知道你是怎么做到的,
  • 我弄丢了,
  • ...

通过软删除,您只需更改一列即可恢复数据。


编辑:
系统的反对(就像你说的)数据没有完全从你的数据库中删除。这只是你从 0 到 1 的列。但是如果你知道你可以从数据中赚钱......这是另一个故事。

如果你想完全删除它,你可以使用 DELETE 语句。

mysql> use  employees;
Database changed

mysql> show create table employees;
 
| employees | CREATE TABLE `employees` (
  `emp_no` int(11) NOT NULL,
  `birth_date` date NOT NULL,
  `first_name` varchar(14) NOT NULL,
  `last_name` varchar(16) NOT NULL,
  `gender` enum('M','F') NOT NULL,
  `hire_date` date NOT NULL,
  PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
 



mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)


mysql> delete from employees;


mysql> flush table employees with read lock;
Query OK, 0 rows affected (0.01 sec)

我们可以直接扫描table.ibd文件,找到删除的记录:

select 从菜单开始添加 .ibd

输入删除的table的ibd位置

右击ibd文件,扫描

点击第一个页面节点,输入create table sql

选择正确的 mysql 版本和页面格式(大多数版本是动态的)

select Deleted Data 选项卡,然后可以查看删除的记录并导出到MYSQLDUMP格式SQL文件。

在这种情况下,您也可以使用常规恢复模式。

https://youtu.be/dVMO0YYcJoo

对于 InnoDB 表,如果启用二进制日志,可以使用:

mysqlbinlog path_to_binary_log_file > query_log.sql

如果未启用二进制日志,Percona 提供的恢复 tool 可能会有所帮助。

创建了一个 script 来自动执行 Percona 工具的步骤,该工具恢复已删除的行(如果存在)并提供 SQL 查询以将数据加载回数据库。

请注意:

The time between the deletion of rows and the database stop is crucial. If pages are reused you can’t recover the data.

PS:@ParnassusData 的 DBRecover 工具很酷而且更容易 IMO