how to recovery innodb from Pages from .idb (Part I)
时间:2010-08-22 来源:Steven1981
就像是ORACLE的DUL,MYSQL也有自己的数据抽取工具:Innodbrecoverytool。
他能根据表定义(table_defs.h),从数据表空间中抽取丢失的数据。
他可以在以下几种情况下恢复数据:
------------------------------------------
-- delete from table where 1=1
-- truncate table
-- drop table , ## need .ibd
-- corrupted tablespace.
在恢复过程中,我们主要用到以下几个工具:
------------------------------------------
--**`page_parser`**: 将表空间文件导出成N个多少16K大小的PAGE文件;
--**`constraints_parser`** 从以上产生的PAGE文件中,抽取数据;
--**`create_defs.pl`** 用PERL写的工具,可以用来产生表定义文件(table_defs.h),这个定义文件在恢复过中起关键作用。
他告诉constraints_parser,有哪些字段,字段的大小等信息。
恢复的基本过程如下:
------------------------------------------
STEP1:下载工具编码(https://launchpad.net/percona-innodb-recovery-tool),并解压到指定目录,tar xzvf .. ; ./configure
STEP2:找出该表主键的“index_id”,
STEP3: 得到表定义文件:table_defs.h (可以用create_defs.pl自动产生),并替换include/table_defs.h.
STEP4:编译percona-innodb-recovery-tool,make
STEP5:将数据表空间拆分成N个16K大小的PAGE(导出一次即可)
STEP6:用"constraints_parser"试着从一个PAGE(找到INDEX_ID相对应的文件夹)中找出你的数据
STEP7: 如果你觉得你的数据没有问题,那么你可以将所有的表连接起来(cat *.page > table.page),用此方法恢复所有的数据.
STEP8:重复STEP3-7,直到恢复你的所有表;
如何得到一个表主键的INDEX_ID
-----------------------------------------
|| CREATE TABLE innodb_table_monitor(x int) engine=innodb;
这里你观察mysql error.log,你会发现如下信息:
|| TABLE: name test/t1, id 0 237, columns 5, indexes 2, appr.rows 2
|| COLUMNS: id: DATA_INT DATA_BINARY_TYPE DATA_NOT_NULL len 4; name: type 12 len 300; DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; DB_ROLL_PTR: DATA_SYS prtype 258 len 7;
|| INDEX: name PRIMARY, id 0 442, fields 1/4, uniq 1, type 3
|| root page 3, appr.key vals 2, leaf pages 1, size pages 1
|| FIELDS: id DB_TRX_ID DB_ROLL_PTR name
|| INDEX: name t2_ind, id 0 443, fields 1/2, uniq 2, type 0
|| root page 4, appr.key vals 2, leaf pages 1, size pages 1
|| FIELDS: name id
这里我们可以看到表T1,TABLE_ID=237,
有两个INDEX: PRIMARY(INDEX_ID=442), t2_ind(INDEX_ID=443)
在恢复过程中我们会用到这个PRIMARY(INDEX_ID=442)
待续。。。。