所以我有一个在复制流上设置的测试数据库服务器。通过名称进行优化,很快就填满了从属数据目录上的空间。Mysql 尽职尽责地只是等待更多的空间。

这个datadir是一个文件系统,仅用作mysql的datadir,因此没有其他任何东西可以释放。

我有一个 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

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

我能做些什么来从这个点上恢复过来吗?如果需要的话,我可以从头开始重建它,但我很好奇其他人对这次冒险的总体看法。我采取的一系列步骤是否会带来更完美的结果?

如果这不是测试服务器,我无法“实时运行”并看看会发生什么?如果我不得不这样做,那么临时释放生产从站空间的最佳方法是什么?

有帮助吗?

解决方案

大多数人忘记的关于 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 。我们使用了它并且它有很大帮助。我希望它对你有帮助。

其他提示

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

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

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

我刷新 http:// localhost/mywebsite

哇,哇...正在工作...

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top