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

Posted

技术标签:

【中文标题】有没有办法恢复一个月前删除的Mysql中已删除的行【英文标题】:Is there a way how to recover deleted rows in Mysql deleted over a month ago 【发布时间】:2015-11-21 13:02:15 【问题描述】:

我在使用mysql,误删了非常重要的细节,有没有办法恢复Mysql中删除的记录?

【问题讨论】:

提示:用布尔值创建一个新列。如果该布尔值为 0,则记录已删除,如果为 1,则未删除。始终更新该列,您永远不会丢失数据。不要使用DELETE 声明。 如果您决定实际使用DELETE,另一种选择是保留保存已删除记录的备份数据库。 @Luïs 你能详细说明一下吗,我可以在删除信息的地方做什么,所以由于人为错误,我删除了真实信息,我想删除测试,但删除了真实信息 @Tim Biegeleisen 如何为已删除的记录创建备份数据库?手动还是以某种自动方式? dev.mysql.com/doc/refman/5.1/en/mysqldump.html 【参考方案1】:

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

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

    在您的表格中创建一个新列(例如表格人员)

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

    在类型为BOOLEAN 的最后一列中,0 为未删除,1 为已删除。名称和 ID 分别是 NVARCHARINT

    如果你想删除一条记录,你不要用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 的 Alice 未被删除,因为布尔值位于 0


这个系统的优点是你可以只用一个语句来恢复数据!

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 语句。

【讨论】:

非常感谢您提供的详细信息,非常有用。所以首先我需要添加一列已删除。但实际上在命令 UPDATE 人们 SET Deleted = 1 WHERE ID = 1 信息没有删除之后来自 Db?我使用 Delete 的目的是不让带有奇怪信息的沉重 Db,这就是我删除记录的原因 是的,Luïs 建议您实际上不要DELETE 任何行,您只是有一个包含 1 或 0 的已删除列。如果值为 1,则该列被删除。所以你只需选择你的数据WHERE deleted = 0。这将防止丢失数据行的任何问题 是的,我知道。使用大数据是对立的。但是,如果您知道数据就是金钱……您可以考虑金钱。如果您要完全删除它,您还可以使用DELETE 语句更改UPDATE 如果用户愿意。 我们经常使用它,但我们开始质疑我们的决定,因为它确实不适用于唯一键。我们不能混淆is_deleted(布尔)和email(唯一)。如果帐户被删除,其电子邮件或用户名将永远无法重复使用。 沉迷于“大数据”。实施软删除不会产生大数据;)【参考方案2】:

您是否有插入这些记录之日起的 binlog 文件?

然后你可以得到插入并把它放回去

【讨论】:

你能解释一下吗,我是binlog的新手@Bernd Buffen MySQL 将任何“写入”写入二进制日志文件。这可用于复制或恢复here你可以找到详细信息mariadb.com/kb/en/mariadb/binary-log 在那个文件中我能找到在某个日期被删除的信息吗? 你能帮我弄清楚我需要从哪里打开这些文件,我怎样才能得到信息请@Bernd Buffen 是的,每个 binlog 文件的文件名中都有一个数字,例如 -rw-rw---- 1 mysql mysql 1073882317 Aug 1 16:31 binlog.0076 -rw-rw---- 1 mysql mysql 1074239062 Aug 1 19:13 binlog.0077 因此,文件中的 .0077 都是从 1.8.2015 的 16:31 到 19:13 之间的所有更改,您可以使用命令 mysqlbinlog - # mysqlbinlog binlog.007607 | 查看文件less mysqlbinlog 有很多过滤文件的选项,或者你可以使用 grep【参考方案3】:
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)

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

从菜单开始选择添加 .ibd

输入删除表的ibd位置

右键点击ibd文件,扫描

点击首页节点,输入create table sql

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

选择已删除数据选项卡,即可查看已删除记录并导出为MYSQLDUMP格式的SQL文件。

在这种情况下,您也可以使用传统的恢复模式。

https://youtu.be/dVMO0YYcJoo

【讨论】:

以上是关于有没有办法恢复一个月前删除的Mysql中已删除的行的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 2000 中恢复已删除的行

Foremost恢复Linux中已删除的文件

光标检索在 plpgsql 函数中创建的表中已删除的行

如何处理 Spark Structured Streaming 中已删除(或更新)的行?

Mysql Innodb数据库误删除了文件,怎么恢复?

mysql误删root用户解决办法