MySQL>表不存在。但它确实(或它应该)

时间:2011-10-13 19:07:32

标签: mysql exists database-table

我确实更改了MySQL安装的datadir,并按照一些步骤正常工作。我所拥有的每个基地都正确地移动了一个。

我可以连接和使用数据库,甚至SHOW TABLES正确返回所有表,并且每个表的文件都存在于mysql数据目录中。但是当我尝试在那里选择某些东西时,它表示该表不存在。但该表确实存在,它甚至在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

34 个答案:

答案 0 :(得分:246)

万一有人还在乎:

使用命令

直接复制数据库目录后,我遇到了同样的问题
cp -r /path/to/my/database /var/lib/mysql/new_database

如果对使用InnoDB表的数据库执行此操作,则会出现上述错误的“表不存在”错误。

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

当我复制那些对我有用的时候。

答案 1 :(得分:44)

对于我在Mac OS(MySQL DMG安装)上,简单重启MySQL服务器就解决了这个问题。我猜是冬眠引起了它。

答案 2 :(得分:25)

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

答案 3 :(得分:23)

当我正在使用的表名的情况已关闭时,我遇到此问题。所以table被称为'db',但我在select语句中使用'DB'。确保案例相同。

答案 4 :(得分:16)

  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. dump dabase
  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

答案 5 :(得分:13)

请运行查询:

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

答案 6 :(得分:9)

我在这场噩梦中度过了三天。理想情况下,您应该有一个可以恢复的备份,然后只需删除损坏的表。这些类型的错误可能导致您的ibdata1增长巨大(适用于普通表格的大小为100GB +)

如果您没有最近的备份,例如您依赖mySqlDump,那么您的备份可能会在过去的某个时刻默默地破坏。您将需要导出数据库,这当然是您无法做到的,因为在运行mySqlDump时会出现锁定错误。

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

然后立即尝试转储表;这样做现在应该有效。现在将数据库还原到新数据库并重建丢失的表。然后转储损坏的数据库。

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

答案 7 :(得分:8)

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

  

重启mysql

$ sudo service mysql restart

现在可以访问表格了。

答案 8 :(得分:7)

O.k。这听起来很荒谬,但幽默我 对我来说,当我将声明改为此时问题得到了解决:

SELECT * FROM `table`

我做了两次修改 1.)使表名小写 - 我知道!!
2.)使用特定的引号= `:这是你TAB上方的键

解决方案听起来很荒谬,但它确实有效,而且是星期六晚上,我从上午9点开始工作 - 所以我会接受它:)

祝你好运。

答案 9 :(得分:7)

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

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制idb-file

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

重启MySql

答案 10 :(得分:5)

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

在我的情况下,我不得不:

  1. 停止mySQL
  2. 将ib *文件从/var/mysql移至备份
  3. 删除/var/mysql/{dbname}
  4. 重启mySQL
  5. 重新创建空数据库
  6. 还原转储文件
  7. 注意:需要转储文件。

答案 11 :(得分:5)

升级WAMP但没有数据库备份后出现此问题。

这对我有用:

  1. 停止新的WAMP

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

  3. 删除ib_logfile0ib_logfile1

  4. 启动WAMP

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

答案 12 :(得分:5)

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

答案 13 :(得分:5)

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

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;

答案 14 :(得分:3)

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

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

答案 15 :(得分: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
  6. 重启服务器

    相关文档为here

答案 16 :(得分:2)

在我的情况下,我在表上定义了一个触发器,然后尝试在表中插入行。似乎,某种程度上触发是错误的,因此插入是错误的,表格不存在。

答案 17 :(得分:2)

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

我跳过 ib_logfile0 ib_logfile1 (否则服务器无法启动服务)

启动mysql服务。

然后服务器正在运行。

答案 18 :(得分:2)

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

以下是解决方案,其中大部分需要重启mysql。

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

答案 19 :(得分:2)

  1. 对数据库执行mysqldump:

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

    mysql -u user -ppass dbname < D:\Back-ups\dbname.sql
    
  3. 现在,数据库中的所有表都已完全恢复。尝试..

    SELECT * FROM dbname.tablename;
    

答案 20 :(得分:1)

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

答案 21 :(得分:1)

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

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

有点明显的新手,但“用户”与“用户”之类的东西可以让人吵起来,我认为这将是一个有用的答案。 :)

答案 22 :(得分:1)

仅复制旧数据目录中的ibdata1文件。请勿复制ib_logfile1ib_logfile0个文件。这将导致MySQL不再启动。

答案 23 :(得分:1)

今天遇到了同样的问题。这是一个mysql“Identifier Case Sensitivity”问题。

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

答案 24 :(得分:1)

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

先前安装中的my.ini文件没有以下行:

innodb-page-size=65536

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

答案 25 :(得分:1)

我的表格已经以某种方式重命名为' Customers',即领先空间

这意味着

a)查询破裂

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

RENAME TABLE ` Customer` TO `Customer`;

答案 26 :(得分:1)

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

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

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

希望它也可以帮助别人。

答案 27 :(得分:1)

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

答案 28 :(得分:1)

就我而言,它是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)

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

答案 29 :(得分:1)

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

答案 30 :(得分:0)

在我的情况下,我没有进行datadir重定位或任何类型的文件操作。它发生在一个晴朗的早晨。

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

答案 31 :(得分:0)

如果表名中有句号,则表示失败 SELECT * FROM poorly_named.table;

使用反引号来查找表格 SELECT * FROM `poorly_named.table`;

答案 32 :(得分:0)

我有同样的问题,但这不是由于隐藏的角色或“schroedinger的桌子”。在恢复过程之后出现问题(完全如上所述)。我正在使用MySQL管理员版本1.2.16。必须执行还原时,必须在目标架构中取消选中ORIGINAL,然后从下拉框中选择数据库的名称。之后问题得到解决。至少那是我数据库中的原因。

答案 33 :(得分:0)

键入时,您在桌上缺少一个字符。请执行以下操作:

mysql> show tables;
+-----------------------+
| Tables_in_database    |
+-----------------------+
| TABLE_ONE             | Double click on TABLE_ONE and copy*
| TABLE_TWO             | (*You'd get the correct string)
| TABLE_THREE           |
+-----------------------+

mysql> SELECT * paste_your_copied_table;

如果表在mysql中显示,则该表存在。应该可以!