海力源码logo图片
400电话图片
热门关键词:  响应式网站    设计网站    营销型网站   
源码资讯
当前位置:首页 > 源码资讯 > MySQL数据库InnoDB数据恢复工具的使用小结详解

MySQL数据库InnoDB数据恢复工具的使用小结详解

资讯来源:海力源码    点击次数:199    更新时间:2022-9-15 10:22:02
本文从实际使用经验出发,介绍一款开源的MySQL数据库InnoDB数据恢复工具:innodb-tools,它通过从原始数据文件中提取表的行记录,实现从丢失的或者被毁坏的MySQL表中恢复数据。例如,当你不小心执行DROP TABLE、TRUNCATE TABLE或者DROP DATABASE之后,可以通过以下方式恢复数据。 以下内容大部分参考自:Percona Data Recovery Tool for InnoDB,文档是英文的,而且写的比较晦涩,这里是个人的实战经验总结,供大家参考学习。 在介绍innodb-tools工具进行数据恢复之前,首先明确以下几点: 1、这个工具只能对InnoDB/XtraDB表有效,而无法恢复MyISAM表(注: Percona号称有一套用于恢复MyISAM表的工具,但是本人未做尝试)。 2、这个工具是以保存的MySQL数据文件进行恢复的,而不用MySQL Server运行。 3、不能保证数据总一定可被恢复。例如,被重写的数据不能被恢复,这种情况下可能需要针对系统或物理的方式来恢复,不属于本工具的范畴。 4、恢复的最好时机是当你发现数据丢失时,尽快备份MySQL数据文件。 5、使用这个工具需要手动做一些工作,并不是全自动完成的。 6、恢复过程依赖于你对丢失数据的了解程度,在恢复过程中可能需要在不同版本的数据之间做出选择。那么如果你越了解自己的数据,恢复的可能性就越大。 接下来,下面通过一个例子来介绍如何通过这个工具进行恢复。 1. 前提条件 首先,需要理解的是innodb-tools工具不是通过连接到在线的database进行数据恢复,而是通过离线拷贝数据的方式进行的。注意:不要在MySQL运行的时候,直接拷贝InnoDB文件,这样是不安全的,会影响数据恢复过程。 为了完成数据恢复,必须知道将要被恢复的表结构(列名、数据类型)。最简单的方式就是SHOW CREATE TABLE,当然后续会介绍几种可替代的方式。因此,如果有一个MySQL server作为备份,即使数据是很早的甚至表中没有记录,可以有助于使用innodb-tools工具进行恢复。不过这个不是必须的。 2. 简单例子 复制代码 代码如下:     mysql> TRUNCATE TABLE customer;     3. 构建工具 为了构建innodb-tools工具,需要依赖于C编译器、make工具等。 1、下载解压innodb-tools工具源码: 复制代码 代码如下:     wget https://launchpad.net/percona-data-recovery-tool-for-innodb/trunk/release-0.5/+download/percona-data-recovery-tool-for-innodb-0.5.tar.gztar -zxvf percona-data-recovery-tool-for-innodb-0.5.tar.gz     2、进入解压后根目录下的mysql-source目录,运行配置命令(注:不运行make命令): 复制代码 代码如下:     cd percona-data-recovery-tool-for-innodb-0.5/mysql-source ./configure     3、完成配置步骤后,回到解压后的根目录,运行make命令,编译生成page_parser和constraints_parser工具: 复制代码 代码如下:     cd .. make     page_parser工具将根据InnoDB的底层实现原理,解析表的页和行结构。constraints_parser工具暂时不使用,后续还需要在定义表结构之后,重新编译生成它。 如果编译过程中出现问题,点击这里。本文使用过程中没有出现问题,故不再一一列举。 4. 提取需要的页 InnoDB页的默认大小是16K,每个页属于一个特定表中的一个特定的index。page_parser工具通过读取数据文件,根据页头中的index ID,拷贝每个页到一个单独的文件中。 如果你的MySQL server被配置为innodb_file_per_table=1,那么系统已经帮你实现上述过程。所有需要的页都在.ibd文件,而且通常你不需要再切分它。然而,如果.ibd文件中可能包含多个index,那么将页单独切分开还是有必要的。如果MySQL server没有配置innodb_file_per_table,那么数据会被保存在一个全局的表命名空间(通常是一个名为ibdata1的文件,本文属于这种情况),这时候就需要按页对文件进行切分。 4.1 切分页 运行page_parser工具进行切分: •如果MySQL是5.0之前的版本,InnoDB采取的是REDUNDANT格式,运行以下命令: 复制代码 代码如下:     ./page_parser -4 -f /path/to/ibdata1     •如果MySQL是5.0版本,InnoDB采取的是COMPACT格式,运行以下命令: 复制代码 代码如下:     ./page_parser -5 -f /path/to/ibdata1     运行后,page_parser工具会创建一个pages-<TIMESTAMP>的目录,其中TIMESTAMP是UNIX系统时间戳。在这个目录下,为每个index ID,以页的index ID创建一个子目录。例如: 复制代码 代码如下:     pages-1330842944/FIL_PAGE_INDEX/0-1/1-00000008.page pages-1330842944/FIL_PAGE_INDEX/0-1/6-00000008.page      4.2 选择需要的Index ID 一般来说,我们需要根据表的主键(PRIMARY index)进行恢复,主键中包含了所有的行。以下是一些可以实现的步骤: 如果数据库仍处于运行状态,并且表没有被drop掉,那么可以启动InnoDB Tablespace Monitor,输出所有表和indexes,index IDs到MySQL server的错误日志文件。创建innodb_table_monitor表用于收集innodb存储引擎表及其索引的存储方式: 复制代码 代码如下:  

  • 海力源码手机版
  •  联系客服小美