我确实更改了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
答案 0 :(得分:246)
万一有人还在乎:
使用命令
直接复制数据库目录后,我遇到了同样的问题cp -r /path/to/my/database /var/lib/mysql/new_database
如果对使用InnoDB
表的数据库执行此操作,则会出现上述错误的“表不存在”错误。
问题是您需要MySQL datadir根目录中的ib*
个文件(例如ibdata1
,ib_logfile0
和ib_logfile1
)。
当我复制那些对我有用的时候。
答案 1 :(得分:44)
对于我在Mac OS(MySQL DMG安装)上,简单重启MySQL服务器就解决了这个问题。我猜是冬眠引起了它。
答案 2 :(得分:25)
将lower_case_table_names
设置为1
,然后尝试访问使用该变量的默认值创建的表时,也会发生此错误。在这种情况下,您可以将其恢复为之前的值,您将能够阅读该表。
答案 3 :(得分:23)
当我正在使用的表名的情况已关闭时,我遇到此问题。所以table被称为'db',但我在select语句中使用'DB'。确保案例相同。
答案 4 :(得分:16)
cp -a /var/lib/mysql /var/lib/mysql-backup
/var/lib/mysql
mysqldump >dbase.mysql
/var/lib/mysql
/var/lib/mysql-backup
重命名为/var/lib/mysql
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转储。
在我的情况下,我不得不:
/var/mysql
移至备份/var/mysql/{dbname}
注意:需要转储文件。
答案 11 :(得分:5)
升级WAMP但没有数据库备份后出现此问题。
这对我有用:
停止新的WAMP
从旧的WAMP安装中复制您需要的数据库目录和ibdata1文件
删除ib_logfile0
和ib_logfile1
启动WAMP
您现在应该可以备份数据库了。但是,在服务器重新启动后,您仍然会遇到问题。所以现在重新安装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工作台中看到这些表,但是当我尝试选择任何东西时,我得到了“表不存在”。
解决方案:
mysql.server stop
或brew services stop mysql
mysqld_safe --user=mysql --datadir=/usr/local/var/mysql/
(根据需要更改路径)启动服务器mysql_upgrade -u root -p password
(在另一个终端窗口中)mysqladmin -u root -p password shutdown
mysql.server start
或brew services start mysql
相关文档为here。
答案 16 :(得分:2)
在我的情况下,我在表上定义了一个触发器,然后尝试在表中插入行。似乎,某种程度上触发是错误的,因此插入是错误的,表格不存在。
答案 17 :(得分:2)
我在新电脑上安装了MariaDB, 停止了Mysql服务 将数据文件夹重命名为数据 - 我解决了我的问题 Mysql \ data \ table_folders 和 ibdata1 从崩溃的HD MySql数据文件夹到新安装的mysql数据文件夹。
我跳过 ib_logfile0 和 ib_logfile1 (否则服务器无法启动服务)
启动mysql服务。
然后服务器正在运行。
答案 18 :(得分:2)
看来这个问题必须(至少在我和其他一些人中)与无效(损坏的?)innodb日志文件有关。一般来说,他们只需要重新创建。
以下是解决方案,其中大部分需要重启mysql。
答案 19 :(得分:2)
对数据库执行mysqldump:
mysqldump -u user -ppass dbname > D:\Back-ups\dbname.sql
恢复数据库
mysql -u user -ppass dbname < D:\Back-ups\dbname.sql
现在,数据库中的所有表都已完全恢复。尝试..
SELECT * FROM dbname.tablename;
答案 20 :(得分:1)
转到:xampp\mysql\data\dbname
dbname里面有tablename.frm和tablename.ibd文件。
删除它
并重新启动mysql并重试。
答案 21 :(得分:1)
我认为值得在这里提出另一个答案(因为我带着同样的问题来到这里,结果证明这是我的答案):
仔细检查查询中的表格名称拼写与数据库中的完全相同。
有点明显的新手,但“用户”与“用户”之类的东西可以让人吵起来,我认为这将是一个有用的答案。 :)
答案 22 :(得分:1)
仅复制旧数据目录中的ibdata1
文件。请勿复制ib_logfile1
或ib_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中显示,则该表存在。应该可以!