MySQL从.ibd文件恢复数据

最简单的情况需要四步

  1. 创建一个表确证与原始表结构一致: CREATE TABLE <table_name> ...;
  2. 删除新建的表空间: ALTER TABLE <table_name> DISCARD TABLESPACE;
  3. 复制待恢复的<table_name>.ibd文件到目标数据库文件夹下面并修改权限:
cp <tablename>.ibd /var/lib/mysql/<database_name>
cd /var/lib/mysql/<database_name>
chown mysql:mysql <tablename>
  1. 导入表空间即<table_name>.ibd: ALTER TABLE <table_name> IMPORT TABLESPACE;
  2. 如果一切顺利,数据恢复至此完成: 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不匹配:新建的<table_name>对应表空间ID=1,而<table_name>.ibd对应表空间ID=30。需要继续执行以下步骤:

  1. 删除新建的表: DROP TABLE <table_name>;
  2. 新建28(=30-1)个表,CREATE TABLE <tmp_table_name_x> ... ;
  3. 新建<table_name>, 此表将被分配的表空间ID为30,CREATE TABLE <table_name> ... ;
  4. 重复步骤2 ~ 4:
mysql> ALTER TABLE <table_name> DISCARD TABLESPACE;
<-- 复制<table_name>.ibd文件并修改权限 -->
mysql> ALTER TABLE <table_name> IMPORT TABLESPACE;
  1. 完成! 测试: SELECT * FROM <table_name> LIMIT 1;

随笔

Q:表空间是什么?
A:表中数据存储的地方。以MySQL为例,在独立表空间模式下,一个表对应一个表空间,即<table_name>.ibd。
Q:数据存储目录在哪里?
A:默认位置/usr/lib/mysql。可以通过SQL命令查看:show variables like 'datadir';
Q:导出表数据命令?
A:mysqldump -u<username> -p<password> <database> <table_name> > <table_name>.sql
Q:导入表数据命令?
A:mysql -u<username> -p<password> <database> < <table_name>.sql

原文链接: 原文.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值