有没有办法恢复一个月前删除的 Mysql 中已删除的行
Is there a way how to recover deleted rows in Mysql deleted over a month ago
我正在使用 Mysql 并且错误地删除了非常重要的 details.Is 有一种方法如何恢复 Mysql 中删除的记录?
您是否有自插入这些记录之日起的二进制日志文件?
那你就可以拿到插页再放回去
我知道这不是你真正要问的,但我发现你知道这一点很重要。
我建议的系统称为软删除。它的工作原理如下:
在您的 table 中创建一个新专栏(对于前 table 人):
ID
Name
Deleted
1
Bob
0
2
Frank
1
3
Alice
0
在类型为 BOOLEAN
的最后一列中,0 为未删除,1 为已删除。 Name和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 的爱丽丝未被删除,因为布尔值位于 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文件。
在这种情况下,您也可以使用常规恢复模式。
对于 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
我正在使用 Mysql 并且错误地删除了非常重要的 details.Is 有一种方法如何恢复 Mysql 中删除的记录?
您是否有自插入这些记录之日起的二进制日志文件?
那你就可以拿到插页再放回去
我知道这不是你真正要问的,但我发现你知道这一点很重要。
我建议的系统称为软删除。它的工作原理如下:
在您的 table 中创建一个新专栏(对于前 table 人):
ID Name Deleted 1 Bob 0 2 Frank 1 3 Alice 0 在类型为
BOOLEAN
的最后一列中,0 为未删除,1 为已删除。 Name和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 的爱丽丝未被删除,因为布尔值位于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文件。
在这种情况下,您也可以使用常规恢复模式。
对于 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