MySQL从.ibd文件恢复数据
但愿你没有遇到这样糟糕的事情
最简单的情况需要四步
创建一个表确证与原始表结构一致:
CREATE TABLE <table_name> ...;
删除新建的表空间:
ALTER TABLE <table_name> DISCARD TABLESPACE;
复制待恢复的
.ibd文件到目标数据库文件夹下面并修改权限: cp <tablename>.ibd /var/lib/mysql/<database_name> cd /var/lib/mysql/<database_name> chown mysql:mysql <tablename>
导入表空间即
.ibd: ALTER TABLE <table_name> IMPORT TABLESPACE;
如果一切顺利,数据恢复至此完成:
SELECT * FROM <table_name> LIMIT 1;
也可能是更糟糕的情况 同样执行上面1 ~ 4步,但第4步失败,并提示如下:
InnoDB: Error: tablespace id in file
'<table_name>.ibd' is 30, but in the InnoDB
InnoDB: data dictionary it is 1.
OK,表空间的ID不匹配:新建的
删除新建的表:
DROP TABLE <table_name>;
新建28(=30-1)个表,
CREATE TABLE <tmp_table_name_x> ... ;
新建
, 此表将被分配的表空间ID为30, CREATE TABLE <table_name> ... ;
重复步骤2 ~ 4:
mysql> ALTER TABLE <table_name> DISCARD TABLESPACE; <-- 复制<table_name>.ibd文件并修改权限 --> mysql> ALTER TABLE <table_name> IMPORT TABLESPACE;
完成! 测试:
SELECT * FROM <table_name> LIMIT 1;
随笔
Q:表空间是什么?
A:表中数据存储的地方。以MySQL为例,在独立表空间模式下,一个表对应一个表空间,即
Q:数据存储目录在哪里?
A:默认位置/usr/lib/mysql。可以通过SQL命令查看: show variables like 'datadir';
Q:查看所有数据库?
A:SHOW DATABASES;
Q:查看所有表?
A:SHOW TABLES;
Q:导出表数据命令?
A:mysqldump -u<username> -p<password> <database> <table_name> > <table_name>.sql
Q:导入表数据命令?
A:mysql -u<username> -p<password> <database> < <table_name>.sql
LINK