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 的内部数据字典打开表的主要内容,如果未能解决你的问题,请参考以下文章