【问题标题】:Schrödingers MySQL table: exists, yet it does not薛定谔 MySQL 表:存在,但不存在
【发布时间】:2012-05-19 07:33:59
【问题描述】:

我遇到了最奇怪的错误。

有时,在创建或更改表时,我会收到“表已存在”错误。但是,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

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

【问题讨论】:

  • 你能不能打开一个 MySQL 客户端,输入一些命令来演示问题,然后复制并粘贴命令的精确副本并在此处输出。很高兴您详细描述了您的问题,但如果您发布确切的命令和消息会更好。
  • 如果绝对没有同名视图,我敢打赌 MySQL 的数据文件结构很不稳定。
  • 你对SHOW FULL TABLES IN askyouSELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'有什么回应?
  • 你在使用innodb_file_per_table吗?
  • @RafaelBarros:非常正确。错字。感谢您的澄清。

标签: mysql


【解决方案1】:

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

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

【讨论】:

  • 我没有使用innodb_file_per_table;但是,当我打开它并尝试重新创建表时,它只会创建 .ibd 文件。 .frm 无处可寻。这仅适用于某个表(使用正确的文件创建了 10 多个其他表)。无论如何,删除那个孤儿 ibd 也无济于事
  • 我正在使用 innodb_file_per_table ;但是如果我删除孤立的 .frm,它会在我运行 create 语句时重新创建(但 create 语句返回错误,.ibd 文件没有创建,我仍然无法删除它)
【解决方案2】:

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

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

【讨论】:

  • 太棒了:停止 mysql,删除 'ibdata1'、'ib_logfile1'、'ib_logfile0' 并重新启动 mysql 解决了我的问题。非常感谢!
  • 备份整个数据库目录在你这样做之前你停止服务之后。跨度>
【解决方案3】:

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

【讨论】:

  • 其实这个解决方案救了我的命,谢谢!我确实从另一个数据库中复制了 FRM 和 IDB 文件,但在同一台服务器上(相同的 MySQL 版本等),它似乎运行正常。
  • 我确认,这是从另一个实例(主/从)复制 .frm 文件并将其放入目录中的方法,删除表,您将能够创建表再次。
【解决方案4】:

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

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

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

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

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

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

【讨论】:

    【解决方案5】:

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

    mysqladmin -uxxxxxx -pyyyyy flush-tables
    

    【讨论】:

      【解决方案6】:

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

      在 Unix 环境中作为 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

      问候, 克里斯托斯

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

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

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

                • 它不是属于另一个用户或另一个数据库中的表
                • 这不是大写/小写问题,我全部使用小写,但这是一个有趣的问题!
                • 看到“它肯定是 并且你只是做得不对”的各种响应更令人沮丧 :)
                • 表格未显示在“显示表格”中
                • 该表是(一直是/曾经是)INNODB 表。
                • 试图 DROP 表给出了该表不存在的错误消息。
                • 但尝试CREATE该表给出了该表已存在的错误消息。
                • 使用 mysql 5.0 或 5.1
                • REPAIR 对这个问题无效

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-29
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多