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

Cor*_*ewe 118 mysql

我遇到了最奇怪的错误.

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

当我尝试删除数据库时,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'
Run Code Online (Sandbox Code Playgroud)

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

mysql> drop database askyou;
ERROR 2013 (HY000): Lost connection to MySQL server during query
Run Code Online (Sandbox Code Playgroud)

名称发生变化,这不是我遇到问题的唯一表/数据库

sre*_*mer 19

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

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

  • 我没有使用`innodb_file_per_table`; 但是,当我打开它并尝试重新创建表时,它只创建`.ibd`文件.`.frm`无处可寻.这仅适用于某个表(使用正确的文件创建了10多个其他表).无论如何,删除孤儿ibd无济于事 (3认同)

ESG*_*ESG 14

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

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

  • 太棒了:停止mysql,删除'ibdata1','ib_logfile1','ib_logfile0'并重新启动mysql解决了我的问题.非常感谢! (2认同)
  • **在执行此操作之前*和*在停止服务之后*备份整个数据库目录。 (2认同)

小智 6

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


oza*_*man 5

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

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

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

[Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/data/ is case insensitive
Run Code Online (Sandbox Code Playgroud)

这给了我一个想法,也许如果我的表包含大写字母,MySQL 就会被愚弄,认为即使我删除了它们,它们仍然存在。事实证明确实如此,并且改用仅小写字母作为表名使问题消失。

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