mysql误删表如何恢复,恢复被删除表的步骤说明

小编寄语 众所周知 , 李真旭是中国最专业的Oracle数据库恢复专家 。但是 , 知识只是一个类比的问题 , 真正的专家从来不会局限于一个方向 。今天的内容是他恢复MySQL数据的尝试 。
本文主要分享MySQL数据库如何在不备份的情况下恢复被删除的表 。
包含两个主要场景:
1.删除表后的恢复
2.截断表后的恢复
文本:
众所周知 , MySQL服务器有很多存储引擎 , 并不是所有的都可以在异常情况下恢复 , 比如drop table/tuncate table/delete table/update table/drop database或者ibdata文件损坏 。Myisam和innodb存储引擎是使用最广泛的 。目前基本都是5.5+版本 。我想几乎没人再用Myisam了 。我在这里测试的所有存储引擎在5.6和5.7版本中默认都是Innodb 。所以这里我以Innodb引擎为例来说明 。
MySQL drop table 这里先测试innodb_file_per_table为off的情况 , 即表结构和数据存储在同一个文件中 。在这里 , 我分别测试了表是否有主键 , 以供参考 。
innodb _ file _ per _ table参数为off(如果有主键)
1创建一个测试表
2备份表结构
[root@killdb ~]
# mysql
dump –opt -d -uroot -proger recover test_drop0801 > /tmp/innodb_recovery/recover/test_drop0801.sql
3删除表
mysql > drop table test _ drop0801
查询正常 , 0行受影响(0.00秒)
4扫描数据文件
5创建用于恢复的数据字典
6查询要恢复的表的信息
7确认数据页中的数据是否存在
8从第页提取数据
9将数据加载到数据库中
我们可以看到 , drop table的恢复已经成功完成 , 数据完好无损 。其实我在这里也测试了没有主键的情况 。经过测试 , 都差不多 , 可以完美恢复 。这里就不重复了 。
MySQL truncate table 首先 , 我想利用开源工具包undrop_for_innodb(当然需要编译) 。目前该工具已于2017年1月关闭 , 开始收费 。但是我们仍然是开源的 。我们以前使用开源工具包 。另外 , 我们可以告诉你 , odu将在不久的将来支持MySQL 。
以下是我的截表测试过程:
1创建一个测试表
2备份表结构
[root@killdbinnodb_recovery]
# MySQL dump–opt-d-u root-proger recover t _ en motech >/tmp/innodb _ recovery/recover/t _ en motech . SQL
[root@killdb innodb_recovery]
#
3目录表
mysql > truncate table t _ enmotech
查询正常 , 0行受影响(0.00秒)
4获取数据字典
5扫描逻辑卷
6创建数据字典表
工具包提供的recover_dictionary脚本将为恢复查询创建一个测试数据库和一些数据字典表 。同时 , 在当前目录下会创建一个字典目录 , 在该目录下会存储数据字典信息 。
7查询要恢复的表的index_id信息
可以看出 , truncate table的index_id是178 , 我们应该进一步从178的页面获取数据 。
8确认数据是否存在
9从第页提取数据
在提取数据之前 , 必须预先准备好表的表结构 。因为这是truncate , 所以表结构存在并且容易获得 。我在这里测试 , 所以我之前备份了结构 。
如果是滴表呢?事实上 , 我们也可以使用这个工具来恢复表格结构 。
10将数据加载到mysql服务器
11验证数据
我们可以看到被truncate丢弃的数据被成功恢复 。
我这里测试的truncate table的场景 , 其实和drop table和delete table的恢复方法差不多(屡试不爽) 。此外 , 更严重的删除数据库实际上可以恢复 。
当然 , 对于实际的生产库 , 数据可能不可恢复 , 因为它可能被覆盖 , 导致数据恢复不完全 。MySQL 空之间的复用机制与Oracle有很大不同 。对于Oracle来说 , 如果是删除数据 , 还是很难被覆盖 。对于drop和truncate , 情况就不同了 。但是 , MySQL不一样 。默认情况下 , MySQL会在空之间启动一些清除进程以便重用 , MySQL 5.6就是这种情况:
在MySQL版本中 , 更是雪上加霜 。MySQL默认会启动4个purge线程 , 所以很容易导致空的重用 , 最终导致数据不可恢复 。以下是MySQL 5.7的清除相关参数:
【mysql误删表如何恢复,恢复被删除表的步骤说明】因此 , 一旦遇到转cate表/drop表/delete/drop数据库等情况 , 建议立即停止服务或停止数据库 , 并保留站点 , 以免环境进一步恶化 , 最终导致数据无法恢复 。


推荐阅读