我赠言
想来我们都知道,Oracle ACE李真旭(Roger)是我国最专业的的Oracle 数据库查询恢复权威专家。但专业知识全是融会贯通,真真正正的权威专家,从不会局限性在一个方位上。今日介绍的具体内容,是他在MySQL数据信息恢复上所做的试着。
文中关键共享在并没有备份的情况下,MySQL数据库怎样恢复被删掉的表。
包括2个关键的情景:
1、drop table后的恢复
2、truncate table后的恢复
文章正文:
众所周知,MySQL Server都许多储存模块,并并非每一种都能够开展出现异常情况下都恢复,例如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 ~]
# mysqldump –opt -d -uroot -proger recover test_drop0801 > /tmp/innodb_recovery/recover/test_drop0801.sql
3删除表
mysql> drop table test_drop0801;
Query OK, 0 rows affected (0.00 sec)
4扫描仪数据库文件
5建立用以恢复的数据流图
6查看必须恢复表的信息内容
7确定数据信息page中数据是不是存有
8提取page中的数据信息
9载入数据信息到数据库查询
我们可以见到,圆满完成了drop table的恢复,并且数据信息完好无缺。事实上我这里还与此同时检测了无外键约束的情况,通过检测都相近,可以开展很好的恢复。这儿不会再累述。
MySQL truncate table
最先这儿我想运用undrop_for_innodb 这一开源系统工具箱(自然必须编译程序),现阶段该专用工具已经在2017年1月公布闭源了,并且逐渐收费标准。可是人们依然开源系统应用以前都开源系统工具箱。此外这儿可以提醒大伙儿,不久的未来,odu 也会适用MySQL.
如下所示就是我的truncate table 检测全过程:
1建立检测表
2备份表结构
[root@killdb
innodb_recovery]
# mysqldump –opt -d -uroot -proger recover t_enmotech > /tmp/innodb_recovery/recover/t_enmotech.sql
[root@killdb innodb_recovery]
#
3truncate table
mysql> truncate table t_enmotech;
Query OK, 0 rows affected (0.00 sec)
4获得数据流图
5扫描仪逻辑性卷
6建立数据流图表
该工具箱给予的recover_dictionary脚本制作会建立一个test数据库查询,并建立一些数据流图表供恢复查看应用。与此同时也会在当前目录建立dictionary文件目录,该目录下能存取数据词典信息内容。
7查看必须恢复的表的index_id信息内容
能够看见被truncate的表的index_id 为178,大家需要进一步从178 的page中获取信息。
8确定数据信息是不是存有
9提取page中的数据信息
提取数据信息以前,务必准备充分好表的表构造,因为这儿是truncate,因而表结构是普遍存在的,非常容易获得。我这里是检测,因此以前就备份了构造。
那麼如果是drop table 呢? 事实上大家还可以根据该专用工具来恢复表结构。
10载入数据信息到mysql server
11认证数据信息
我们可以见到,被truncate 掉的数据资料被取得成功恢复了回家。
这儿我检测的truncate table的情景,实际上针对drop table、delete table 恢复方式 均相近(已检测过)。此外,针对更为严重的drop database 实际上也是可以开展恢复的。
自然,针对真实的生产制造库而言,数据信息不一定可以恢复,由于有可能被遮盖而造成数据信息恢复不全。MySQL 针对区域的器重体制与Oracle 有较大差别,针对Oracle 来讲,如果是delete的数据信息,或是难以被遮盖掉的,针对drop 和truncate 则领导干部别论。但是MySQL则各有不同,MySQL 默认设置会运行一些purge 过程来实现室内空间器重,这也是MySQL 5.6的情况:
在MySQL 5.7 版本号中更加坑人,MySQL 默认设置会运行4个purge 进程,因而非常容易便会造成室内空间被器重,最后造成数据信息没法恢复,如下所示是MySQL 5.7的purge有关主要参数:
因而,一旦你遭受turncate table/drop table/delete /drop database等情况,提议马上终止服务项目或是终止数据库查询,保存当场,以避免自然环境进一步恶变,最后造成数据信息没法恢复的情况发生。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。