有客户在做迁移的时候,不慎把存放mysql数据库的硬盘进行了重新分区格式化,重新初始化mysql,并且导入了部分历史数据,不能满足客户需求,希望我们帮忙进行数据恢复.里面大概有100套左右mysql数据库,每个库里面表结构相同,数据不一样.接手这个故障,第一操作就是对磁盘进行镜像,然后使用恢复工具进行底层分析,尝试从文件系统层面恢复出来被格式化之前的数据库文件(需要有对应库目录,不然也没有意义,因为每个库里面表结构一样的,没有正确的库名字无法做到有效的区分),通过底层扫描分析,没有发现一个有效数据文件
对于这样的情况,只能寄希望于mysql 数据块层面扫描恢复,通过工具扫描发现大量的数据块page文件
然后尝试分析字典信息,主要是对于0000000000000001.page对应的表创建语句为:
CREATE
TABLE
`SYS_TABLES` (
`
NAME
`
varchar
(255)
NOT
NULL
DEFAULT
''
,
`ID`
bigint
(20) unsigned
NOT
NULL
DEFAULT
'0'
,
`N_COLS`
int
(10)
DEFAULT
NULL
,
`TYPE`
int
(10) unsigned
DEFAULT
NULL
,
`MIX_ID`
bigint
(20) unsigned
DEFAULT
NULL
,
`MIX_LEN`
int
(10) unsigned
DEFAULT
NULL
,
`CLUSTER_NAME`
varchar
(255)
DEFAULT
NULL
,
`
SPACE
`
int
(10) unsigned
DEFAULT
NULL
,
PRIMARY
KEY
(`
NAME
`)
) ENGINE=InnoDB
DEFAULT
CHARSET=latin1;
通过上述信息可以获取到name和id列的值(其中name中包含库名/表名),然后再通过0000000000000003.page文件结合对应的表创建语句:
CREATE
TABLE
`SYS_INDEXES` (
`TABLE_ID`
bigint
(20) unsigned
NOT
NULL
DEFAULT
'0'
,
`ID`
bigint
(20) unsigned
NOT
NULL
DEFAULT
'0'
,
`
NAME
`
varchar
(120)
DEFAULT
NULL
,
`N_FIELDS`
int
(10) unsigned
DEFAULT
NULL
,
`TYPE`
int
(10) unsigned
DEFAULT
NULL
,
`
SPACE
`
int
(10) unsigned
DEFAULT
NULL
,
`PAGE_NO`
int
(10) unsigned
DEFAULT
NULL
,
PRIMARY
KEY
(`TABLE_ID`,`ID`)
) ENGINE=InnoDB
DEFAULT
CHARSET=latin1;
这个主要是或者表id和page id的对应关系(表id直接关联SYS_TABLES.ID,然后获取SYS_TABLES.NAME和SYS_INDEXES.ID对应关系,从而可以确定每一个表对应的需要恢复的page文件信息,再通过客户提供的表语句和对应的page关系,实现相关数据恢复,具体操作可以参考以往类似文章:MySQL drop database恢复(恢复方法同样适用MySQL drop table,delete,truncate table)