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

当前回答

停止mysqld 备份mysql文件夹:cp -a /var/lib/mysql /var/lib/mysql- Backup 从旧机器复制数据库文件夹到/var/lib/mysql 从旧数据库覆盖ib* (ib_logfile*, ibdata) 开始mysqld 转储确保 , mysqldump > dbase.mysql 停止mysql服务 删除/var/lib/mysql 重命名/var/lib/mysql-backup为/var/lib/mysql 开始mysqld 创建数据库 Mysqldump < dbbase .mysql

其他回答

mysqldump到数据库: mysqldump -u user -ppass dbname > D:\ backup -up \dbname.sql 恢复数据库 mysql -u user -ppass dbname < D:\ backup -ups\dbname.sql

现在数据库中的所有表都完全恢复了。试一试. .

SELECT * FROM dbname.tablename;

当我使用的表名的大小写关闭时,我就会遇到这个问题。所以表被称为'db'但我在select语句中使用'db'。确保箱子是一样的。

在复制idb-file之前,尝试使用sql查询来丢弃表空间:

ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

复制idb-file

ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

重新启动MySql

以防还有人关心:

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

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

如果你在一个使用InnoDB表的数据库中这样做,你会得到这个疯狂的“table does not exist”错误。

问题是你需要MySQL datadir根目录下的ib*文件(例如ibdata1, ib_logfile0和ib_logfile1)。

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

幽灵桌也有类似的问题。幸运的是,在失败之前有一个SQL转储。

就我而言,我必须:

停止mySQL 将/var/mysql中的ib*文件移至备份 删除/var/mysql/ {dbname} 重新启动mySQL 重新创建空数据库 恢复转储文件

注意:需要转储文件。