有没有办法恢复一个月前删除的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 分别是 NVARCHAR
和 INT
。
如果你想删除一条记录,你不要用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中已删除的行的主要内容,如果未能解决你的问题,请参考以下文章