情境:我有一个包含104个表的MySQL数据库,在windows 7的XAMPP上本地运行,所有的表都有InnoDB引擎。XAMPP MySQL正在作为windows服务运行。作为前端,我有PHP (CodeIgniter)。
问题:昨晚和往常一样,我停止了项目的工作,并正常关闭窗口。今天早上,浏览器中出现了错误table MY_TALBE does not exists。控制台上的show tables显示表名,但desc MY_TABLE和select * from MY_TABLE表示unknown table。我试过create table MY_TABLE(...),但错误是table MY_TABLE already exists,所以我尝试了drop table MY_TABLE,但它说的是Unknown table MY_TABLE!我尝试了mysqlcheck.exe进行修复和检查,两者都失败了,但在那之后,show tables不再显示表名了。我需要指出的是,我没有更改/移动/删除/重命名任何mysql文件。
问:是否有可能恢复/修复MY_TABLE,或者至少如何重新删除和创建它(而不需要删除数据库并再次对其进行重新分析)?
发布于 2014-04-06 22:50:31
这种情况听起来很像我两年前回复的帖子(InnoDB表SELECT返回错误2006 (返回错误):MySQL服务器已消失(停电后))
首先,这里是InnoDB体系结构

在那篇文章中,我基本上指出,表的元数据仍然存在于系统表空间文件ibdata1中。
运行SHOW TABLES;时,mysqld所做的全部工作就是报告.frm文件。可以将表创建为MyISAM,因为它没有ibdata1或任何其他元数据的附件。但是,您不能将其转换为InnoDB,因为元数据会以某种方式想象.frm和某些tablespace_id被附加到表名。根据我以前的帖子,我只想转储所有其他的表,并称您为失败的原因。然而,Percona有数据恢复工具包正是在这种情况下。
在有关数据恢复工具包的网页里说
用于InnoDB的Percona数据恢复工具是用于从InnoDB表中恢复丢失或损坏数据的免费工具包。它提供了一种方法,当标准的InnoDB恢复由于某些原因而无法使用时,从文件或原始设备中提取InnoDB的数据,这些文件或原始设备是由制表符分隔的格式,例如删除的表或严重的损坏,从而阻止InnoDB识别数据。它可用于MySQL恢复,以检索已删除的表,恢复更新后的行的以前版本,或修复硬件故障(如内存故障或不良布线)后的InnoDB文件损坏。Percona使用这些工具为许多客户执行MySQL数据恢复,包括非常大的数据集。尽管这些工具功能强大,但是正确地执行InnoDB数据恢复需要InnoDB存储格式和源代码的专家知识,再加上经验和直觉。Percona可以帮助我们的数据恢复服务。
我没有用过,但是如果Percona成功了,你应该试一试。
如果您有丢失表的备份(以mysqldump的形式),则应该执行我以前的帖子中的步骤,然后加载丢失表的备份。
一旦解决了这种情况,就应该对InnoDB进行调优以将更改刷新到磁盘上。
[mysqld]
innodb_fast_shutdown=0
innodb_max_dirty_pages_pct=0
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1这样,当您关闭mysql时,InnoDB可以更彻底地刷新更改。
如果您想要更好地保证将InnoDB刷新到磁盘,那么您应该在Linux中使用MySQL。
发布于 2014-04-06 20:07:17
您可以尝试根据旧表的结构创建一个新表。不确定这是否真的有帮助,因为您说原始表已损坏:
CREATE TABLE `new_table` LIKE `MY_TABLE`;如果新表没有问题,您可以删除旧表:
DROP TABLE `MY_TABLE`;否则,您将不得不删除该表(使用上面的命令)并手动或从备份重新创建它。
https://dba.stackexchange.com/questions/62623
复制相似问题