MySQL>表不存在。但这确实(或者应该如此)


261

我更改了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

您是否已从备份还原数据库?还是您只是复制了db文件?您具有对mysql服务器的root访问权吗?
alinoz 2011年

刚刚复制了文件!是的,我拥有一切访问权
johnsmith

你可以尝试:mysql_fix_privilege_tables
alinoz

4
这些是innodb表吗?
Paul Dixon

1
是的,所有表都是InnoDB。我不好说!
约翰史密斯

Answers:


263

以防万一有人还在乎:

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

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

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

问题是,你需要ib*在MySQL的datadir根目录的文件(例如ibdata1ib_logfile0ib_logfile1)。

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


27
救了我一命!对于其他任何人,如果要复制到新安装中,请确保不要覆盖现有的ib *文件。备份您现有的mysql /目录,用您要恢复的旧目录替换,mysqldump一切,然后恢复新的mysql /。然后,您可以正确导入mysqldumps。
马修

1
在Mac上,要在本地复制数据库,除了要复制ibdata文件(位于数据库dir旁边)外,我还必须复制到chown _mysql:wheel数据库名称dir,ibdata和dir中的所有文件(使用chown -R ...)。同样,目录中的权限chmod -R 660 databasename也不正确,因此需要使用这些权限才能使表显示在数据库中。
Dylan Valade 2012年

4
谢谢迈克。只是为了澄清您将需要重新启动mysql服务才能使它正常工作。至少我做到了,并且谢天谢地,它奏效了。很多数据保存在那里!
Nick Martin

15
注意:不要忘记使用chown!因此,所有cp使用此命令的人->chown mysql:mysql /var/lib/mysql/ -R
K-Gun 2014年

1
注意2:不要忘记应用适当的权限。以我sudo chmod -R 600 /var/lib/mysql
为例

45

对我而言,在Mac OS(MySQL DMG安装)上,只需重启MySQL服务器即可解决该问题。我猜是因为冬眠造成的。


谢谢我也解决了同样的问题。我的机器由于突然断电而关闭后发生了事故。在第一台机器重启/ MySQL启动之后,我得到了错误。然后,我读了这个答案。我通过“系统偏好设置”停止/启动了MySQL,它已修复。
杰夫·埃文斯

2
sudo /usr/local/mysql/support-files/mysql.server restart
laffuste

同样。升级到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。无法通过系统偏好设置面板重新启动。我必须通过命令行重新启动。
Cortex

30

当我使用的表名的大小写关闭时,出现此问题。因此表称为“ db”,但我在select语句中使用了“ DB”。确保大小写相同。


13
+1字段名称不区分大小写,但表名称则区分大小写。常见的错误,很烦人。
GolezTrol

27

设置lower_case_table_names1,然后尝试访问使用该变量的默认值创建的表时,也会发生此错误。在这种情况下,您可以将其还原为先前的值,并且可以读取该表。


4
这咬了我。我还原了该值,重新启动了数据库,导出了表,将值设置回1,重新启动了数据库,重新导入了表,然后一切又重新开始了。
wmarbut '16

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

就我而言,我还必须做:10.5从/ var / lib / mysql /下删除<db_name>目录
Tony the Tech

它不起作用。:(表'tablename.wp_posts'不存在
Jahirul Islam Mamun

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


非常有用的帖子,谢谢!但所有表格均为具有正确名称长度的ASCII
johnsmith

11

我刚刚在这场噩梦中呆了三天。理想情况下,您应该具有可以还原的备份,然后只需删除损坏的表即可。这些错误可能导致您的ibdata1变得巨大(对于中等大小的表,其大小 100GB)

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

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

然后立即尝试转储表;现在应该可以执行此操作。现在,将数据库还原到新数据库并重建丢失的表。然后转储损坏的数据库。

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


谢谢安迪,我对遇到的问题有所了解。我将ibdata1从C驱动器中的某个位置移到了D驱动器中,以节省C驱动器上的空间。值得庆幸的是,在阅读您的评论后,我在D驱动器中获得了ibdata1(以及ib_logfile1。和ib_logfile0文件)。现在将从我将这些文件移至何处并将其还原到那里。然后希望我的桌子能回来。
2014年

您如何“立即尝试转储表格”?我有同样的问题,没有备份,所以我正在寻找至少要获取表结构的方法,但是如果您从目录中删除文件,那么一切都消失了吗?
mmvsbg '16

做到了!谢谢,
jstuardo

11

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

SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;

4
谢了,兄弟!就我而言,我必须禁用foreign_key_checks并在消失的表上执行选择查询,然后该表再次恢复正常。我认为数据行中存在一些外键冲突,因为在此问题发生之前我的程序被中断了。
Egist Li

还未能确切找到原因,但这也解决了我的问题
Miroslav Glamuzina

11

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

重启mysql

$ sudo service mysql restart

现在可以访问表格了。


1
完全为我工作,尽管我的命令略有不同:$ sudo /usr/local/mysql/support-files/mysql.server restart
KirstieBallance

我猜这应该是要尝试的事情的顶部。值得一试,在我看来,它奏效了。
Coroos

7

好的,这听起来很荒谬,但我很幽默。
对我来说,当我将声明更改为以下内容时,问题已解决:

SELECT * FROM `table`

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

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

祝好运。


1
仅供参考-桌子是MyISAM而不是INNO
PlanetUnknown

1
也将`称为反引号
加里

7

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

这为我工作:

  1. 停止新的WAMP

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

  3. 删除ib_logfile0ib_logfile1

  4. 启动WAMP

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


我希望人们能指出他们引用的文件在哪里...
MagentoAaron

从这里没有可读取的表从mysql docker镜像获得。可以确认停止映像,删除这些文件,然后重新启动再次给予了访问权限。
安东尼·哈利

7

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

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制idb文件

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

重启MySql


您救了我:)
16个

@ I0pan我尝试了与上述相同的步骤。但是在ALTER TABLE mydatabase.mytable IMPORT TABLESPACE之后;它显示表不存在。但是,它确实是:(
Syed Asad Abbas Zaidi

5

在必须重新安装MySQL之后,我遇到了同样的问题,似乎在安装期间,一些存储有关InnoDB日志文件的数据的配置文件,这些文件ib_logfile *(它们是正确的日志文件?)被覆盖了。为了解决这个问题,我只是删除了ib_logfile *文件。


5

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

必须有一些表名的配置数据库,在我删除它之前,它很可能仍然存在。


我创建了一个过程,意识到它需要成为一个视图。因此,我在程序的最后加上了一些zzz,以供参考,并创建了一个同名视图。无法获得选择以查看它,出现此错误。<br>将代码复制到文本文件,同时删除视图和过程。重新创建了视图,一切都很好。<br>所以,是的-七年后-在某些情况下,仍然存在某种鬼影/缓存名称动作。
罗格·克鲁格

5

幻影表也有类似的问题。值得庆幸的是,发生故障之前发生了SQL转储。

就我而言,我必须:

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

注意:需要转储文件。


我想你的意思/var/lib/mysql不是/var/mysql
knocte

删除数据库目录并从备份还原是唯一帮助我的事情。
Jano

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;

2

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

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

启动mysql服务。

然后服务器正在运行。


2

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

这里是解决方案,其中大多数都需要重新启动mysql。

  • 重新创建您的日志文件(删除并重新启动mysql
  • 调整日志文件的大小(MySql 5.6+将为您重新生成文件)
  • 如果您要进行某种类型的数据迁移,请确保已正确迁移了正确的文件,并赋予了其权限(如其他人所述)
  • 检查您的数据和日志文件的权限,即mysql是两者的所有者
  • 如果所有其他方法均失败,则可能必须重新创建数据库

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

相关文档在这里


尝试了很多,但这是唯一的帮助,在我将所有数据库移到新服务器后,对我有很大帮助。谢谢!(Ubuntu 16.04)
Falk

2

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


1
这对我有用!检查每个触发器,发现其中一个触发器需要改进,并且有效!
Paresh

1

您的表名中可能包含隐藏字符。当您制作表演桌时,这些不会出现。您可以执行“ SHOW CREATE TABLE TABLE_ONE”,然后使用制表符完成“ TABLE_ONE”并查看是否放置了任何隐藏字符。另外,您是否尝试过删除和重新制作表。只是为了确保特权没有错,并且没有隐藏的字符。


制表符完成无济于事,并且我无法显示创建表,因为表“不存在”。从地狱里来
约翰史密斯(Johnsmith)

1

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


1

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

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

这是一种显而易见的新手事物,但是“用户”与“用户”之类的东西可能会使人绊倒,我认为在此列表中有一个有用的答案。:)


1

在我的情况下,当我导入导出的sql文件时,我收到一个错误,例如对于create table查询而言,table不存在。

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

因此,我删除了数据库名称中的下划线,一切正常。

希望它也能帮助其他人。


1

我的桌子已经以某种方式重命名为' Customers'即,带有空格

这意味着

a)查询中断

b)该表未按我的表的字母顺序出现在预期的位置,这在我的恐慌中表示我看不到它!

RENAME TABLE ` Customer` TO `Customer`;

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)

不要在四分之一标记中使用空格。感谢我的同事扬。


1

转至:xampp\mysql\data\dbname
在dbname内具有tablename.frm和tablename.ibd文件。
删除它并重新启动mysql,然后重试。



1

今天遇到了同样的问题。这是mysql的“标识符区分大小写”问题。

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


1

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

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

innodb-page-size=65536

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.