InnoDB:虽然该表的.frm文件存在,但无法从InnoDB的内部数据字典中打开表

Joh*_*der 6 mysql windows xampp

我正在使用XAMPP运行Windows 10,并在localhost上安装了几十个Drupal站点.几个月来一切都运转良好.

今天早上我在两天前从还原点执行了Windows还原,以摆脱不必要的Windows更新.在我这样做之后,我的MySQL停止了工作.我尝试删除该文件ibdata1(我现在知道这是一个坏主意),但是当事情变得更糟时,我恢复了ibdata1我删除的初始文件.所有表数据(.frm.ibd文件)仍然存在C:\xampp\mysql\data.现在MySQL至少会启动,但是所有的表都"消失了"......我可以在浏览器中加载phpMyAdmin,当我向左下拉数据库时,所有表都会显示...但是当我尝试点击时一,它告诉我"桌子没找到."

mysql_error.log有几个这样的错误InnoDB: Cannot open table mysql/slave_master_info from the internal data dictionary of InnoDB though the .frm file for the table exists.有一个在,理应告诉你如何解决这个问题的错误消息中提到的URL,但它不提供信息.

我不觉得 ibdata1被破坏......和所有有关数据恢复的文章很复杂的程度,是出奇的不相称问题.没有人有一个简单的拼写解决方案.我谷歌搜索错了吗?这种情况在我之前至少发生过两次,每次问题在我能够开始遵循我在网上找到的10个小时的程序之前自发地解决了.不幸的是,这次不是.当然我错过了一些简单的东西.我在几十个数据库中有数百个表,似乎没有必要尝试找到每个数据库的模式并手动插入,这是大多数恢复文章似乎建议的.

数据库不应该只知道如何阅读.frm.ibd文件,而且,你知道......工作吗?它感觉像有只有一个值出位的地方,如果我能找到它,一切都只是"啪"回原位.

小智 2

这个链接为我们做了什么(Restoring Orphan File-Per-Table ibd Files)。

简而言之,你会:

ALTER TABLE ..... DISCARD TABLESPACE;
Run Code Online (Sandbox Code Playgroud)

对于每个受影响的表。然后,对于每个受影响的表:

ALTER TABLE .... IMPORT TABLESPACE; SHOW WARNINGS; 
Run Code Online (Sandbox Code Playgroud)

您可以在同一架构上执行此操作,或者在其他数据库中创建新架构并复制所有 *.ibd 文件。在这种情况下:

  • 使用表定义创建新架构。
  • 对所有表执行丢弃表空间。
  • 将新的 *.ibd 文件复制到新架构的右侧文件夹中。
  • 为所有表删除导入表空间。

重要的!新架构最好与旧架构同名。