InnoDB:尽管表的 .frm 文件存在,但无法从 InnoDB 的内部数据字典打开表

Posted

技术标签:

【中文标题】InnoDB:尽管表的 .frm 文件存在,但无法从 InnoDB 的内部数据字典打开表【英文标题】:InnoDB: Cannot open table from the internal data dictionary of InnoDB though the .frm file for the table exists 【发布时间】:2017-02-28 06:37:01 【问题描述】:

我正在运行带有 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 文件,而且,你知道……工作吗? 感觉好像某处只有一个值不合适,如果我能找到它,一切都会“弹出”回原位。

【问题讨论】:

既然这样的事情曾经发生过,你当然会确保你已经对所有这些宝贵的资源(数据库)进行了定期备份??跨度> 从来不知道该怎么做。问题是,所有的数据都在那里……为什么它看不到呢? 我不禁想到,在两次未遂 LOUD 警告之后,您应该放弃很多,但让我们从您发布相关部分开始,即您的 mysql error log 的结尾,这样我们就可以看到哪些错误MYSQL 正在报告 dl.dropboxusercontent.com/u/6621447/mysql.txt 你说你有很多数据库。是只有一个报告了这些错误还是所有这些错误? 【参考方案1】:

什么对我有用:

https://dba.stackexchange.com/a/42932

我的 dbs 是 InnoDB,所以 id 有问题,在升级 macos 时,我得到了这个。我将引用主要部分:

你必须有:

-ibdata1

-ib_logfile0

-ib_logfile1

-.FRM 来自 mysql_database 文件夹的文件

-您愿意销毁的 MAMP / MAMP Pro 的全新安装(如果需要)

    SSH 进入您的 Web 服务器(开发、生产,没有区别)并浏览到您的 mysql 文件夹(我的 Plesk 位于 /var/lib/mysql 在 Linux 上安装) 压缩mysql文件夹 下载 mysql 文件夹的存档,该文件夹应包含所有 mySQL 数据库,无论是 MyISAM 还是 innoDB(您可以 scp 这个文件,或移动 如果需要的话,这个到一个可下载的目录) 安装 MAMP(Mac、Apache、MySQL、PHP) 浏览到 /Applications/MAMP/db/mysql/ 将 /Applications/MAMP/db/mysql 备份到 zip 存档(以防万一)

    从生产服务器复制 mysql 文件夹存档中包含的所有文件夹和文件(在我的情况下为 mt Plesk 环境) 除非不要覆盖:

    -/Applications/MAMP/db/mysql/mysql/

    -/Applications/MAMP/db/mysql/mysql_upgrade_info

    -/Applications/MAMP/db/mysql/performance_schema

【讨论】:

【参考方案2】:

为我们做的工作是link(Restoring Orphan File-Per-Table ibd Files)。

简而言之,您可以:

ALTER TABLE ..... DISCARD TABLESPACE;

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

ALTER TABLE .... IMPORT TABLESPACE; SHOW WARNINGS; 

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

使用表定义创建新架构。 为所有表做丢弃表空间。 将新的 *.ibd 文件复制到新架构的右侧文件夹中。 为所有表执行 de import 表空间。

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

【讨论】:

【参考方案3】:

就我而言,我正在为 Percona_XtraDB_Cluster。所以,将备份的数据放到新mysql服务器的/var/lib/mysql目录后,我们做了下面的select查询,报错了。

$ mysql -uroot -p$MYSQL_ROOT_PASSWORD -h<NEW_SERVER_HOST_NAME> -e 'show columns from <MY_DB>.<MY_TABLE>'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1146 (42S02) at line 1: Table 'playground.equipment' doesn't exist

服务器日志是:

[Warning] InnoDB: Cannot open table <MY_DB>/<MY_TABLE> from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.

我们刚刚用新数据重新启动了容器。就是这样

【讨论】:

【参考方案4】:

只需将 slave_master_info.frm 重命名为 slave_master_info.BAK 即可。重启mysql服务。

【讨论】:

以上是关于InnoDB:尽管表的 .frm 文件存在,但无法从 InnoDB 的内部数据字典打开表的主要内容,如果未能解决你的问题,请参考以下文章

mysql中有表但是select后一直提示表不存在

mysql存储引擎索引实现

mysql存储引擎索引实现

Innodb 和 MyIsam 两种存储引擎的文件存储结构

重新安装mysql原来数据库的只剩下了.frm的问,怎么恢复的数据

Windows环境下Mysql如何快速导入或恢复表为innodb的数据