【问题标题】:MySQL Table does not exist error, but it does existMySQL表不存在错误,但它确实存在
【发布时间】:2011-05-14 17:13:12
【问题描述】:

有谁知道当您的表确实存在时,在什么情况下您会收到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";

【问题讨论】:

  • 你能告诉我们你遇到这个问题的确切查询吗?
  • 你能用终端访问数据库吗?
  • @Enrico Pallazzo 是的,我可以通过 ssh 进入框,访问数据库并从该表执行 sql 就好了。
  • @ajreal - 我不是粗鲁,但如果我可以从命令行执行上述查询,那么数据库和表显然匹配。
  • @Troy Knapp - 如果用于命令行和 php mysqli 的连接是相同的,可以仔细检查一下吗?

标签: php mysql mysql-error-1146


【解决方案1】:

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

【讨论】:

  • 都是Linux机器,这个是CentOS,其他都是Debian...不知道有没有帮助。当然,我可以通过我的本地测试镜像windows执行sql,所以这不是案例问题。
【解决方案2】:

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

【讨论】:

  • 我希望它是那么简单...出于这些原因,我总是使用小写字母。
  • 这正是发生在 me 身上的事情,我希望它如此简单,因为您已经在此处实际发布了如何解决该问题。
【解决方案3】:

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

【讨论】:

  • 我认为这是迄今为止最接近的答案。连接到服务器时,我遇到了一些奇怪的行为。无论出于何种原因,我只能以一个用户身份成功连接(通过 php,使用终端,我可以以任何身份登录)。该用户似乎对相关数据库和表具有完全授权,我什至对相关数据库执行了 GRANT ALL PRIVILEGES,但我仍然遇到相同的错误。这真的很奇怪。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

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

    【讨论】:

      【解决方案6】:

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

      如果您将 MySQL 数据目录从 /var/lib/mysql 复制到 /path/to/new/dir,但仅复制数据库文件夹(即 mysqlwpdbecommerce 等)并且您确实有 innodb 表,您的 innodb表将显示在“显示表”中,但对它们的查询(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* 文件。

      【讨论】:

      • 我应该说适合我情况的答案,希望你也是 :)
      • 你节省了我的时间......非常感谢:)
      • 这样做了,现在mysql不再启动,“作业启动失败”。更多细节:我将文件从 archlinux 上的一个 mariadb 复制到 mint/ubuntu 上的另一个 mariadb。也许两个mariadb版本之间的格式不兼容...
      • 我真的认为这应该有效,但它不适合我。我创建了 /var/lib 的存档,将其导入到我的新 docker 容器中,因此我拥有所有 ib* 文件和其他所有文件,但它仍然说它列出的表不存在。
      • 工作了,但现在我之前删除的很多表又回来了。这不是真正的问题,只是奇怪。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        我在带有 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。

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

        【讨论】:

          【解决方案9】:

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

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

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

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

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

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

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              猜你喜欢
              • 2018-08-02
              • 1970-01-01
              • 1970-01-01
              • 2011-12-07
              • 1970-01-01
              • 2019-05-22
              • 2011-03-19
              • 2015-06-16
              相关资源
              最近更新 更多