MySQL > Table doesn't exist. But it does (or it should)
Asked Answered
C

34

299

I changed the datadir of a MySQL installation and all the bases moved correctly except for one. I can connect and USE the database. SHOW TABLES also returns me all the tables correctly, and the files of each table exists on the MySQL data directory.

However, when I try to SELECT something from the table, I get an error message that the table does not exist. Yet, this does not make sense since I was able to show the same table through SHOW TABLES statement.

My guess is that SHOW TABLES lists file existence but does not check whether a file is corrupted or not. Consequently, I can list those files but not access them.

Nevertheless, it is merely a guess. I have never seen this before. Now, I cannot restart the database for testing, but every other application that uses it is running fine. But that's just a guess, I've never seen this before.

Does anyone know why this is happening?

Example:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist
Cargian answered 13/10, 2011 at 19:7 Comment(12)
have you restore the database from a backup? or you just copied the db files? do you have root access to the mysql server?Edrick
just copied the files! yes i have root access to everythingCargian
can you try: mysql_fix_privilege_tablesEdrick
I will, but I'll have to restart the server after that, right? Just cant do it now :sCargian
are these innodb tables?Leoni
Yes, all tables are InnoDB. My bad for not saying it!Cargian
I missed the part that you moved your data folder in my first reading... Now that you have confirmed that problem revolves around InnoDB tables, take a look here: bugs.mysql.com/bug.php?id=14582 Creating these tables and then overwriting .frm files should solve your problem.Denby
It is better to export the SQL and import it on the new DatabaseLewanna
I don't have a solution, but I do have another mysterious example of how to make the error appear. I have a stand-alone project that reads some WordPress tables and reads and writes some other tables on the same database. It was working fine until I included wp-load.php ( I will need to call some wp methods). With that include I start getting a "Table doesn't exist" on every query of my tables.Sharpedged
My problem (including Wordpress wp-load.php) was due to a clash of variables. I had used $table_prefix to make my table names unique. Wordpress used the same variable name, overriding mine! The table, with that wrong name, really did not exist. I hope this helps some one.Sharpedged
You should follow: dev.mysql.com/doc/refman/5.6/en/…Rosenkrantz
In the future please look at the log files, in order to share a relevant line. Probably in your system you had something like ` [Warning] InnoDB: Load table foo.bar failed, the table has missing foreign key indexes.` as seen in one of the answers. I am writing this message in this old question because no one in the comments has yet said that it is a good practice to look at log files. Thank you!Danaides
L
290

Just in case anyone still cares:

I had the same issue after copying a database directory directly using command

cp -r /path/to/my/database /var/lib/mysql/new_database

If you do this with a database that uses InnoDB tables, you will get this crazy 'table does not exist' error mentioned above.

The issue is that you need the ib* files in the root of the MySQL datadir (e.g. ibdata1, ib_logfile0 and ib_logfile1).

When I copied those it worked for me.

Leal answered 27/7, 2012 at 21:46 Comment(23)
Saved my life! For anyone else just be sure not to overwrite the existing ib* files if you're trying to copy to a new installation. Backup your existing mysql/ directory, replace with the old one you want to recover, mysqldump everything, then restore the fresh mysql/. Then you can import the mysqldumps properly.Plicate
On Mac to replicate my database locally, in addition to copying over the ibdata file (located next to the database dir) I had to chown _mysql:wheel the databasename dir, ibdata and all files in the dir (use chown -R ...). Similarly, the permissions were incorrect inside the dir so chmod -R 660 databasename was needed to get tables to show up in the datatbase.Periodicity
Thanks Mike. Just to clarify you will need to restart the mysql service to get this working. At least I did, and thank goodness it worked. A lot of data saved there!Jarvey
Miky, you are great, i formatted my comp and and restored "data" folder...and craaaaaap almost 90% databases had no tables inside...i was doomed...love you dude thanksHarrington
i made a fresh installation . but when i am importing my database i am getting this error for my stored procedureLeahy
Rock on - was having this very issue and copied the files. Working now.Chum
NOTE: Do not forget to use chown!!! So, all after cp use this command -> chown mysql:mysql /var/lib/mysql/ -RSuppressive
NOTE 2: Do not forget to apply proper permission. In my case sudo chmod -R 600 /var/lib/mysql Ignoble
I've just reinstalled XAMPP on Mac, it seems no paths were changed. I still have such an error, I have all the three ib* files in the /Applications/XAMPP/xamppfiles/var/mysql/ directory, but it doesn't work.Cliffordclift
Lifesaver! When MySQL died during the Ubuntu upgrade to 15.04 this was the final piece in the recovery puzzle. Thank you.Straddle
What if the target server already has these files in the /var/lib/mysql folder ? I am worried that i will break something if I replace these.Lucais
kentor, found what happens?Corsage
That's why it is better to export the SQL and import it on the new DatabaseLewanna
Thank you so much. This saved my butt trying to set up replication.Expediency
Why isn't this answer accepted? Humm, OP's profile shows "Last seen Oct 31 '11 at 15:05"Nones
It works!. Great solution for my envoriment (OsX Sierra and brew setup)!Paolo
Those crazy (pity) errors are the "price" to pay for those kind of "free" product :'(Euhemerism
This also happened to me after restoring a DB by copying over the data folder. Setting that folder to be owned and group-owned by mysql allowed my DB client to see all the data again.Litch
After copying the ib* files, I am getting a checksum error: InnoDB: Error: checksum mismatch in data file ./ibdata1. How does one recover from those?Villainy
this saved my life... I was using docker to run mysql, so I copied the data file: /home/Oliver/db_data to another folder , and restart the docker, mapping the data folder to the new folder, everything works...Comminute
Don't make the mistake of renaming the database when you bring the mysql folder into the tmp folder. I did that and I kept on getting errors when restarting the mysql server.Quiff
Worked for me, It took 2 days to figure this out :)Kaykaya
...and what if we lost the ib_log* files and we have ONLY the database folder? asking for a friend...Pyro
T
48

For me on Mac OS (MySQL DMG Installation) a simple restart of the MySQL server solved the problem. I am guessing the hibernation caused it.

Tolbert answered 12/2, 2014 at 12:38 Comment(5)
Thanks fixed the same issue for me as well. Mine happened after my machine shut down due to a sudden power loss. After the first machine restart/MySQL startup, I got the error. Then, I read this answer. I stopped/started MySQL through System Preferences and it was fixed.Plan
sudo /usr/local/mysql/support-files/mysql.server restartPlauen
Likewise. I ran into this after upgrading to macOS Sierra 10.12.6. Not certain there's a causal link, but the timing seems suspicious.Swee
Thanks, worked to some extent; i restarted the (5.6, windows) mysql service then ran check table TABLE_ONE; I got some errors "partition p2 returned error", "idx_blah_1 is marked as corrupted", and "idx_blah_2 is marked as corrupted". Now I'm back to running optimize table TABLE_ONE; and getting error "Table 'database.TABLE_ONE' doesn't exist".Sort
Running MySLQ on Mojave. Restarting through the system preferences panel did not work. I had to restart through command line.Hawaiian
H
37

I get this issue when the case for the table name I'm using is off. So table is called 'db' but I used 'DB' in select statement. Make sure the case is the same.

Harbour answered 13/10, 2011 at 19:13 Comment(1)
+1 Field names aren't case sensitive, but table names are. Common mistake, and very annoying.Quake
P
35

This error can also occur when setting lower_case_table_names to 1, and then trying to access tables that were created with the default value for that variable. In that case you can revert it to the previous value and you will be able to read the table.

Pansypant answered 17/6, 2014 at 12:18 Comment(2)
This bit me. I reverted the value, restarted the database, exported the tables, set the value back to 1, restarted the database, re-imported the tables and everything worked again.Electrochemistry
This was the culprit in my case.Vtehsta
E
22

I don't know the reason but in my case I solved just disabling and enabling the foreign keys check

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
Endodermis answered 29/6, 2016 at 14:34 Comment(4)
Thanks brother! In my case, I had to disable foreign_key_checks and execute a select query on the disappearing table then the table became normal again. I think there's some foreign key violations in the data rows because I had an interrupted program before this problem happened.Wobbly
Haven't been able to find out why exactly yet, but this also solved my problemRoughish
In my case, it helped to run SET FOREIGN_KEY_CHECKS=0;, then execute SHOW CREATE TABLE … in the same console and then enable back SET FOREIGN_KEY_CHECKS=1;.Quennie
This helped us too, some useful info were in logs: 2021-10-01T11:26:26.020904Z 8 [Warning] InnoDB: Load table foo.bar failed, the table has missing foreign key indexes. Turn off 'foreign_key_checks' and try again. 2021-10-01T11:26:26.020927Z 8 [Warning] InnoDB: Cannot open table foo/bar 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.Effendi
C
19
  1. stop mysqld
  2. backup mysql folder: cp -a /var/lib/mysql /var/lib/mysql-backup
  3. copy database folder from old machine to /var/lib/mysql
  4. override ib* (ib_logfile* , ibdata ) from old database
  5. start mysqld
  6. dump dabase
  7. mysqldump >dbase.mysql
  8. stop mysql service
  9. remove /var/lib/mysql
  10. rename /var/lib/mysql-backup to /var/lib/mysql
  11. start mysqld
  12. create the database
  13. mysqldump < dbase.mysql
Cacodyl answered 3/12, 2012 at 0:51 Comment(4)
In my case, I also had to do: 10.5 delete the <db_name> directory from under /var/lib/mysql/Cabezon
its not working. :( table 'tablename.wp_posts' doesn't existIorio
I backed up my entire /var/lib/mysql folder due to some unforseen circumstances and after reinstalling my manjaro box this worked just fine. Awesome my good man! You get one social distancing beer on me.Lurette
I know this is an old answer, but sharing any explanation about why this should work, could be a really useful answer improvement.Danaides
D
14

Please run the query:

SELECT 
    i.TABLE_NAME AS table_name, 
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

Unfortunately MySQL allows unicode and non-printable characters to be used in table name. If you created your tables by copying create code from some document/website, there is a chance that it has zero-width-space somewhere.

Denby answered 13/10, 2011 at 19:58 Comment(1)
very useful post, thanks! but all tables are ASCII with correct name lengthCargian
E
13

I had the same problem and I searched for 2-3 days, but the solution for me was really stupid.

Restart the mysql

$ sudo service mysql restart

Now tables become accessible.

Exaggerative answered 25/2, 2017 at 7:55 Comment(2)
Totally worked for me, although my command was slightly different: $ sudo /usr/local/mysql/support-files/mysql.server restartTobey
This should be at the top of the list of things to try I guess. Worth a shot and in my case it worked.Ordovician
R
12

I have just spend three days on this nightmare. Ideally, you should have a backup that you can restore, then simply drop the damaged table. These sorts of errors can cause your ibdata1 to grow huge (100GB+ in size for modest tables)

If you don't have a recent backup, such as if you relied on mySqlDump, then your backups probably silently broke at some point in the past. You will need to export the databases, which of course you cant do, because you will get lock errors while running mySqlDump.

So, as a workaround, go to /var/log/mysql/database_name/ and remove the table_name.*

Then immediately try to dump the table; doing this should now work. Now restore the database to a new database and rebuild the missing table(s). Then dump the broken database.

In our case we were also constantly getting mysql has gone away messages at random intervals on all databases; once the damaged database were removed everything went back to normal.

Rhinehart answered 28/11, 2012 at 12:50 Comment(3)
Thanks Andy, I got a clue for problem I am facing. I moved the ibdata1 from somehwere in C drive to D drive in order to save space crunch over C drive. Thankfully I got the ibdata1 (along with ib_logfile1. and ib_logfile0 file) in my D drive after reading your comments. Now will look from where I moved these file and restore it there. Then hopefully my tables will came back.Galeiform
How do you "immediately try to dump the table"? I have the same issue, no backups so I'm looking for way to get the table structure at least but if you remove the files from the directory then everything is simply gone?Silvestro
This did it! Thanks,Keene
Z
9

Try to run sql query to discard tablespace before copying idb-file:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

Copy idb-file

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

Restart MySql

Zalucki answered 13/4, 2014 at 20:39 Comment(3)
You have saved me :)Lowering
@I0pan I tried the same steps as mentioned. But after ALTER TABLE mydatabase.mytable IMPORT TABLESPACE; it is showing table doesn't exist. But it does :(Foehn
This page in the documentation may prove helpful in explaining this further: dev.mysql.com/doc/refman/8.0/en/innodb-table-import.htmlGrosmark
M
8

What worked for me, was just dropping the table, even though it didnt exist. Then I re created the table and repopulated from an sql dump done previously.

There must be some metabase of table names, and it was most likely still existing in there till i dropped it.

Machellemachete answered 19/11, 2013 at 17:39 Comment(1)
I had created a procedure, realized it needed to be a view. So I renamed the procedure with some zzz's at the end so I could have it for reference and created a view of the same name. Couldn't get a SELECT to see it, got this error. <br> Copied the code to a text file, deleted both the view and the procedure. Recreated the view and all was well. <br> So yeah--seven years later--there's still some sort of ghost/cached name action going on in some edge cases.Burroughs
L
7

O.k. this is going to sound pretty absurd, but humor me.
For me the problem got resolved when I changed my statement to this :

SELECT * FROM `table`

I made two changes
1.) Made the table name lower case - I know !!
2.) Used the specific quote symbol = ` : It's the key above your TAB

The solution does sound absurd, but it worked and it's Saturday evening and I've been working since 9 a.m. - So I'll take it :)

Good luck.

Lase answered 13/12, 2014 at 22:55 Comment(3)
Just FYI - The table is MyISAMand not INNOLase
Also the ` is called a backtickLarhondalari
@Lase "It's the key above your TAB" - How do you know that's true? I have it at the right side of my "P" key. Not everyone has the same keyboard layout.Percent
I
5

Had a similar problem with a ghost table. Thankfully had an SQL dump from before the failure.

In my case, I had to:

  1. Stop mySQL
  2. Move ib* files from /var/mysql off to a backup
  3. Delete /var/mysql/{dbname}
  4. Restart mySQL
  5. Recreate empty database
  6. Restore dump file

NOTE: Requires dump file.

Intreat answered 5/1, 2013 at 16:45 Comment(2)
I guess you mean /var/lib/mysql instead of /var/mysqlSchoenburg
Removing the database directories and restoring from backup was the only thing that helped me.Leishmaniasis
B
5

I had this problem after upgrading WAMP but having no database backup.

This worked for me:

  1. Stop new WAMP

  2. Copy over database directories you need and ibdata1 file from old WAMP installation

  3. Delete ib_logfile0 and ib_logfile1

  4. Start WAMP

You should now be able to make backups of your databases. However after your server restarts again you will still have problems. So now reinstall WAMP and import your databases.

Beker answered 8/6, 2016 at 15:10 Comment(3)
I wish people would indicate where the files that they reference reside...Meningitis
Got here from mysql docker image not having readable tables. Can confirm that stopping the image, deleting these files, and restarting gave access again.Virgievirgil
This isn't necessary the same problem. Deleting ib_logfile0/1 causes uses to lose data. Usually the error log has a descriptive message that should be read before causing a likely data corruption.Hiett
D
4

After having to reinstall MySQL I had this same problem, it seems that during the install, some configuration files that store data about the InnoDB log files, these files ib_logfile* (they are log files right?), are overwriten. To solve this problem I just deleted the ib_logfile* files.

Decaffeinate answered 5/9, 2012 at 22:21 Comment(1)
This isn't necessary the same problem. Deleting ib_logfile0/1 causes uses to lose data. Usually the error log has a descriptive message that should be read before causing a likely data corruption.Hiett
M
3
  1. Do mysqldump to database:

    mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
    
  2. Restore database

    mysql -u user -ppass dbname < D:\Back-ups\dbname.sql
    

Now all tables in database were restored completely. Try..

SELECT * FROM dbname.tablename;
Molder answered 18/1, 2018 at 1:42 Comment(0)
T
2

It appears that the issue has to do (at least in mine and a few others) with invalid (corrupt?) innodb log files. Generally speaking, they simply need to be recreated.

Here are solutions, most of which require a restart of mysql.

  • Recreate your log files (Delete and restart mysql)
  • Resize your log files (MySql 5.6+ will regenerate the file for you)
  • If you are doing some type of a data migration, make sure you have correctly migrated the right file and given it permissions as others have already stated
  • Check permissions of your data and log files, that mysql is owner of both
  • If all else fails, you will likely have to recreate the database
Trangtranquada answered 17/7, 2014 at 16:22 Comment(1)
Importantly "SET GLOBAL innodb_fast_shutdown = 0" is required before a shutdown.Hiett
T
2

Here is another scenario (version upgrade):

I reinstalled my OS (Mac OS El Captain) and installed a new version of mysql (using homebrew). The installed version (5.7) happened to be newer than my previous one. Then I copied over the tables, including the ib* files, and restarted the server. I could see the tables in mysql workbench but when I tried to select anything, I got "Table doesn't exist".

Solution:

  1. stop the mysql server e.g. mysql.server stop or brew services stop mysql
  2. start the server using mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/ (change path as needed)
  3. run mysql_upgrade -u root -p password (in another terminal window)
  4. shut down the running server mysqladmin -u root -p password shutdown
  5. restart the server in normal mode mysql.server start or brew services start mysql

Relevant docs are here.

Teresa answered 31/5, 2016 at 23:34 Comment(1)
Tried really a lot but this was the only thing what helped me a lot after I moved to a new server with all my databases. Thanks! (Ubuntu 16.04)Bisset
M
2

In my case, i had defined a trigger on the table and then was trying to insert the row in table. seems like, somehow trigger was erroneous, and hence insert was giving error, table doesn't exist.

Mislike answered 31/12, 2017 at 6:26 Comment(1)
This works for me! Checked each trigger and found one trigger needs to be improved and it worked!Stepha
C
2

Copy only ibdata1 file from your old data directory. Do not copy ib_logfile1 or ib_logfile0 files. That will cause MySQL to not start anymore.

Chesterfield answered 18/2, 2018 at 7:2 Comment(1)
Just because it starts doesn't mean it won't be horribly corrupted. Lack of ib_logfile0/1 causes uses to lose data. Usually the error log has a descriptive message that should be read before causing a likely data corruption.Hiett
D
2

Came cross same problem today. This is a mysql "Identifier Case Sensitivity" issue.

Please check corresponding data file. It is very likely that file name is in lower case on file system but table name listed in "show tables" command is in upper case. If system variable "lower_case_table_names" is 0, the query will return "table not exist" because name comparisons are case sensitive when "lower_case_table_names" is 0.

Devaluation answered 10/4, 2018 at 10:19 Comment(0)
D
1

Its possible you have a hidden character in your table name. Those don't show up when you do a show tables. Can you do a "SHOW CREATE TABLE TABLE_ONE" and tab complete the "TABLE_ONE" and see if it puts in any hidden characters. Also, have you tried dropping and remaking the tables. Just to make sure nothing is wrong with the privileges and that there are no hidden characters.

Dichlamydeous answered 13/10, 2011 at 19:57 Comment(1)
tab completing doesnt help and I cant show create table because table "doesnt exists". from the hellCargian
B
1

In my case it was SQLCA.DBParm parameter.

I used

SQLCA.DBParm = "Databse = "sle_database.text""

but it must be

SQLCA.DBParm = "Database='" +sle_database.text+ "'"

Explaination :

You are going to combine three strings :

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

Don't use spaces in quatermarks. Thank to my colleague Jan.

Borek answered 3/4, 2013 at 13:13 Comment(0)
H
1

I installed MariaDB on new computer, stopped Mysql service renamed data folder to data- I solved my problem copying just Mysql\data\table_folders and ibdata1 from crashed HD MySql data Folder to the new installed mysql data folder.

I Skipped ib_logfile0 and ib_logfile1 (otherwise the server did not start service)

Started mysql service.

Then server is running.

Hawken answered 10/3, 2014 at 13:34 Comment(1)
What was the error log message that prevented the server from starting? Where you using the same MariaDB version? Deleting ib_logfile0/1 causes uses to lose data. Usually the error log has a descriptive message that should be read before causing a likely data corruption.Hiett
F
1

Same exact problem after TimeMachine backup import. My solution was to stop the MySQL server and fix read-write permissions on the ib* files.

Foul answered 13/3, 2014 at 13:12 Comment(0)
B
1

One other answer I think is worth bringing up here (because I came here with that same problem and this turned out to be the answer for me):

Double check that the table name in your query is spelled exactly the same as it is in the database.

Kind of an obvious, newbie thing, but things like "user" vs "users" can trip people up and I thought it would be a helpful answer to have in the list here. :)

Builder answered 13/8, 2014 at 18:57 Comment(0)
I
1

In my case, when I was importing the exported sql file, I was getting an error like table doesn't exist for the create table query.

I realized that there was an underscore in my database name and mysql was putting an escape character just before that.

So I removed that underscore in the database name, everything worked out.

Hope it helps someone else too.

Interchange answered 28/1, 2015 at 8:57 Comment(0)
R
1

My table had somehow been renamed to ' Customers' i.e. with a leading space

This meant

a) queries broke

b) the table didn't appear where expected in the alphabetical order of my tables, which in my panic meant I couldn't see it!

RENAME TABLE ` Customer` TO `Customer`;
Rabbinate answered 26/8, 2016 at 12:55 Comment(0)
Y
1

Go to :xampp\mysql\data\dbname
inside dbname have tablename.frm and tablename.ibd file.
remove it and restart mysql and try again.

Yearlong answered 14/6, 2017 at 8:40 Comment(0)
S
1

I had the same issue in windows. In addition to copying the ib* files and the mysql directory under thd data directory, I also had to match the my.ini file.

The my.ini file from my previous installation did not have the following line:

innodb-page-size=65536

But my new installation did. Possibly because I did not have that option in the older installer. I removed this and restarted the service and the tables worked as expected. In short, make sure that the new my.ini file is a replica of the old one, with the only exception being the datadir, the plugin-dir and the port#, depending upon your new installation.

Sori answered 22/12, 2019 at 21:2 Comment(0)
A
1

The following worked for me, thanks to Alexey Vazhnov's comment. I ran this:

SET FOREIGN_KEY_CHECKS=0;
SHOW CREATE TABLE <tableName>;
SET FOREIGN_KEY_CHECKS=1;

And it restored my corrupted table <tableName>.

Aynat answered 18/2, 2023 at 18:52 Comment(2)
I was about to delete a database and recreate it. this trick saved!Rein
Same here! Who would have thought!Aynat
J
0

I had the same problem, but it wasn't due to a hidden character or "schroedinger's table". The problem (exactly as noted above) appeared after a restore process. I'm using MySQL administrator version 1.2.16. When a restore has to be carried out, you must have unchecked ORIGINAL at the target schema and select the name of your data base from the drop box. After that the problem was fixed. At least that was the reason in my database.

Jeanne answered 6/4, 2012 at 0:44 Comment(0)
C
0

If there's a period in the table name, it will fail for SELECT * FROM poorly_named.table;

Use backticks to get it to find the table SELECT * FROM `poorly_named.table`;

Crosspiece answered 22/9, 2014 at 9:48 Comment(0)
O
0

In my case, I had that without doing a datadir relocation or any kind of file manipulation. It just happened one fine morning.

Since, curiously, I was able to dump the table, using mysqldump, despite MySQL was sometimes complaining about "table does not exist", I resolved it by dumping the schema + data of the table, then DROP-ing the table, and re CREATE it immediately after, followed by an import.

Orthostichy answered 10/8, 2016 at 12:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.