282

我更改了 MySQL 安装的 datadir 并且所有基础都正确移动,除了一个。我可以连接和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
4

33 回答 33

280

以防万一有人仍然关心:

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

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

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

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

当我复制它们时,它对我有用。

于 2012-07-27T21:46:30.727 回答
47

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

于 2014-02-12T12:38:57.137 回答
35

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

于 2011-10-13T19:13:14.267 回答
33

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

于 2014-06-17T12:18:30.867 回答
17
  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
于 2012-12-03T00:51:12.307 回答
16

我不知道原因,但在我的情况下,我解决了禁用和启用外键检查

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;
于 2016-06-29T14:34:24.247 回答
14

请运行查询:

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 和不可打印的字符。如果您通过从某些文档/网站复制创建代码来创建表格,则它有可能在某处具有零宽度空间。

于 2011-10-13T19:58:59.237 回答
13

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

重启mysql

$ sudo service mysql restart

现在表格变得可访问了。

于 2017-02-25T07:55:01.823 回答
12

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

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

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

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

在我们的例子中,我们还在mysql has gone away所有数据库上不断地随机获取消息;一旦损坏的数据库被删除,一切都恢复正常。

于 2012-11-28T12:50:18.920 回答
7

好吧,这听起来很荒谬,但请幽默。
对我来说,当我将我的声明更改为此时,问题得到了解决:

SELECT * FROM `table`

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

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

祝你好运。

于 2014-12-13T22:55:45.850 回答
7

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

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制 idb 文件

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

重启MySql

于 2014-04-13T20:39:27.443 回答
6

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

必须有一些表名的元数据库,并且它很可能仍然存在,直到我删除它。

于 2013-11-19T17:39:12.677 回答
6

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

这对我有用:

  1. 停止新的 WAMP

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

  3. 删除ib_logfile0ib_logfile1

  4. 启动 WAMP

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

于 2016-06-08T15:10:27.680 回答
5

鬼表也有类似的问题。谢天谢地,在失败之前有一个 SQL 转储。

就我而言,我必须:

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

注意:需要转储文件。

于 2013-01-05T16:45:27.483 回答
5

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

于 2012-09-05T22:21:07.523 回答
3
  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;
于 2018-01-18T01:42:10.727 回答
2

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

下面是解决方法,大部分都需要重启mysql。

  • 重新创建您的日志文件(删除并重新启动 mysql
  • 调整日志文件的大小(MySql 5.6+ 将为您重新生成文件)
  • 如果您正在进行某种类型的数据迁移,请确保您已正确迁移正确的文件并为其授予权限,正如其他人已经说明的那样
  • 检查您的数据和日志文件的权限,mysql 是两者的所有者
  • 如果一切都失败了,您可能必须重新创建数据库
于 2014-07-17T16:22:55.043 回答
2

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

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

启动mysql服务。

然后服务器正在运行。

于 2014-03-10T13:34:50.930 回答
2

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

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

于 2018-04-10T10:19:14.517 回答
2

只复制ibdata1旧数据目录中的文件。不要复制ib_logfile1ib_logfile0归档。这将导致 MySQL 不再启动。

于 2018-02-18T07:02:12.987 回答
2

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

于 2017-12-31T06:26:01.133 回答
2

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

我重新安装了我的操作系统(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

相关文档在这里

于 2016-05-31T23:34:19.960 回答
1

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

于 2011-10-13T19:57:42.360 回答
1

In my case it was SQLCA.DBParm parameter.

I used

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

but it must be

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

Explaination :

You are going to combine three strings :

 1. Database='              -  "Database='"

 2. (name of the database)  - +sle_database.text+

 3. '                       - "'" (means " ' "  without space)

Don't use spaces in quatermarks. Thank to my colleague Jan.

于 2013-04-03T13:13:17.707 回答
1

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

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

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

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

于 2015-01-28T08:57:00.213 回答
1

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

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

有点明显,新手的事情,但是“用户”与“用户”之类的东西可能会让人们绊倒,我认为在这里的列表中会有一个有用的答案。:)

于 2014-08-13T18:57:20.420 回答
1

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

于 2014-03-13T13:12:50.963 回答
1

转到:xampp\mysql\data\dbname
在 dbname 里面有 tablename.frm 和 tablename.ibd 文件。
删除它并重新启动mysql并重试。

于 2017-06-14T08:40:18.073 回答
1

我的桌子不知何故被重命名为' Customers'ie 并带有前导空格

这意味着

a) 查询中断

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

RENAME TABLE ` Customer` TO `Customer`;
于 2016-08-26T12:55:42.753 回答
1

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

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

innodb-page-size=65536

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

于 2019-12-22T21:02:16.200 回答
0

我有同样的问题,但这不是由于隐藏的字符或“薛定谔的桌子”。问题(正如上面提到的)在恢复过程之后出现。我正在使用 MySQL 管理员版本 1.2.16。当必须执行还原时,您必须取消选中ORIGINAL目标架构并从下拉框中选择数据库的名称。之后问题就解决了。至少这是我数据库中的原因。

于 2012-04-06T00:44:19.643 回答
0

如果表名中有句点,它将失败 SELECT * FROM poorly_named.table;

使用反引号让它找到表 SELECT * FROM `poorly_named.table`;

于 2014-09-22T09:48:48.067 回答
0

就我而言,我没有进行数据目录重定位或任何类型的文件操作。它只是发生在一个美好的早晨。

因为,奇怪的是,我能够使用 mysqldump 转储表,尽管 MySQL 有时会抱怨“表不存在”,我通过转储表的模式 + 数据来解决它,然后删除表,然后重新之后立即创建它,然后导入。

于 2016-08-10T12:09:25.850 回答