MySQL数据恢复

前言
MySQL的数据库其相关文件都会存放在安装目录下,linux下为/val/lib/mysql文件夹中,不同的存储引擎创建的表其文件也不一样,下面来认识下这些数据库文件。因为MySQL5.6之后默认的搜索引擎为Innodb,所以这里主要介绍如何使用frm文件和ibd文件来恢复数据。

db.opt
用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。

.frm
与表相关的元数据信息都存放在.frm文件中,主要是表结构的定义信息,不论什么存储引擎,每一个表都会有一个以表名命名的.frm文件

.ibd和.ibdata
两者都是专属于InnoDB存储引擎的数据库文件。
当采用共享表空间时所有InnoDB表的数据均存放在.ibdata中,所以当表越来越多时,这个文件会变得很大;
相对应的.ibd就是采用独享表空间时InnoDB表的数据文件。
修改为独享表空间的方法是在my.ini配置文件中添加/修改此条:
Innodb_file_per_table=1
注意MySQL-5.7是默认独享表空间的,不用特意在配置文件中添加,同时MySQL-5.7是默认为Innodb搜索引擎

如果是MyISAM存储引擎,直接拷贝.frm、.MYD、.MYI到新的库文件夹下就行了,简直方便快捷简单易用。但现在MySQL在不配置的情况下默认的存储引擎是InnoDB,说明它还是有优越性在的。具体两者的差异有空另起一篇或者网上查查资料吧,三言两语说不清楚,这里就不展开了。
当然,能点进这篇博客的肯定是想看InnoDB表的数据恢复,尤其是丢失了.ibdata文件的情况下。

一、恢复表结构
首要的一件事情就是恢复表结构,如果很幸运地保留了当时的表结构,此步可跳过。

1.1 随意创建一张同名表
CREATE TABLE signatures(a int)ENGINE=InnoDB;

1.2 关闭mysql服务
service mysqld stop

1.3 复制备份的.frm覆盖新建的表.frm(这里复制过来的frm所属可能不是mysql,不过没有关系)

1.4 开启mysql服务
service mysqld start

1.5 查看表结构(desc +表名),使用cat /var/log/mysqld.log 查看mysql的日志
这是mysql的错误日志,找到诸如
2018-01-09T08:19:46.170814Z 3 [Warning] InnoDB: Table test/signatures contains 1 user defined columns in InnoDB, but 15 columns in MySQL. Please check INFORMATION_SCHEMA.INNODB_SYS_COLUMNS
的记录,发现原表拥有15个字段。

1.6 删除当前表,新建一张拥有6个字段的同名表
mysql> drop table gignatures
Query OK, 0 rows affected (0.26 sec)

create table signatures(a1 int,a2 int,a3 int,a4 int,a5 int,a6 int,a7 int,a8 int,a9 int,a10 int,a11 int,a12 int,a13 int,a14 int,a15 int)
Query OK, 0 rows affected (0.66 sec)

1.7 重复步骤1.2-1.3
修改配置文件my.ini在[mysqld]下添加/修改innodb_force_recovery=6(表明是要进行表的修复,关于innodb_force_recovery可以自行搜索)

1.8 启动mysql服务,查看表结构,发现表结构已经恢复
MySQL数据恢复_第1张图片
导出表结构,退出mysql,在命令提示符下输入
mysqldump -uroot -p123456 test signatures> signatures.sql
或者使用show create table signatures来查看建表语句

1.9 停止mysql服务,修改配置文件my.ini
修改innodb_force_recovery=0或者直接注释掉。

2.0 启动mysql服务,删掉这张表,用获得的建表语句新建表(或者使用导出的sql文件,在mysql指示符下,使用source + 文件路径)
至此,表结构已经完全恢复。

二、恢复表数据
2.1 分离表空间
使当前.ibd的数据文件和.frm分离。
ALTER TABLE signatures DISCARD TABLESPACE
2.2 复制备份的.ibd文件覆盖新的表数据,修改ibd所属为mysql
2.3 重新建立新的连接
ALTER TABLE signatures IMPORT TABLESPACE;
至此,数据恢复完毕。

三、如果按上述方式,最后使用import tablespace导入表数据,出现ERROR2003或者其它各种错误,可能是数据库安装的问题。笔者之前是在Ubuntu16.04下进行数据恢复,但是到最后一步就出问题,之后转移到CentOS7下,结果发现还是不行,最后发现CentOS7本身带有一个数据库mariadb,需要将它卸载,之后再安装mysql,然后成功恢复数据。关于CentOS7中mysql的安装,请移步CentOS7安装mysql

你可能感兴趣的:(mysql)