SchrödingersMySQL表:存在,但不存在


118

我有最奇怪的错误。

有时,在创建或更改表时,出现“表已存在”错误。但是,DROP TABLE返回“#1051-未知表”。所以我得到了一个无法创建的表,无法删除。

当我尝试删除数据库时,mysqld崩溃。有时它有助于创建另一个具有不同名称的数据库,有时却没有。

我使用的数据库有大约50个表,全部是InnoDB。使用不同的表会发生此问题。

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

不,它不是视图,而是表格。所有名称均为小写。

我尝试了所有可以用google搜索的方法-刷新表,将.frm文件从数据库移动到数据库,读取mysql日志,但无济于事,而是重新安装了该死的东西。

“显示表”不显示任何内容,“描述”表表示“表不存在”,没有.frm文件,但“创建表”仍然以错误结尾(“如果不存在,则创建表”也是如此)删除数据库崩溃的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

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


2
您可以打开MySQL客户端,然后键入一些演示问题的命令,然后复制并粘贴命令的精确副本并在此处输出。您已经详细描述了您的问题,这很高兴,但是如果您发布了确切的命令和消息,那就更好了。
马克·拜尔斯

如果绝对没有相同名称的视图,我会打赌MySQL的数据文件结构会很奇怪。
eggyal 2012年

3
您对SHOW FULL TABLES IN askyou和有SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'什么反应?
eggyal

1
您正在使用innodb_file_per_table吗?
ESG 2012年

1
@RafaelBarros:完全正确。错别字。感谢您的澄清。
eggyal 2013年

Answers:


19

当数据目录中缺少数据文件但表定义文件存在或相反时,我已经看到此问题。如果您使用的是innodb_file_per_table,请检查数据目录,以确保您同时拥有.frm该表的文件和.ibd文件。如果是MYISAM,应该有一个.frm.MYI.MYD文件。

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


3
我没有使用innodb_file_per_table;但是,当我打开它并尝试重新创建表时,它只会创建.ibd文件。.frm无处可寻。这仅适用于某个表(使用正确的文件创建了10多个表)。删除该孤儿ibd仍然无济于事
Corkscreewe

1
我正在使用innodb_file_per_table; 但是,如果我删除孤立的.frm,则在运行create语句时会重新创建它(但create语句返回错误,.ibd文件未创建,并且我仍然无法删除)
andrew lorien

14

在这里进行疯狂的猜测,但是innodb似乎仍然在表空间(可能在中)中有您的表的条目ibdata。如果您确实不需要任何数据,或者您有备份,请尝试以下操作:

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

2
棒极了:停止mysql,删除'ibdata1','ib_logfile1','ib_logfile0'并重新启动mysql解决了我的问题。非常感谢!
Meilo 2012年

4

解决方法很容易;至少我的工作对我有用。在另一个MySQL实例上创建一个表“ zzz”,其中zzz是问题表名称。(即,如果该表被称为schrodinger,则用zzz代替该表。)该表的定义无关紧要。这是一个临时的假人。将zzz.frm文件复制到该表应位于的服务器上的数据库目录中,确保该文件的文件所有权和权限仍然正确。在MySQL上,您现在可以执行“显示表;”,并且表zzz将在那里。mysql>删除表zzz; ...现在应该可以工作了。如有必要,请清除目录中的所有zzz.MYD或ZZZ.MYI文件。


实际上,此解决方案挽救了我的生命,谢谢!我确实从另一个数据库复制了FRM和IDB文件,但是在同一服务器上(相同的MySQL版本等),它似乎正常运行。
Pierre

我确认,这是.frm从另一个实例(主/从)复制文件并将其放入目录,放置表的方法,您将能够再次创建表。
juliangonzalez

3

我怀疑这是这里问题案例的直接答案,但是这就是我如何解决这个确切的感知问题在OS X Lion系统上。

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

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

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

这使我想到,即使我的表包含大写字母,MySQL也会被愚弄以为即使在我删除它们之后它们仍然存在。事实证明是这种情况,切换到表名只使用小写字母可以解决问题。

在我的情况下,这可能是某些配置错误的结果,但希望此错误情况将帮助某人减少寻找解决方案的时间。


3

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

mysqladmin -uxxxxxx -pyyyyy flush-tables

1

在我的情况下,该问题通过将mysql数据目录的所有权更改为运行该应用程序的用户来解决。(在我的情况下,这是一个运行Jetty Web服务器的Java应用程序。)

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


1

如果将出现错误1051的库存,而您只想删除数据库并再次导入该数据库,请执行以下步骤,一切都会好起来的...。

在Unix envoriment AS root中

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

问候克里斯蒂斯


0

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


0

创建表并将其删除后,我遇到了这个错误,然后想再次创建它。就我而言,我有一个自包含的转储文件,因此我删除了架构,重新创建了架构,并使用该转储文件导入了表和数据。


0

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

  • 我只需要删除并重建特定表即可。我通常认为这是可以的,因为正在构建表。(如果您需要恢复数据,您的情况可能会有所不同)
  • 以管理员身份进入mysql安装(在Windows上可能是“ ...程序文件/ mysql / MySQL服务器xx / data / <schemaname>
  • 在<schemaname>文件夹中找到带有表名的有问题的文件-并将其删除。
  • 检查孤立的临时文件并删除它们。#... frm文件(如果它们恰好在那里)。
  • MySQL将让您再次创建表

很长一段时间(几年),我在几个不同的数据库上都遇到了这个问题。这是一个绊脚石,因为矛盾的信息。我第一次按照其他答案中的描述对删除/重建/重命名数据库进行了修改,并设法使事情进展顺利,但是肯定要花更长的时间。对我来说幸运的是,通常要在重建的引用表上进行-DROP和CREATEd-通常是在早上。很少遇到问题,但逐渐意识到这是一个特殊的古怪案例。(我重申:如果您需要恢复数据,请查看其他解决方案。)

  • 它不是属于另一个用户或另一个数据库中的表
  • 这不是大写/小写问题,我全部使用小写,但这是一个有趣的问题!
  • 看到带有“肯定是<有/没有/其他用户表情况>并且您做得不正确”的变体的响应,这特别令人沮丧。
  • 该表格未显示在“显示表格”上
  • 该表是(一直是/曾经是)INNODB表。
  • 尝试删除表时,错误消息指出该表不存在。
  • 但是尝试创建该表时,错误消息表明该表已存在。
  • 使用MySQL 5.0或5.1
  • 修复此问题无效

-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;and ...vualá核对!有问题的桌子不见了。我可以创建它,并使用相同的有问题的名称将其删除,没有问题,而且我什至不必重启服务器!奇怪的...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.