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

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

只是复制了文件!是的,我拥有对所有内容的根访问权限。 - johnsmith
4
这些是InnoDB表吗? - Paul Dixon
1
是的,所有的表都是InnoDB。我的错,我没有说清楚! - johnsmith
最好将SQL导出并在新数据库上导入。 - DavidTaubmann
将来请查看日志文件,以便共享相关行。可能在您的系统中,您会看到类似于“[警告] InnoDB:加载表foo.bar失败,该表缺少外键索引。”这样的内容,就像其中一个答案中所看到的那样。我在这个旧问题中写下这条消息,因为评论中还没有人说查看日志文件是一个好习惯。谢谢! - Valerio Bozz
显示剩余8条评论
34个回答

2

仅从旧数据目录中复制ibdata1文件。不要复制ib_logfile1ib_logfile0文件,否则MySQL将无法启动。


仅仅因为它启动了并不意味着它不会被严重损坏。缺少ib_logfile0/1会导致用户丢失数据。通常,错误日志会有一个描述性的消息,在引起可能的数据损坏之前应该阅读。 - danblack

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)

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


1

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

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

innodb-page-size=65536

但是我的新安装程序却可以。可能是因为旧的安装程序中没有这个选项。 我删除了它并重新启动了服务,表格按预期工作。 简而言之,请确保新的my.ini文件与旧文件相同,唯一的例外是datadir、plugin-dir和端口号,具体取决于您的新安装。


1

前往:xampp\mysql\data\dbname
在dbname中有tablename.frm和tablename.ibd文件。
删除它并重新启动mysql,然后再试一次。


1

我在新电脑上安装了MariaDB,停止了Mysql服务,将数据文件夹重命名为data-。我通过将坏掉的硬盘中的Mysql数据文件夹中的Mysql\data\table_foldersibdata1复制到新安装的Mysql数据文件夹中来解决了我的问题。我跳过了ib_logfile0ib_logfile1(否则服务器无法启动服务)。然后启动了Mysql服务,现在服务器正在运行。


导致服务器无法启动的错误日志信息是什么?您使用的是相同的MariaDB版本吗?删除ib_logfile0/1会导致用户丢失数据。通常,在引起可能的数据损坏之前,应阅读错误日志中的描述性消息。 - danblack

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

1

我认为值得在这里提到的另一个答案(因为我也曾遇到同样的问题,这个答案对我起了作用):

仔细检查您查询中的表名,确保其与数据库中的表名拼写完全相同

这是一个显而易见的新手错误,但类似"user" vs "users"的问题会使人们感到困惑,我认为将其列在这里会很有帮助。:)


1
在我的情况下,当我导入导出的sql文件时,我遇到了一个错误,如创建表查询时出现“表不存在”的错误。
我意识到我的数据库名称中有一个下划线,mysql在该字符前面放置了转义字符。
因此,我删除了数据库名称中的下划线,一切都顺利解决了。
希望这能对其他人有所帮助。

1

你的表名可能存在隐藏字符。这些字符在执行“show tables”命令时不会显示出来。你可以尝试执行“SHOW CREATE TABLE TABLE_ONE”命令,并使用Tab键自动补全“TABLE_ONE”的名称,看看是否会插入任何隐藏字符。此外,你也可以尝试删除并重新创建表格,以确保权限没有问题且不存在隐藏字符。


Tab键自动补全无法帮助我,而且我无法显示创建表,因为表“不存在”。太糟糕了。 - johnsmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接