SchrödingersMySQL表:存在,但它没有

时间:2012-05-10 17:01:41

标签: mysql

我遇到了最奇怪的错误。

有时,在创建或更改表时,我会收到“表已存在”错误。但是,DROP TABLE返回'#1051 - unknown table'。所以我得到了一张我无法创作的桌子,不能放弃。

当我尝试删除数据库时,mysqld崩溃了。有时,创建另一个具有不同名称的数据库会有所帮助,有时则不会。

我使用一个包含约50个表的数据库,所有数据都是InnoDB。不同的表会出现此问题。

我在Windows,Fedora和Ubuntu,MySQL 5.1和5.5上体验过这一点。使用PDO,PHPMyAdmin或命令行时的行为相同。我使用MySQL Workbench来管理我的模式 - 我看到了一些相关的错误(背景和内容),但是没有一个与我相关。

不,它不是一个视图,它是一个表。所有名称都是小写的。

我尝试了所有可以google的方法 - 刷新表格,将.frm文件从db移动到db,读取mysql日志,没有任何帮助,但重新安装了该死的东西。

'显示表'没有显示任何内容,'describe'表说'表不存在',没有.frm文件,但'create table'仍以错误结束(如果不存在则创建表) ')和删除数据库崩溃mysql

相关但无益的问题:

编辑:

mysql> use askyou;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> create table users_has_friends (id int primary key);
ERROR 1050 (42S01): Table '`askyou`.`users_has_friends`' already exists

mysql> drop table users_has_friends;
ERROR 1051 (42S02): Unknown table 'users_has_friends'

等等,都是一样的:表不存在,但无法创建;

mysql> drop database askyou;
ERROR 2013 (HY000): Lost connection to MySQL server during query

名称更改,这不是我遇到问题的唯一表/数据库

11 个答案:

答案 0 :(得分:18)

我在数据目录中缺少数据文件但是表定义文件存在时看到了这个问题,反之亦然。如果您正在使用innodb_file_per_table,请检查数据目录以确保您有相关表的.frm文件和.ibd文件。如果它是MYISAM,则应该有.frm.MYI.MYD文件。

通常可以通过手动删除孤立文件来解决问题。

答案 1 :(得分:13)

在这里继续疯狂猜测,但看起来innodb仍然在表空间中有一个表的条目,可能在ibdata。如果您确实不需要任何数据,或者您有备份,请尝试以下操作:

  1. 删除所有架构(不包括mysql)
  2. 关闭数据库
  3. 确保已正确删除数据目录中的所有文件夹(同样,不包括mysql)
  4. 删除ibdata和日志文件
  5. 重启数据库。它应该从头开始重新创建表空间和日志。

答案 2 :(得分:3)

我怀疑这是对问题案例的直接回答,但这是我在OS X Lion系统上解决这个确切感知问题的方法。

我经常为我安排的一些分析工作创建/删除表。在某些时候,我开始通过我的脚本中途获取表已经存在的错误。服务器重启通常可以解决问题,但这对解决方案来说太烦人了。

然后我在本地错误日志文件中注意到这一特定行:

[Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/data/ is case insensitive

这给了我一个想法,也许如果我的表格包含大写字母,MySQL会被愚弄,以为即使在我放弃它们之后它们仍然存在。事实证明是这种情况,并且转换为仅使用小写字母表格会使问题消失。

这可能是我案例中一些配置错误的结果,但希望这个错误案例可以帮助有人浪费更少的时间来寻找解决方案。

答案 3 :(得分:3)

修复结果很简单;至少我的工作,为我工作。 创建一个表" zzz"在另一个MySQL实例上,其中zzz是问题表名。    (即如果这张桌子被称为薛定谔,那就用zzz来代替那个。)    表的定义是什么并不重要。它是一个临时假人; 将zzz.frm文件复制到表所在的服务器上的数据库目录中,    确保文件的文件所有权和权限仍然正确。 在MySQL上,您现在可以执行"显示表格;",表格zzz将在那里。 MySQL的>桌子zzz; ......现在应该有效。如有必要,清除目录中的所有zzz.MYD或ZZZ.MYI文件。

答案 4 :(得分:3)

这是一个老问题,但我遇到了同样的问题,an answer在顶部链接的一个相关问题中正是我所需要的,并且远没有删除文件,表,关闭服务器那么激烈等。

mysqladmin -uxxxxxx -pyyyyy flush-tables

答案 5 :(得分:1)

在我的情况下,通过将mysql数据目录的所有权更改为运行应用程序的用户来解决问题。 (在我的例子中,它是一个运行Jetty webserver的Java应用程序。)

即使mysql正在运行而且其他应用程序可以正常使用它,这个应用程序也有问题。更改数据目录所有权并重置用户密码后,一切正常。

答案 6 :(得分:0)

如果存有此错误1051并且您只想删除数据库并再次导入,请执行此步骤,一切都会好起来....

在Unix envoriment AS root

  • rm -rf / var / lib / mysql / YOUR_DATABASE;
  • 可选 - > mysql_upgrade --force
  • mysqlcheck -uUSER -pPASS YOUR_DATABASE
  • mysqladmin -uUSER -pPASS drop YOUR_DATABASE
  • mysqladmin -uUSER -pPASS创建YOUR_DATABASE
  • mysql -uUSER -pPASS YOUR_DATABASE< IMPORT_FILE

此致 基督

答案 7 :(得分:0)

我遇到了这个问题,希望删除IBD文件会有所帮助,但是没有区别。 MySQL只重新创建了一个新的IBD文件。就我而言,在同一个MySQL实例中的其他数据库中实际上存在类似的表。由于缺少FRM文件,我从另一个数据库中的类似表中复制了FRM文件,重新启动了MySQL并且表格工作正常。

答案 8 :(得分:0)

我在创建表并删除它之后遇到了这个错误,然后想再次创建它。 在我的例子中,我有一个自包含的转储文件,所以我删除了我的模式,重新创建它并使用转储文件导入表和数据。

答案 9 :(得分:0)

它发生在我们的网站上(但很少),通常发生在"事件"在运行执行大量重建的某些脚本时发生。事件包括网络中断或电源问题。
在极少数情况下我会为此做些什么 - 我采用严厉的方法:

  • 我需要简单地摆脱并重建特定的表格。我通常处于这样的位置,因为正在构建表格。 (如果您需要恢复数据,情况可能会有所不同)
  • 作为管理员,进入mysql安装(在Windows上可能是" ...程序文件/ mysql / MySQL服务器xx / data /< schemaname>
  • 在< schemaname>中找到包含表名的违规文件文件夹 - 并删除它。
  • 检查孤立的临时文件并删除它们。 #... frm文件,如果他们碰巧在那里。
  • MySQL会让你再次创建表

我在很长一段时间(几年)内在几个不同的数据库上遇到过这个问题。这是一个难以接受的因为矛盾的信息。我第一次对其他答案中描述的删除/重建/重命名数据库做了变化,并设法让事情顺利进行,但这肯定需要更长的时间。幸运的是,它总是碰巧引用正在重建的表 - DROP' d和CREATEd - 通常在早上。很少遇到问题,但后来认识到这是一个特殊的古怪案例。 (我将重申:如果您需要恢复数据,请查看其他解决方案。)

     
  • 它不是属于另一个用户或另一个数据库的表
  •  
  • 它不是大写/小写的问题,我使用全部小写,但这是一个有趣的问题!
  •  
  • 额外的令人沮丧的看到响应的变化"它肯定是< there / not-there / some-other-user-table-case>并且你只是做得不对而且#34; :)
  •  
  • 表格没有显示在" show tables"
  • 上  
  • 表格(一直是/曾经)是一张INNODB表。
  •  
  • 尝试 DROP 表格提供了表格不存在的错误消息。
  •  
  • 但是尝试创建该表会显示该表已存在的错误消息。
  •  
  • 使用mysql 5.0或5.1
  •  
  • REPAIR 对此问题无效

答案 10 :(得分:-1)

我在一个特定的桌子上遇到了这个问题。阅读可能的解决方案我已经做了一些步骤:

  • 搜索孤儿文件:不存在任何人;
  • 执行:show full tables in database;:没有看到有问题的人;
  • 执行:describe table;:返回table doesn't exist;
  • 执行:SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='table';:返回Empty set;
  • 通过phpMyAdmin手动搜索上面的查询:不存在;

然后,在这些步骤之后,我再次检查show tables;和...vualá!有问题的桌子消失了。我可以创建它并使用相同的有问题的名称删除它没有问题,我甚至没有重启服务器!奇怪的...