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";
4

10 回答 10

46

这只是发生在我身上,过了一会儿我在一篇博客文章中找到了答案,也想把它放在这里。

如果您将 MySQL 数据目录从复制/var/lib/mysql/path/to/new/dir,但仅复制数据库文件夹(即mysqlwpdbecommerce等)并且您确实有 innodb 表,则您的 innodb 表将显示在“显示表”中,但对它们的查询(selectdescribe)将失败, 错误Mysql error: table db.tableName doesn't exist。您将.frm在 db 目录中看到该文件,并想知道为什么。

对于 innodb 表,复制ib*文件很重要,在我的例子中是ibdata1,ib_logfile0ib_logfile1. 一旦我完成转移并确保将它们复制过来,一切都按预期工作。

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

于 2011-10-03T19:01:45.880 回答
4

在这种情况下,使用 mysqlcheck 是有必要的——因此您可以丢弃表完整性问题并在需要时修复它们。

于 2013-02-27T17:17:16.490 回答
2

会不会是你的一台服务器是一个 linux 机器?Mysql 在 linux 上区分大小写,但在 windows 上不区分大小写。

于 2010-11-23T20:31:05.987 回答
2

基本上,我相信我遇到的问题是由于密码哈希长度不同造成的。就我而言,我有一个新服务器,在上面做了一个完整的 mysql 转储,它也传输了密码和用户信息。新服务器已经使用具有 16 字符长度哈希的 root 用户初始化,但我的旧服务器使用较新的 32 字符哈希长度。

我必须进入 my.conf 将旧密码设置设置为 0(否则每次我尝试更新数据库时,新更新的长度为 16 个字符)。然后我通过命令将所有密码更新为相同UPDATE mysql.user SET password=PASSWORD('password here');,然后我刷新了权限。

显然,让每个用户都使用相同的密码是一个非常糟糕的主意,所以在我确认它可以工作后,我一个一个地更改了它们。

在我遇到这个解决方案之前(以防这些更改中的一个或多个影响我的结果),我输入了一个博客条目,其中包含我所做的其他一些在这里不起作用的事情,但是,我认为以上解决方案是完整的......但我没有尝试重现错误,所以我不能 100% 确定。

于 2010-12-03T15:30:49.080 回答
2

当我尝试使用 UPPERCASE 选择表并且表名是小写时,这发生在我身上。

所以,为了解决这个问题,我将“lower_case_table_names=1”放在 my.cnf 文件中。

于 2018-02-01T15:00:12.320 回答
1

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

于 2010-11-23T20:33:54.213 回答
0

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

于 2010-11-23T20:34:46.540 回答
0

它可能与将 InnoDB 和 MyISAM 表放在一起有关。如果你复制数据库文件,MyISAM 会很好,InnoDB 会出现但无法工作。

于 2010-11-23T21:06:40.910 回答
0

我在带有 mysql 5.1 和 xfs 文件系统的 centos 6.4 系统上看到了这一点。

表格显示为“显示表格”,但选择或描述失败,并显示您所描述的表格不存在消息。这些文件是我期望它们所在的位置。

系统运行了好几个月,然后在更改 /etc/my.cnf 以将 table_cache 设置为 512 而不是 256 后重新启动服务 mysqld 后,它就横向运行了。

根据 arcconf,raid 控制器认为一切都很好。xfs_check 没有找到任何东西。IPMI 的系统事件列表清晰。dmesg 显示 iptables 对连接跟踪和丢弃包的一些抱怨,所以我们可能已经被 DOS 了,但是由于服务器上没有真正面向外部运行的东西,我看不出它如何影响 mysql 数据完整性?

我最终将slave升级为master并重新加载系统,现在想知道是什么导致了错误,以及在centos 6.4上选择xfs是否仍然是一个稳定的选择,或者罪魁祸首是否是mysql 5.1。

哦,是的,永远不要改变正在运行的系统:)

于 2013-05-07T20:24:38.047 回答
0

Mac OS X?停止,不要复制任何东西......

我在小牛队遇到过几次这个问题。MySQL 不再包括在内,但我认为我的安装与您期望在 Snow Leopard 上找到的安装基本相同,而不是 MAMP 之类的。

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

查看我系统上的进程(顶部或活动监视器):如果所有者是 root,则它是由启动启动的并且无法正常工作;正确的进程将 _mysql 作为所有者。

有时,我让两个进程并排运行!

奇怪的是,你可以做任何事情,包括通过命令行使用 mysql。但是,即使列出了 innodb 表,它们也会在查询时生成不存在错误。

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

于 2014-07-23T21:23:05.373 回答