125

我遇到了最奇怪的错误。

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

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

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

我在 Windows、Fedora 和 Ubuntu、MySQL 5.1 和 5.5 上遇到过这种情况。同样的行为,当使用 PDO、PHPMyAdmin 或命令行时。我使用 MySQL Workbench 来管理我的模式 - 我看到了一些相关的错误(结束线和东西),但是它们都与我无关。

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

我尝试了所有我能用谷歌搜索的东西——刷新表,将 .frm 文件从 db 移动到 db,读取 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

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

4

11 回答 11

24

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

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

于 2012-05-16T16:28:20.440 回答
14

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

  1. 删除所有模式(不包括 mysql)
  2. 关闭数据库
  3. 确保数据目录中的所有文件夹都已正确删除(同样,不包括 mysql)
  4. 删除 ibdata 和日志文件
  5. 重新启动数据库。它应该从头开始重新创建表空间和日志。
于 2012-05-28T01:13:45.703 回答
6

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

于 2014-09-08T08:56:30.910 回答
5

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

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

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

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

这给了我一个想法,如果我的表包含大写字母,MySQL 会被愚弄,以为它们仍然存在,即使我删除了它们。事实证明是这样的,并且切换到只使用小写字母作为表名使问题消失了。

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

于 2012-08-04T16:36:59.003 回答
3

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

mysqladmin -uxxxxxx -pyyyyy flush-tables
于 2016-07-12T10:16:44.953 回答
2

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

在 Unix 环境中作为

  • 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

问候,克里斯图斯

于 2013-01-26T14:13:25.737 回答
1

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

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

于 2012-08-27T15:24:36.517 回答
0

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

于 2013-03-29T08:16:26.023 回答
0

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

  • 搜索孤儿文件:不存在任何人;
  • execute: 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á!有问题的桌子不见了。我可以毫无问题地创建它并使用相同的有问题的名称删除它,而且我什至不必重新启动服务器!诡异的...

于 2013-09-29T15:51:07.970 回答
0

我在创建表并将其删除后遇到此错误,然后想再次创建它。在我的例子中,我有一个独立的转储文件,所以我删除了我的架构,重新创建它并使用转储文件导入表和数据。

于 2014-02-19T01:55:57.790 回答
0

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

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

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

  • 它不是属于另一个用户或另一个数据库中的表
  • 这不是大写/小写的问题,我全部使用小写,但这是一个有趣的问题!
  • 看到“它肯定是 <there/not-there/some-other-user-table-case> 而你只是没有做对”的变化的反应更加令人沮丧 :)
  • 该表格未显示在“显示表格”中
  • 该表是(一直是/曾经是)INNODB 表。
  • 尝试DROP该表给出了该表不存在的错误消息。
  • 但试图创建表给出了表已经存在的错误消息。
  • 使用 mysql 5.0 或 5.1
  • REPAIR对这个问题无效
于 2016-06-16T14:29:21.380 回答