MySQL表不存在错误,但实际上它是存在的。

23

有人知道当表确实存在时,什么情况下会收到1146:Table '<database>.<table>' doesn't exist错误吗?

我在5个服务器上使用相同的代码,只有最近租用的一个服务器显示了这个错误,所以我怀疑可能是某种设置或安装错误。我可以从命令行执行我的sql语句。显然,我也可以从命令行看到表格。当我建立连接时,我没有得到任何连接错误(顺便说一下,我正在使用mysqli)。

任何帮助都将不胜感激。

确切的查询:

$sql = "SELECT DISTINCT(mm_dic_word) AS word FROM spider.mm_dictionary WHERE mm_dic_deleted=0";

你能展示一下你遇到问题的确切查询吗? - Jasdeep Singh
你可以使用终端访问数据库吗? - Wouter Dorgelo
@ajreal - 已经三次检查,四次检查等等。当我进行mysql转储时,它添加了更多的用户列表,root等的多个副本。我想有多行相同用户可能会导致这些错误,所以我删除了所有重复项...但仍然没有成功。我进一步查看发现,我的所有密码哈希值都是16个字符,而该列设置为char(41)...我想知道这是否有任何关系,但我肯定不想半途更改密码。 - Troy Knapp
@ajreal - 数据库 'spider' 同时被 'localhost' 和 '%' 所拥有。同时我在我的配置文件中发现了 'old_password=1'。与 mysql 转储一起导入的其他用户名和密码中有几个完整的32字符哈希值。我使用的版本是 MySQL 5.0.77,因此默认使用旧密码似乎对我来说有点奇怪。 - Troy Knapp
@ajreal - 我解决了,将old_password设置为0,通过UPDATE mysql.user SET password=PASSWORD('insert password here');更新了所有用户的密码,这给了我32个字符的哈希值。如果你写出一个答案,我会接受它,因为你帮助我找到了正确的方向。 - Troy Knapp
显示剩余5条评论
10个回答

47

这件事情刚刚发生在我身上,后来我在一篇博客文章中找到了答案,并希望在这里分享。

如果您将MySQL数据目录从/var/lib/mysql复制到/path/to/new/dir,但是只复制了数据库文件夹(即mysqlwpdbecommerce等),并且您有InnoDB表,则您的InnoDB表将会在“show tables”中显示,但对它们进行的查询(如selectdescribe)将失败,并出现错误信息Mysql error: table db.tableName doesn't exist。你会看到db目录中的.frm文件,并想知道为什么会这样。

对于InnoDB表,重要的是要复制ib*文件,例如ibdata1ib_logfile0ib_logfile1,在我的情况下如此。一旦我确保复制了这些文件,一切都像预期的那样运行。

如果您的my.cnf文件包含innodb_file_per_table,则.ibd文件将存在于db目录中,但您仍然需要ib*文件。


3
我应该说出适合我情况的答案,希望对您也有帮助 :) - Isaac
你节省了我的时间...非常感谢 :) - Bhavik Shah
我做了以下操作,现在MySQL无法启动了,显示“作业启动失败”。更详细地说,我把一个ArchLinux上的Mariadb文件复制到了Mint/Ubuntu上的另一个Mariadb。也许两个Mariadb版本之间的格式不兼容... - donquixote
我真的认为这应该可以工作,但对我来说却没有。我创建了一个/var/lib的存档文件,并将其导入到我的新docker容器中,因此我拥有所有的ib*文件和其他所有文件,但它仍然显示表不存在。 - Spencer Williams
之前工作正常,但现在我之前删除的很多表格又出现了。这不是什么大问题,只是有点奇怪。 - G_V
我从Windows转移到Ubuntu,只复制了我的带有idb和frm文件的数据库文件夹,我该怎么办?请帮帮我,我心里很慌,我手动输入了两个表中的一百多条记录和一个表中的一千多条记录!! - hysabone.com

4

在这种情况下,使用mysqlcheck是必要的 - 这样您就可以丢弃表格中的健全性问题并在需要时修复它们。


2

你的服务器是不是运行在Linux系统上?MySQL在Linux上是大小写敏感的,而在Windows上则不敏感。


它们全部都是Linux系统,这个是CentOS,其他的都是Debian……不知道这是否有帮助。当然,我可以通过我的本地测试镜像在Windows上执行SQL语句,所以这不是一个问题。 - Troy Knapp

2
基本上,我认为我遇到的问题是由于密码哈希长度不同造成的。在我的情况下,我得到了一个新服务器,在它上面完成了完整的mysql转储,其中包括密码和用户信息。新服务器已经初始化了一个具有16个字符长度哈希的root用户,但我的旧服务器正在使用更新的32个字符哈希长度。
我必须进入my.conf将旧密码设置为0(否则每次尝试更新数据库时,新更新的密码长度为16个字符)。然后,我通过命令UPDATE mysql.user SET password=PASSWORD('password here');更新了所有密码,然后刷新了权限。
显然,让每个用户都使用相同的密码是一个非常糟糕的主意,所以我在确认它可以工作后逐个更改它们。
我写了一篇博客文章,介绍了我做过的其他一些事情,但都没有起作用here,直到我找到了这个解决方案(以防其中一个或多个更改影响了我的结果),但是,我认为以上解决方案是完整的...但我还没有尝试重现错误,所以我不能百分之百确定。

2

当我尝试使用大写字母选择一个小写字母的表时,遇到了这个问题。

为了解决这个问题,我在my.cnf文件中添加了"lower_case_table_names=1"。


1

我曾经遇到过这种情况。后来我发现我使用的JDBC驱动程序将我的查询转换为小写,因此我无法使用它访问我的数据库(该数据库使用混合大小写字母),尽管我的代码使用了正确的混合字母。


我希望它是那么简单... 我总是使用小写字母,就是为了这个原因。 - Troy Knapp
这正是正在发生在身上的事情,我希望你能像实际发布你在此如何解决该问题一样简单。 - Zachary J Rollyson

0

这可能与同时拥有InnoDB和MyISAM表有关。如果你复制了数据库文件,MyISAM表将正常工作,但是InnoDB表将会出现问题而无法正常工作。


0

我在一个CentOS 6.4 系统上,使用MySQL 5.1和XFS文件系统看到了这个问题。

'SHOW TABLES'可以显示表格,但用SELECT或DESCRIBE失败,提示找不到该表格,就像您描述的那样。而且我也能找到文件。

这个系统已经运行了好几个月,但是在服务mysqld重启后,由于将/etc/my.cnf中的table_cache从256更改为512,它变得不稳定了。

根据arcconf,RAID控制器认为一切正常。xfs_check没有发现任何问题。IPMI的系统事件列表也很清楚。dmesg显示了一些关于iptables的投诉信息,关于连接跟踪和丢弃数据包,所以我们可能受到了DOS攻击,但由于服务器没有真正对外开放,我不知道它会如何影响MySQL数据完整性?

最终我不得不将从服务器提升为主服务器并重新加载系统,现在我在想这个错误可能是什么原因造成的,是否选择在CentOS 6.4上使用XFS依然是一个稳定的选择,还是说罪魁祸首是MySQL 5.1。

哦,对了,永远不要改变一个正在运行的系统 :)


0

Mac OS X?停!还不要复制任何东西...

我在Mavericks上遇到过这个问题几次。MySQL不再包含在内,但我的安装与Snow Leopard上的预期相同,而不是MAMP或其他什么。

从一台计算机迁移到另一台后,我遇到了这个问题。这是由于MySQL控制面板启动了mysqld,而不是我在命令行上启动它。(迁移时,这个有点过时的控制面板忘记了你告诉它不要在启动时启动。)

查看进程(使用top或活动监视器),在我的系统上:如果所有者是root,则是由launched启动的,无法正常工作;正确的进程将具有_mysql作为所有者。

有时,我同时运行两个进程!

奇怪的是,你可以做任何事情,包括通过命令行使用mysql。然而,尽管innodb表被列出,但在查询时会生成一个不存在的错误。

这似乎是一个所有权问题,可能也适用于其他系统。


-1

如果您以没有查看该数据库/表的权限的身份登录,则可能会得到该结果。您是否在命令行上使用与mysqli相同的登录?


我认为这是目前最接近的答案。连接到服务器时,我遇到了一些奇怪的行为。出于某种原因,我只能成功地连接一个用户(通过php,使用终端,我可以登录任何用户)。该用户似乎对相关数据库和表具有完全授权,我甚至在相关数据库上执行了GRANT ALL PRIVILEGES,但仍然出现相同的错误。这真的很奇怪。 - Troy Knapp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接