Mysql从FRM文件恢复表结构

写在前面

Mysql建立数据表时,会生成相应的文件(如:MYD,MYI,frm等),在这里我们主要探讨下使用frm文件恢复innodb和myisam类型表的结构,由于他们存储引擎的特性,所以恢复的方法也不一样。

准备工作

  • 建立test1数据库,主要用于生成错误日志
  • 建立test2数据库,主要用于插看create语句
  • 假设要恢复的表是access_token,对应的frm文件是access_token.frm,存储在/data/bak/目录下

恢复innodb类型数据表结构

  • 在test1数据库中建立access_token表,字段任意定1个
  • 关闭数据库服务(service mysqld stop),然后复制access_token.frm到test1中,覆盖刚建好的access_token表(cp /data/bak/access_token.frm /data/mysql/data/test1/)
  • 修改数据库配置文件(my.cnf),增加配置项innodb_force_recovery = 6进入恢复模式
  • 重启数据库服务(service mysqld start)
  • 进入test1数据库,执行(show create table access_token \G)或(desc access_token),此时会报错(TABLE ‘test1.access_token’ doesn’t exist)
  • 查看mysql日志(tail -n 100 /var/log/mysqld.log),会发现有个错误提示,test1.access_token包含1个字段,要恢复的文件包含6个字段,到此我们可以确定access_token原来有6个字段
  • 修改数据库配置文件(my.cnf),去掉配置项innodb_force_recovery = 6
  • 重启数据库服务(service mysqld restart)
  • 在test2数据库中建立access_token表,任意定6个字段
  • 关闭数据库服务(service mysqld stop),然后复制access_token.frm到test2中,覆盖刚建好的access_token表(cp /data/bak/access_token.frm /data/mysql/data/test2/)
  • 修改数据库配置文件(my.cnf),增加配置项innodb_force_recovery = 6进入恢复模式
  • 重启数据库服务(service mysqld start)
  • 进入test2数据库,执行(show create table access_token \G)可以得到表的create语句
  • 修改数据库配置文件(my.cnf),去掉配置项innodb_force_recovery = 6
  • 重启数据库服务(service mysqld restart)

整体的思路就是通过test1数据库恢复表产生的错误日志,获取原来表的字段个数,然后再在test2数据库中设置相同的字段个数来获取表的create语句。

恢复myisam类型数据表结构