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;
最后
一定别随意移动表的存储位置. 当你不知道如何修改的时候.