如何恢复文件被移动到的InnoDB表


13

所以我有一个在复制流上安装的测试数据库服务器。顾名思义,优化过程很快就被填补了从属数据目录上的空间。MySQL尽职尽责地只是在等待更多的空间。

该数据目录是仅用作mysql的数据目录的文件系统,因此没有其他可释放的内容。

我有一个4 gig innodb测试表,它不是复制流的一部分,所以我想尝试一些方法来查看它是否可以工作,并且作为测试环境,我不太担心事情出了什么问题。

这是我采取的步骤

  1. 弄丢了我要移动的桌子
  2. 在其上放置一个读锁(即使没有任何写入,并且不在复制流中)
  3. 将.frm和.ibd复制到带有一些备用空间的文件系统中
  4. 解锁桌子
  5. 删减了该表-释放了足够的空间以使优化完成,复制开始重新进行。
  6. 停止奴隶/关闭mysql
  7. 将文件从tmp中复制回数据目录
  8. 重启mysql

.err日志中没有任何显示,一切看起来不错。我连接并使用mydb;并在显示表中查看我正在弄乱的表。但是,如果我尝试

select * from testtable limit 10;

我得到错误

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

从目前为止我所知道的,我可以从其他所有表中读取数据,并且复制开始备份而没有任何抱怨。

从这一点上我有什么办法可以恢复?如果需要,我可以从头开始重建它,但是很好奇其他人对该企业的总体看法。关于我采取的一系列步骤,如果没有更完美的结果,是否有任何结果?

如果这不是测试服务器,我不能只是“实时运行”并看看会发生什么?如果我愿意,最好的方法是暂时释放生产从属服务器上的空间?

Answers:


15

大多数人对TRUNCATE TABLE忘记的最大事情是TRUNCATE TABLE是DDL而不是DML。在InnoDB中,ibdata1中的元数据包含一个编号列表的InnoDB表。使用TRUNCATE TABLE会导致InnoDB表的内部元数据ID移位。发生这种情况是因为TRUNCATE TABLE有效地执行了以下操作:

示例:截断名为mydb.mytb的InnoDB表

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

因此,新的mytb将具有不同的内部元数据ID。

将.ibd文件复制到其他位置时,.ibd中将包含原始内部元数据ID。简单地放回.ibd文件不会导致内部元数据id与ibdata1中的内部元数据id的协调。

您应该做的是:

复制InnoDB表的.ibd文件。然后,运行这个

ALTER TABLE tablename DISCARD TABLESPACE;

要稍后将其恢复,请将.ibd文件复制回datadir,然后运行

ALTER TABLE tablename IMPORT TABLESPACE;

这样可以保留内部元数据ID。

确保.frm始终存在。

我曾经以一个相同的方式帮助客户恢复了30个InnoDB表。我不得不使用另一个数据库服务器,并通过添加和删除InnoDB表来玩一些游戏,以寻找正确的内部元数据ID。

客户端找到了这篇文章:http : //www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file。我们使用了它,对它有很大帮助。希望对您有帮助。


1
我有2个数据库,所有表都说Table 'X' doesn't exist in engine。我是否必须对每个表都执行上述方法,还是有更好的方法来解决此问题?
papanito

-2

我在Mac上使用过,在卖给朋友之前,只需将XAMPP文件夹仅复制到我的硬盘上即可。(不成功)不幸的是,这给我带来了麻烦,因为我尝试了以下步骤:-我安装了全新的XAMPP并将整个\ httdocs和var \ mysql复制到我的新Mac(仅包含.frm和.ibd的那些db),不起作用,我仍然无法访问PHPMyAdmin中的表...-我试图安装相同的xampp版本并重复上述步骤,但仍然不起作用。-决定上床睡觉。

(成功)-今天早上,我带来了备份磁盘,并尝试使用Windows7。-安装用于Windows的最新XAMPP,c:\ xampp-我从备份\ httdocs中获得了一个网站(文件夹),并且在\中有相应的数据库文件夹var \ mysql在Windows 7中已经准备就绪,我只想尝试一个网站,然后尝试其余网站,因为我在httdocs \和\ var \ mysql中有很多项目-我将提及的httdocs \文件夹复制到Windows c:\ xampp \ httdocs并将\ var \ mysql复制到c:\ xampp \ mysql \ data

我还没有将ib_logfile0,ib_logfile1,ibdata1从备份文件复制到Windows xampp c:\ xampp \ mysql \ data

我刷新了http:// localhost / mywebsite

WOW WOW DONE ...正在运作...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.