Situation: I have a MySQL database with 104 tables, running locally on XAMPP on windows 7. All the tables have InnoDB engine. XAMPP MySQL is running as windows service. As front end I have PHP (CodeIgniter).
Problem: Last night as usual I stopped working on the project and shutdown the windows normally. Today in the morning I got error table MY_TALBE does not exists
in the browser. show tables
on console shows the table name, but desc MY_TABLE
and select * from MY_TABLE
says unknown table
. I tried create table MY_TABLE(...)
but I had error as table MY_TABLE already exists
, so I tried drop table MY_TABLE
but it said Unknown table MY_TABLE
! I tried mysqlcheck.exe for repair and check, they failed both, but after that, show tables
does not show the table name any longer. I need to mention I did not change/move/delete/rename any of mysql files.
Question: Is it possible to recover/repair MY_TABLE
, or at least how to drop and create it again (without dropping the database and re-crteating it again)?
Best Answer
This situation sounds a lot like a post I answered two years ago (InnoDB table SELECT returns ERROR 2006 (HY000): MySQL server has gone away (after power outage))
First, here is the InnoDB Architecture
In that post, I basically point out that the metadata of the table is still present inside the system tablespace file ibdata1.
When you ran
SHOW TABLES;
, all mysqld did was report the.frm
files. It is possible to create the table as MyISAM because it has no attachments to ibdata1 or any other metadata. Yet, you cannot convert it to InnoDB because the metadata somehow imagines that the.frm
and some tablespace_id is attached to the table name. Based on my old post, I would just mysqldump all the other tables and call you table a lost cause. However, Percona has the Data Recovery Toolkit for just such an occasion.In the webpage about the Data Recovery Toolkit says
I have not used it, but if Percona made it, you should give it a try.
If you have a backup of that lost table (in the form of a mysqldump), you should carry out the steps from my old post and then load the backup of the lost table.
SUGGESTION
Once you get this situation squared away, you should tune InnoDB to flush changes to disk.
That way, when you shutdown mysql, InnoDB can more thoroughly flush changes.
If you want even better assurance of InnoDB being flushed to disk, you should use MySQL in Linux.