有时候运维人员会直接拷贝数据库文件给我们,这个时候就需要把数据还原到mysql中,注意mysql版本要对应(也可以版本高一点),mysql所在的操作系统也注意最好一样(有一次window的到linux的mysql,就有部分表无法恢复),首先参考mysql数据储存文件个格式,

参考:mysql数据库引擎和他们文件存储介绍 。

  1. 针对myisam数据库引擎文件,每个表有.myd,.myi,.frm三个文件,这种数据库引擎的表很好恢复,直接把这三个文件复制到新的库中,有以下需要注意的地方。
  • 要文件的所有者修改为mysql,因为如果用root账号传输文件,文件的所有者就变成了root。
  • 还原到新库的mysql版本一定要跟原来的mysql版本一样,或者高一点也行。有一次还原到低一点的版本,总是报错,因为版本不同文件内部的存储格式可能会有变化。
  1. 针对innodb数据库引擎文件。这种数据库引擎分共享表空间和独立表空间。注意mysql版本也要对应或者新的mysql版本稍高一点也行。
  • 共享表空间,这种表空间有/var/lib/mysq/ibdata1和在数据库中的.frm文件,还有logfile,应该就是把这三种文件复制到新库中,也要注意传输文件后修改文件的拥有者。
  • 独立表空间,有ibdata1文件和每个表的.ibd、.frm文件,这种方式很简单,直接把文件复制到mysql的数据目录中,重启mysql即可。
  • 独立表空间,这种表空间的表文件都在每个库中,仅有.ibd,.frm文件,但知道表结构,恢复步骤有点复杂。
    1.修改/etc/my.cnf,修改如下两项的值,修改后重启mysql服务
innodb_file_per_table=1 #因为是独立表空间,这里要设置成独立表空间
innodb_force_recovery=1 #设置成1,好像是为了保护表数据

2.创建新数据库,创建要恢复表相同的表结构(表结构必须相同,表名称最好也相同),如果可以查看原来的表,可以使用命令:show create table xxx;查看。
3.进入xxx表的数据存储目录,把xxx.ibd复制到~目录下。
4.在mysql中执行alter table xxx discard tablespace; 进入xxx表的数据存储目录,查看xxx.ibd是否已经删除,未删除要手动删除。
5.把要恢复的表的ibd文件复制到xxx表的数据存储目录(相当于替换原来的表的ibd文件),注意把文件的所有者赋给mysql。
6.使用命令:vim -b ~/xxx.ibd,输入:%!xxd,将二进制转换成16进制查看,查看第3行的数据,如下是tablespace id是2

0000020: 0000 0000 0002 0000 0002 0000 0000 0000


7.使用命令:vim -b /var/lib/mysql/test/xxx.ibd,输入:%!xxd,把要恢复的xxx.id文件的这一行同样改成0002(有2个地方要改,第4列和第6列),改成相同的tablespace id(如果tablespace id在2个.ibd文件中不一样,不修改成相同的话就会在/var/log/mysqld.log中报错,说他们不一样,在mysql命令行行是报engine -1什么的错误),改完后输入:%!xxd -r,将16进制转换成2进制,再输入:x或者:wq保存。
8.在mysql中执行alter table xxx import tablespace; 然后就可以查看表的数据了。
参考:MySQL 5.6.26 通过frm & ibd 恢复数据过程

   MySQL ibdata损坏或丢失 通过frm&ibd文件恢复数据