我对MySQL很新,我收到一个非常有趣的错误,我无法通过谷歌和stackoverflow搜索找到任何帮助。
我在MacOS 10.8.3上运行MySQL 5.6.10的本地服务器,并通过Navicat Essentials for MySQL管理我的数据库。
我得到的错误是,在运行和管理我的数据库之后,几天/几周就会触发一些触发器(它看起来不完整)删除我在Navicat中使用查询创建的一些表。
当我尝试使用这些表运行查询时,Navicat会警告我特定的表不存在。到目前为止一切都很好 - 这里有很好的部分:
当我尝试创建表时,例如命名" temp",之前在那里,我收到以下错误消息:
Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.
但是,如果我尝试删除该表,或者尝试丢弃该表的表空间,请使用
DROP TABLE temp;
ALTER TABLE temp DISCARD TABLESPACE;
我收到以下错误消息:
Error : Unknown table 'database.temp'
Error : Table 'database.temp' doesn't exist
这意味着我建议丢弃表空间但是当我尝试这样做时表不存在。是否可能在DISCARD查询未检查的其他位置存在某种类型的此表的剩余部分?有没有人知道什么可以触发所有这些 - 完全随机的似乎?
正如我所说,我是这个主题的新手,几乎一无所知。我怀疑重新启动我的笔记本电脑,即重置我的本地MySQL服务器,或者用户权限可能与它有关,但我只是假设在这里。
答案 0 :(得分:99)
这里有点晚了但通常我看到当你在'innodb_file_per_table'模式下运行时出现'tablespace full'错误时会出现这个问题。没有太多细节(更多here),数据库服务器的表空间由innodb_data_file_path设置定义,默认情况下相当小。即使做得更大,“表空间已满”仍然会出现更大的查询等(很多非表'东西'存储在那里,撤消日志,缓存等......)。
无论如何,我发现如果你查看存储每个表文件的操作系统目录,默认情况下是OSX上的/ var / lib / mysql,/ usr / local / var / mysql和homebrew iirc,你'找到一个孤立的tablename.ibd文件,没有它的普通伴侣tablename.frm文件。如果您将.ibd文件移动到一个安全的临时位置(只是为了安全),应该解决问题。
$ ls /var/lib/mysql
table1.frm
table1.idb
table2.frm
table2.ibd
table3.idb <- problem table, no table3.frm
table4.frm
table4.idb
$ mkdir /tmp/mysql_orphans
$ mv /var/lib/mysql/table3.ibd /tmp/mysql_orphans/
但有一点需要注意,确保最初导致问题的原因,例如:长时间运行的查询,锁定表等...已被清除。否则,当你第二次尝试时,你最终会得到另一个孤立的.ibd文件。
答案 1 :(得分:61)
Xampp和Mamp用户
通过MySQL导入数据库(清空后)时出现相同的错误。我发现我留下了tablename.ibd
个文件而其他所有文件都被删除了。
我从mysql/data/database_name
手动删除了它,错误消失了。
答案 2 :(得分:20)
对于WAMP [Windows 7旗舰x64位]用户:
我同意DangerDave的说法,因此我为 WAMP用户提供答案。
注意:首先,您必须转到 .. \ WAMP \ Bin \ MySQL \ MySQL [您的MySQL版本] \ Data 文件夹。
现在,您将看到所有数据库的文件夹
[Your offending MySQL table name].frm
,而应该有文件[Your offending MySQL table name].ibd
[Your offending MySQL table name].ibd
答案 3 :(得分:17)
如果您在删除.idb
后再次重新创建.idb
,请阅读此答案。
这是如何与我合作的。我有.frm
文件而没有相应的.idb
,每当我删除.frm
文件时,数据库会再次重新创建它。我在mysql documentation中找到了一行解决方案(表空间不存在部分)
1-在其他数据库目录中创建匹配的.frm文件,并将其复制到孤立表所在的数据库目录中。
2-发出原始表的DROP TABLE。这应该成功删除表,InnoDB应该在错误日志中打印出.ibd文件丢失的警告。
我复制了另一个表Mpociot\Firebase\SyncsWithFirebase
文件并将其命名为我丢失的表,然后进行正常的drop table查询。和voalla一起工作,桌子正常掉落!
我的系统是Windows MariaDB v 10.1.8上的xampp
答案 4 :(得分:5)
就我而言,唯一的解决方案是:
bad_table
ENGINE = MyISAM ... bad_table
答案 5 :(得分:4)
我在尝试创建用户表时在wampserver上运行它时遇到了同样的错误。我找到了一个users.ibd文件,在我删除了这个文件之后,我再次运行了migrate命令并且它运行了。我的Windows机器上的文件位于wamp / bin / mysql / mysql5.6.12 / data / myproject。
答案 6 :(得分:4)
的解决方案强> 的
但是,更简单的选择是:重启mysql,然后执行帖子开头附近列出的相同的四个步骤。这样,数据字典上的表空间id和文件匹配;因此导入表空间成功。
这可以让你更有信心在恢复过程中处理一些InnoDB“陷阱”甚至是文件传输。
答案 7 :(得分:3)
就我而言:
首先从Mysql中删除数据库目录中的tableName.ibd
,然后再次运行:
ALTER TABLE tableName DISCARD TABLESPACE;
DROP TABLE tableName;
答案 8 :(得分:2)
这正是我在fedora上的mariadb 10.2.16中所做的事情,当时我有一个表在日志文件中显示与我猜想的完全相同的错误...
2018-07-11 9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11 9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918
您的行驶里程和错误可能会有所不同,但我认为的主要目标是
...already exists though the corresponding table did not exist in the InnoDB data dictionary...
删除表无法正常工作,而更改表...
MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'
MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist
创建表也失败,如下:
MariaDB [database_name]> create table innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT
为了解决这个问题,我首先要做的是
create table innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)
然后在/ var / lib / mysql / database_name目录中,我以root用户身份执行以下操作,以确认覆盖innodb_table.ibd导致了我们的问题
cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
systemctl restart mariadb
然后回到mysql控制台,我在两个表上都成功发出了drop命令
MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: database_name
Query OK, 0 rows affected (0.08 sec)
MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)
现在一切都变成正方形了,我可以重新创建一张桌子...
MariaDB [database_name]> create table innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)
答案 9 :(得分:2)
删除/移动tablename.ibd肯定对我不起作用。
我是如何解决的
由于我要删除损坏的和不存在的表,我通过转到phpmyadmin-&gt; database-&gt; export-&gt;选择的表到backup-&gt; export(作为。)来备份其他表。 SQL)。
之后,我选择了数据库名称旁边的数据库图标,然后将其删除。创建了一个新的数据库。选择新数据库 - &gt; import-&gt;选择您之前下载的文件 - &gt;单击导入。现在我有我的旧工作表并删除了损坏的表。现在我只是创建了抛出错误的表。
可能我早先备份了损坏的表格。
答案 10 :(得分:2)
以下是解决方案步骤:
答案 11 :(得分:2)
暂停某些功能时会发生此错误。就像使用错误的外键运行下面的查询一样。
set foreign_key_checks=0
答案 12 :(得分:1)
有完全相同的问题;我会冲泡添加mysql@5.6
(之前为5.5)。
5.6的Brew默认值是innodb_file_per_table=1
,而5.5中的默认值是innodb_file_per_table=0
。
您现有的ibdata1
文件(合并的innodb数据)仍将引用您要创建/删除的表。将innodb_file_per_table
改回0,或删除ibdata1数据文件(这将丢失所有数据,因此请确保先对它进行mysqldump或已经有.sql转储)。 / p>
另一个困扰我的mysql@5.6
默认是缺少端口,因此网络默认是unix套接字,并且mysql客户端会不断报告:
ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32
我在<string>--port=3306</string>
数组中添加了.plist
,但是您也可以在port=3306
中指定my.cnf
运行brew services stop mysql@5.6
进行更改,然后brew services start mysql@5.6
答案 13 :(得分:1)
对我来说,它只是帮助转到了 / var / lib / mysql / {db_name} (Linux)下的MYSQL DATA目录,并删除了 {table_name} .ibd 文件,与文件夹名称相同。
答案 14 :(得分:1)
有好几次这个问题。如果您有一个大型数据库并且想要尝试避免备份/恢复(添加丢失的表),请来回尝试几次:
DROP TABLE my_table;
ALTER TABLE my_table DISCARD TABLESPACE;
- 和 -
rm my_table.ibd(orphan w / o对应my_table.frm)位于/ var / lib / mysql / my_db /目录
- 然后 -
CREATE TABLE IF NOT NOT EXISTS my_table
(...)
答案 15 :(得分:1)
如果您有另一台具有相同表格的良好版本的服务器,您可以复制(table_copy),将table_copy传输到问题服务器。然后删除问题表并将table_copy重命名为table。
答案 16 :(得分:1)
尝试删除表空间可能会给您带来其他错误。对我来说,我收到以下错误:
DROP TABLESPACE `tablename`
Error Code: 1478. Table storage engine 'InnoDB' does not support the create option 'TABLESPACE or LOGFILE GROUP'
我的解决方案是删除数据库。这将删除与其相关的所有表空间,并允许您再次创建表。
答案 17 :(得分:0)
您可以以mysql根用户身份运行以下查询
drop tablespace `tableName`
答案 18 :(得分:0)
它对我有用的唯一方法是:
答案 19 :(得分:0)
谢谢#DangerDave解决了我在Magento 2上的问题,这就是我的做法
我在使用vps
$ex = json_decode($data, true);
检查没有.frm文件(仅.idb)的表并将其删除,
root@myvps [~]# cd /var/lib/mysql/mydatabasename/
root@myvps [~]# ls
运行index:reindex命令后,系统将重新生成表
答案 20 :(得分:0)
我找到的方式&#34;解决&#34;这个问题相当烦人,但有一个脚本可以处理它。
基本上,您需要ibdata1
和ib_logfile*
文件消失(它们包含外键的映射,以及其他内容)。唯一的安全方法是导出所有数据库,停止mysql,删除文件,启动mysql,然后导入文件。
帮助解决此问题的脚本是https://github.com/uberhacker/shrink-ibdata1,即使此脚本的声明目的不同, 也可以解决问题。
答案 21 :(得分:0)
我只是直接从wamp删除我的本地主机中的旧数据库,停止所有服务,转到wamp / bin / mysql / mysql [版本] /数据,我发现数据库有问题,我删除它并重新开始wamp所有服务,再次创建您的数据库并完成,现在您可以导入您的表,
答案 22 :(得分:-1)
如果是 Homebrew,数据文件的目录是 /usr/local/var/mysql
要查看这里使用的是哪个 my.cnf 文件是我的环境中的搜索位置 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
为了清除这个错误,我做了以下事情
mysqladmin -u root shutdown
rm /usr/local/var/mysql/<dbname>/problemtablename.ibd
注意:在我的情况下,我不关心数据,因为它是开发设置,可能是因为我用时间机器恢复了我的笔记本电脑
答案 23 :(得分:-1)
我必须找到我的MySQL数据目录:
在变量名称为“%dir”的情况下显示变量
然后强行删除该数据库:
sudo rm -rf
答案 24 :(得分:-1)
请在IMPORT
之前删除表空间我遇到了同样的问题解决方案
首先,您必须删除数据库名称。如果你的数据库没有删除你就流了我。 对于Windows系统,您的目录将是 C:/ xampp / mysql / data / yourdabasefolder删除&#34; yourdabasefolder&#34;
您必须再次创建新数据库并导入旧的sql文件。这将是工作
由于
答案 25 :(得分:-1)
如果您遇到此问题且没有其他选项,请将引擎更改为“myisam”等任何其他引擎,然后尝试创建表格。
<强>声明:强> 它不是有效的答案,因为您可能具有其他存储引擎不支持的外键约束。每个存储引擎都有自己的专长来存储和访问数据,这些点也需要考虑在内。