ibdata1这个是mysql的表空间文件. 主要存放数据字典, undo日志等.为什么会需要恢复这个文件呢. 先说一下我们遇到的情况.

表象

当我们删除一个表时, 直接提示表不存在. 但在show tables命令中能够看到表. 或者当我们执行desc或者select的时候. 明明有看到表, 却提示表不存在了. 这个时候就是表空间出了故障. 就需要恢复了.

恢复前提

首先, 我们恢复的前提有如下几个配置.

innodb_file_per_table on;

需要采用独立表空间来进行处理. 如果使用系统表空间. 那就不需要往下看了. 就此打住即可. mysql使用5.7版本. 如果满足以上的前提. 我们就可以开始我们的恢复步骤了.

恢复步骤

总的来说, 如果我们需要恢复表空间. 大致分为如下几步.

1. 备份原有的数据库文件. 及数据库的.frm和.ibd文件. 
2. 从原有的数据库文件导出数据库包含的表结构信息.
3. 干掉该数据库. 并重建数据库.
4. 导入数据库包行的表结构.
5. 分离表空间. 及保存.frm文件.
6. 复制原来的.ibd至新的数据库目录下.
7. 导入表空间

备份数据文件

首先找到我们的数据文件. 可以通过以下两种方式进行查看. 1. 执行sql命令

show variables like '%datadir%';

2.找到my.cnf数据库配置文件中查找datadir. 找到过后直接进入目录, 找到需要恢复的数据库目录名. cp操作就可以了.

备份表结构

当我们cp完过后, 就需要备份表结构了. 由于原来的库的表空间出现问题. 不一定能拿到表结构信息. 所以我们通过采用MySQL Utilities工具直接导出. 安装MySQL Utilities工具集.

wget -c https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
tar -zxvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5 && python setup.py build
python setup.py install

安装完成过后, 使用如下命令生成建表语句.

mysqlfrm --basedir=/usr/ --port=3306 --user=root 需要恢复的数据库文件夹位置 > 文件.sql

这样备份出来的还缺少分号(;). 请自行补全分号.

重建数据库

使用如下的命令进行重建

drop database 数据库名;
create database 数据库名 charset=字符集;

导入原始的表

// sql命令
source 文件名;

分离表空间

使用如下命令进行表空间分离.

alter table 表名 discard tablespace;

注意, 一旦执行这一步过后. 该数据库目录下的文件就没有了ibd文件. 这是很就需要将原来的ibd文件进行复制了.

复制.ibd文件

直接使用cp命令即可.

恢复表空间

使用如下命令

alter table 表名 import tablespace;

最后

一定别随意移动表的存储位置. 当你不知道如何修改的时候.


adolph
1k 声望11 粉丝

放低心态,拥抱未来