【问题标题】:MySQL > Table doesn't exist. But it does (or it should)MySQL > 表不存在。但它确实(或应该)
【发布时间】:2011-12-07 05:36:15
【问题描述】:

我更改了 MySQL 安装的数据目录,并且所有基础都正确移动,除了一个。 我可以连接并USE 数据库。 SHOW TABLES 也正确返回了我所有的表,并且每个表的文件都存在于 MySQL 数据目录中。

但是,当我尝试 SELECT 表中的某些内容时,我收到一条错误消息,指出该表不存在。然而,这没有意义,因为我能够通过SHOW TABLES 语句显示同一张表。

我的猜测是SHOW TABLES 列出文件存在但不检查文件是否已损坏。因此,我可以列出这些文件,但不能访问它们。

不过,这只是一个猜测。我以前从未见过这种情况。现在,我无法重新启动数据库进行测试,但使用它的所有其他应用程序都运行良好。 但这只是猜测,我以前从未见过。

有人知道为什么会这样吗?

例子:

mysql> SHOW TABLES;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             |
| TABLE_TWO             |
| TABLE_THREE           |
+-----------------------+
mysql> SELECT * FROM TABLE_ONE;
ERROR 1146 (42S02): Table 'database.TABLE_ONE' doesn't exist

【问题讨论】:

  • 您是否从备份中恢复了数据库?或者你只是复制了数据库文件?你有 mysql 服务器的 root 权限吗?
  • 刚刚复制了文件!是的,我对所有内容都有 root 访问权限
  • 你可以试试:mysql_fix_privilege_tables
  • 这些是 innodb 表吗?
  • 是的,所有的表都是 InnoDB。不说是我的错!

标签: mysql exists database-table


【解决方案1】:

以防万一有人仍然关心:

使用命令直接复制数据库目录后我遇到了同样的问题

cp -r /path/to/my/database /var/lib/mysql/new_database

如果您对使用InnoDB 表的数据库执行此操作,您将收到上述疯狂的“表不存在”错误。

问题是您需要 MySQL 数据目录根目录中的 ib* 文件(例如 ibdata1ib_logfile0ib_logfile1)。

当我复制这些内容时,它对我有用。

【讨论】:

  • 救了我的命!对于其他任何人,如果您尝试复制到新安装,请确保不要覆盖现有的 ib* 文件。备份你现有的 mysql/ 目录,用你想要恢复的旧目录替换,mysqldump 一切,然后恢复新的 mysql/。然后就可以正确导入mysqldumps了。
  • 在 Mac 上要在本地复制我的数据库,除了复制 ibdata 文件(位于数据库目录旁边)之外,我还必须 chown _mysql:wheel 数据库名称目录、ibdata 和目录中的所有文件(使用chown -R ...)。同样,目录中的权限不正确,因此需要chmod -R 660 databasename 才能让表显示在数据库中。
  • 谢谢迈克。只是为了澄清您需要重新启动 mysql 服务才能使其正常工作。至少我做到了,谢天谢地,它奏效了。那里保存了很多数据!
  • 注意:不要忘记使用chown!!!所以,在cp 之后使用这个命令 -> chown mysql:mysql /var/lib/mysql/ -R
  • 注2:不要忘记申请适当的许可。在我的情况下sudo chmod -R 600 /var/lib/mysql
【解决方案2】:

对我来说,在 Mac OS(MySQL DMG 安装)上,简单地重启 MySQL 服务器即可解决问题。我猜是休眠造成的。

【讨论】:

  • 感谢也为我解决了同样的问题。我的机器由于突然断电而关闭后发生。在第一台机器重启/MySQL 启动后,我得到了错误。然后,我读了这个答案。我通过 System Preferences 停止/启动 MySQL 并修复它。
  • sudo /usr/local/mysql/support-files/mysql.server restart
  • 同样如此。我在升级到 macOS Sierra 10.12.6 后遇到了这个问题。不确定是否存在因果关系,但时机似乎很可疑。
  • 谢谢,工作到一定程度;我重新启动(5.6,windows)mysql服务然后运行check table TABLE_ONE;我得到了一些错误“分区p2返回错误”,“idx_blah_1被标记为损坏”和“idx_blah_2被标记为损坏”。现在我回到运行 optimize table TABLE_ONE; 并收到错误“表 'database.TABLE_ONE' 不存在”。
  • 在 Mojave 上运行 MySLQ。通过系统首选项面板重新启动不起作用。我不得不通过命令行重新启动。
【解决方案3】:

当我使用的表名的大小写关闭时,我会遇到此问题。所以表被称为“db”,但我在选择语句中使用了“db”。确保大小写相同。

【讨论】:

  • +1 字段名不区分大小写,但表名区分。常见的错误,非常烦人。
【解决方案4】:

lower_case_table_names 设置为1,然后尝试访问使用该变量的默认值创建的表时,也会发生此错误。在这种情况下,您可以将其恢复为以前的值,您将能够读取该表。

【讨论】:

  • 这咬到我了。我恢复了值,重新启动了数据库,导出了表,将值设置回 1,重新启动了数据库,重新导入了表,一切都恢复正常了。
  • 这是我的罪魁祸首。
【解决方案5】:
  1. 停止mysqld
  2. 备份mysql文件夹:cp -a /var/lib/mysql /var/lib/mysql-backup
  3. 从旧机器复制数据库文件夹到/var/lib/mysql
  4. 从旧数据库覆盖 ib* (ib_logfile* , ibdata)
  5. 启动mysqld
  6. 转储数据库
  7. mysqldump >dbase.mysql
  8. 停止mysql服务
  9. 删除/var/lib/mysql
  10. /var/lib/mysql-backup 重命名为/var/lib/mysql
  11. 启动mysqld
  12. 创建数据库
  13. mysqldump < dbase.mysql

【讨论】:

  • 就我而言,我还必须这样做: 10.5 从 /var/lib/mysql/ 下删除 目录
  • 它不工作。 :( 表 'tablename.wp_posts' 不存在
  • 由于一些不可预见的情况,我备份了我的整个/var/lib/mysql 文件夹,并且在重新安装了我的 manjaro 盒子后,它工作得很好。厉害了我的好人!你给我一杯社交距离啤酒。
【解决方案6】:

我不知道原因,但就我而言,我解决了只是禁用和启用外键检查

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;

【讨论】:

  • 谢谢兄弟!就我而言,我不得不禁用 foreign_key_checks 并在消失的表上执行选择查询,然后表又恢复正常。我认为数据行中有一些外键违规,因为在这个问题发生之前我有一个中断的程序。
  • 还没能找到具体原因,但这也解决了我的问题
  • 在我的例子中,它有助于运行SET FOREIGN_KEY_CHECKS=0;,然后在同一个控制台中执行SHOW CREATE TABLE …,然后重新启用SET FOREIGN_KEY_CHECKS=1;
  • 这对我们也有帮助,日志中有一些有用的信息:2021-10-01T11:26:26.020904Z 8 [Warning] InnoDB: Load table foo.bar failed, the table has missing foreign key indexes. Turn off 'foreign_key_checks' and try again. 2021-10-01T11:26:26.020927Z 8 [Warning] InnoDB: Cannot open table foo/bar from the internal data dictionary of InnoDB though the .frm file for the table exists. Please refer to http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting.html for how to resolve the issue.
【解决方案7】:

请运行查询:

SELECT 
    i.TABLE_NAME AS table_name, 
    LENGTH(i.TABLE_NAME) AS table_name_length,
    IF(i.TABLE_NAME RLIKE '^[A-Za-z0-9_]+$','YES','NO') AS table_name_is_ascii
FROM
    information_schema.`TABLES` i
WHERE
    i.TABLE_SCHEMA = 'database'

不幸的是,MySQL 允许在表名中使用 unicode 和不可打印的字符。 如果您通过从某个文档/网站复制创建代码来创建表格,则它有可能在某处具有零宽度空间。

【讨论】:

  • 非常有用的帖子,谢谢!但所有表都是具有正确名称长度的 ASCII
【解决方案8】:

我遇到了同样的问题,我搜索了2-3天,但对我来说解决方案真的很愚蠢。

重启mysql

$ sudo service mysql restart

现在可以访问表格了。

【讨论】:

  • 完全为我工作,虽然我的命令略有不同:$ sudo /usr/local/mysql/support-files/mysql.server restart
  • 我猜这应该是最重要的尝试。值得一试,就我而言,它奏效了。
【解决方案9】:

我刚刚在这个噩梦中度过了三天。理想情况下,您应该有一个可以恢复的备份,然后简单地删除损坏的表。这些类型的错误可能会导致您的 ibdata1 增长巨大(对于普通表来说,大小超过 100GB)

如果您没有最近的备份,例如,如果您依赖 mySqlDump,那么您的备份可能在过去的某个时候默默地中断了。您将需要导出数据库,这当然不能这样做,因为在运行 mySqlDump 时会出现锁定错误。

因此,作为一种解决方法,请转到 /var/log/mysql/database_name/ 并删除 table_name。*

然后立即尝试转储表;这样做现在应该可以了。现在将数据库恢复到新数据库并重建丢失的表。然后转储损坏的数据库。

在我们的例子中,我们还在所有数据库上不断收到mysql has gone away 消息,时间间隔是随机的;删除损坏的数据库后,一切都恢复正常。

【讨论】:

  • 谢谢安迪,我知道了我面临的问题的线索。我将 ibdata1 从 C 驱动器中的某个位置移动到 D 驱动器,以节省 C 驱动器上的空间紧缩。幸运的是,在阅读了您的 cmets 后,我在 D 驱动器中获得了 ibdata1(以及 ib_logfile1. 和 ib_logfile0 文件)。现在将从我移动这些文件的位置查看并将其恢复到那里。然后希望我的桌子会回来。
  • 你如何“立即尝试转储表”?我有同样的问题,没有备份,所以我正在寻找至少获取表结构的方法,但是如果你从目录中删除文件,那么一切都消失了?
  • 做到了!谢谢,
【解决方案10】:

好的。这听起来很荒谬,但请幽默。
对我来说,当我将我的陈述改为这样时,问题就解决了:

SELECT * FROM `table`

我做了两个更改
1.) 将表名设为小写 - 我知道!!
2.) 使用了特定的引号 = ` :它是您的 TAB 上方的键

这个解决方案听起来很荒谬,但它奏效了,现在是星期六晚上,我从早上 9 点开始工作 - 所以我会接受它 :)

祝你好运。

【讨论】:

  • 仅供参考 - 该表是 MyISAM 而不是 INNO
  • `也称为反引号
  • @PlanetUnknown “这是您 TAB 上方的钥匙” - 你怎么知道这是真的?我有它在我的“P”键的右侧。不是每个人都有相同的键盘布局。
【解决方案11】:

在复制 idb-file 之前尝试运行 sql 查询以丢弃表空间:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制 idb 文件

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

重启MySql

【讨论】:

  • 你救了我:)
  • @I0pan 我尝试了上述相同的步骤。但是在 ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;它显示表不存在。但它确实:(
【解决方案12】:

对我有用的是,只是放下桌子,即使它不存在。然后我重新创建了表并从之前完成的 sql 转储中重新填充。

一定有一些表名的元数据库,而且在我删除它之前它很可能仍然存在。

【讨论】:

  • 我创建了一个程序,意识到它需要是一个视图。所以我在最后用一些 zzz 重命名了该过程,以便我可以参考它并创建一个同名的视图。无法获得 SELECT 来查看它,出现此错误。
    将代码复制到文本文件,删除视图和过程。重新创建了视图,一切都很好。
    所以是的 - 七年后 - 在某些边缘情况下仍然会发生某种幽灵/缓存名称操作。
【解决方案13】:

我在升级 WAMP 但没有数据库备份后遇到了这个问题。

这对我有用:

  1. 停止新的 WAMP

  2. 从旧 WAMP 安装中复制您需要的数据库目录和 ibdata1 文件

  3. 删除ib_logfile0ib_logfile1

  4. 启动 WAMP

您现在应该可以备份您的数据库了。但是,在您的服务器再次重新启动后,您仍然会遇到问题。所以现在重新安装 WAMP 并导入您的数据库。

【讨论】:

  • 我希望人们指出他们引用的文件所在的位置......
  • 从没有可读表的 mysql docker 镜像中获得。可以确认停止映像、删除这些文件并重新启动再次授予访问权限。
【解决方案14】:

在重新安装 MySQL 后,我遇到了同样的问题,似乎在安装过程中,一些存储有关 InnoDB 日志文件数据的配置文件,这些文件 ib_logfile*(它们是日志文件对吗?),被覆盖了。为了解决这个问题,我刚刚删除了 ib_logfile* 文件。

【讨论】:

    【解决方案15】:

    鬼表也有类似的问题。幸好在失败之前有一个 SQL 转储。

    就我而言,我必须:

    1. 停止 mySQL
    2. 将 ib* 文件从 /var/mysql 移至备份
    3. 删除/var/mysql/{dbname}
    4. 重启 mySQL
    5. 重新创建空数据库
    6. 恢复转储文件

    注意:需要转储文件。

    【讨论】:

    • 我猜你的意思是/var/lib/mysql而不是/var/mysql
    • 删除数据库目录并从备份中恢复是唯一对我有帮助的事情。
    【解决方案16】:
    1. 做mysqldump到数据库:

      mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
      
    2. 恢复数据库

      mysql -u user -ppass dbname < D:\Back-ups\dbname.sql
      

    现在数据库中的所有表都已完全恢复。试试..

    SELECT * FROM dbname.tablename;
    

    【讨论】:

      【解决方案17】:

      我在新电脑上安装了 MariaDB, 停止Mysql服务 将数据文件夹重命名为 data- 我解决了我的复制问题 Mysql\data\table_foldersibdata1 从崩溃的 HD MySql 数据文件夹到新安装的 mysql 数据文件夹。

      我跳过了ib_logfile0ib_logfile1(否则服务器没有启动服务)

      启动mysql服务。

      然后服务器正在运行。

      【讨论】:

        【解决方案18】:

        似乎问题与无效(损坏?)innodb 日志文件有关(至少在我和其他一些人中)。一般来说,它们只是需要重新创建。

        这里有解决办法,大部分都需要重启mysql。

        • 重新创建您的日志文件 (Delete and restart mysql)
        • Resize your log files(MySql 5.6+ 会为你重新生成文件)
        • 如果您正在执行某种类型的数据迁移,请确保您已正确迁移正确的文件并为其授予权限,正如其他人已经声明的那样
        • 检查您的数据和日志文件的权限,mysql 是两者的所有者
        • 如果一切都失败了,您可能必须重新创建数据库

        【讨论】:

          【解决方案19】:

          这里是另一个场景(版本升级)

          我重新安装了我的操作系统(Mac OS El Captain)并安装了新版本的 mysql(使用自制软件)。安装的版本(5.7)恰好比我以前的版本更新。然后我复制了表,包括 ib* 文件,然后重新启动了服务器。我可以在 mysql 工作台中看到表,但是当我尝试选择任何内容时,我得到“表不存在”。

          解决方案:

          1. 停止 mysql 服务器,例如mysql.server stopbrew services stop mysql
          2. 使用mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/ 启动服务器(根据需要更改路径)
          3. 运行mysql_upgrade -u root -p password(在另一个终端窗口中)
          4. 关闭正在运行的服务器mysqladmin -u root -p password shutdown
          5. 以正常模式重启服务器mysql.server startbrew services start mysql

          相关文档为here

          【讨论】:

          • 尝试了很多,但在我将所有数据库转移到新服务器后,这是唯一对我有很大帮助的事情。谢谢! (Ubuntu 16.04)
          【解决方案20】:

          在我的例子中,我在表上定义了一个触发器,然后试图在表中插入行。似乎,不知何故触发器是错误的,因此插入给出错误,表不存在。

          【讨论】:

          • 这对我有用!检查了每个触发器,发现有一个触发器需要改进,并且成功了!
          【解决方案21】:

          仅从旧数据目录复制 ibdata1 文件。不要复制ib_logfile1ib_logfile0 文件。这将导致 MySQL 不再启动。

          【讨论】:

            【解决方案22】:

            今天遇到同样的问题。这是一个mysql“标识符大小写敏感性”问题。

            请检查相应的数据文件。很可能文件系统上的文件名是小写的,但“show tables”命令中列出的表名是大写的。如果系统变量“lower_case_table_names”为0,则查询将返回“表不存在”,因为当“lower_case_table_names”为0时,名称比较区分大小写。

            【讨论】:

              【解决方案23】:

              您的表名中可能有隐藏字符。当你做一个展示表时,那些不会出现。你能做一个“SHOW CREATE TABLE TABLE_ONE”,然后用 Tab 完成“TABLE_ONE”,看看它是否放入了任何隐藏字符。另外,您是否尝试过删除并重新制作表格。只是为了确保权限没有问题并且没有隐藏字符。

              【讨论】:

              • 制表符完成没有帮助,我无法显示创建表,因为表“不存在”。来自地狱
              【解决方案24】:

              TimeMachine 备份导入后同样的问题。我的解决方案是停止 MySQL 服务器并修复 ib* 文件的读写权限。

              【讨论】:

                【解决方案25】:

                我认为值得在这里提出的另一个答案(因为我来到这里时遇到了同样的问题,结果证明这是我的答案):

                仔细检查查询中的表名是否与数据库中的表名拼写完全相同

                有点明显,新手的事情,但像 “user” 与 “users” 这样的事情可能会让人绊倒,我认为在此处的列表中会有一个有用的答案。 :)

                【讨论】:

                  【解决方案26】:

                  在我的例子中,当我导入导出的 sql 文件时,我收到了一个错误,比如创建表查询的表不存在。

                  我意识到我的数据库名称中有一个下划线,而 mysql 在此之前放了一个转义字符。

                  所以我删除了数据库名称中的下划线,一切顺利。

                  希望它也对其他人有所帮助。

                  【讨论】:

                    【解决方案27】:

                    我的表格不知何故被重命名为' Customers',即带有前导空格

                    这意味着

                    a) 查询中断

                    b) 表格没有按我的表格的字母顺序出现在预期的位置,这在我的恐慌中意味着我看不到它!

                    RENAME TABLE ` Customer` TO `Customer`;
                    

                    【讨论】:

                      【解决方案28】:

                      在我的例子中是SQLCA.DBParm 参数。

                      我用过

                      SQLCA.DBParm = "Databse = "sle_database.text""
                      

                      但必须是

                      SQLCA.DBParm = "Database='" +sle_database.text+ "'"
                      

                      说明:

                      你要合并三个字符串:

                       1. Database='              -  "Database='"
                      
                       2. (name of the database)  - +sle_database.text+
                      
                       3. '                       - "'" (means " ' "  without space)
                      

                      不要在四分号中使用空格。 感谢我的同事 Jan。

                      【讨论】:

                        【解决方案29】:

                        转到:xampp\mysql\data\dbname
                        dbname 里面有 tablename.frm 和 tablename.ibd 文件。
                        删除它 然后重启mysql再试一次。

                        【讨论】:

                          【解决方案30】:

                          我在 Windows 中遇到了同样的问题。 除了复制 ib* 文件和 thd 数据目录下的 mysql 目录之外,我还必须匹配 my.ini 文件。

                          我之前安装的 my.ini 文件没有以下行:

                          innodb-page-size=65536
                          

                          但是我的新安装做到了。可能是因为我在较旧的安装程序中没有该选项。 我删除了它并重新启动了服务,并且表格按预期工作。 简而言之,确保新的 my.ini 文件是旧文件的副本,唯一的例外是 datadir、plugin-dir 和 port#,具体取决于您的新安装。

                          【讨论】:

                            猜你喜欢
                            • 2018-08-02
                            • 2015-06-16
                            • 2011-05-14
                            • 1970-01-01
                            • 2017-06-07
                            • 1970-01-01
                            • 2017-05-26
                            相关资源
                            最近更新 更多