首先:我不是在寻找一种方法来修复tablespace exists
发现的CREATE TABLE product_localised (
id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT,
product_id INT (10) UNSIGNED NOT NULL,
language_id INT (10) UNSIGNED NOT NULL,
slug VARCHAR (255) COLLATE utf8_unicode_ci NOT NULL,
title TEXT COLLATE utf8_unicode_ci,
description TEXT COLLATE utf8_unicode_ci,
description_short TEXT COLLATE utf8_unicode_ci,
custom_startselect_content TEXT COLLATE utf8_unicode_ci,
created_at TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
updated_at TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
deleted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY product_localised_product_id_language_id_unique (`product_id`, `language_id`),
KEY product_localised_language_id_foreign (`language_id`),
CONSTRAINT product_localised_language_id_foreign FOREIGN KEY (`language_id`) REFERENCES languages (`id`),
CONSTRAINT product_localised_product_id_foreign FOREIGN KEY (`product_id`) REFERENCES products (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 46727 DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
错误,而我正在寻找一种方法来阻止它!在过去的几周里,我们随机地从数据库中删除了一个表,无法重新创建它(因为它给出了表空间存在错误)。我们把它缩小到下表:
{{1}}
问题:有人可以查看表格的结构和键,并判断它是否有任何问题?!
我们正在亚马逊的RDS上托管我们的数据库并试用了启用innodb_file_per_table的MySQL 5.5和5.6。
我们还在Ubuntu Server 14.04 LTS(使用Vagrant)上尝试了MySQL 5.5,在Windows上使用xampp尝试了MySQL 5.6。
回答下面提出的问题:
考虑删除id并使用(product_id,language_id)作为PK。当然你不需要20亿种语言,所以考虑将language_id缩小为SMALLINT UNSIGNED:
答案 0 :(得分:0)
根据这个
Error: Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT
这可能有多种原因。
1)您的查询是超时的 2)有人通过运行 set foreign_key_checks = 0
删除了外键检查答案 1 :(得分:0)
看看是否有任何适用:
----- 2015-08-03 5.7.8 - 错误修复 - -----
失败的ALTER TABLE(http://dev.mysql.com/doc/refman/5.7/en/alter-table.html)表空间操作(DISCARD TABLESPACE或IMPORT TABLESPACE可能会产生不正确的内部表空间状态,导致后续语句失败。(Bug#76424,Bug#20748660)
----- 2015-03-09 5.7.6里程碑16 - 修复错误 - InnoDB -----
为了跟踪ALTER TABLE ... DISCARD TABLESPACE(http://dev.mysql.com/doc/refman/5.7/en/alter-table.html)以及ALTER TABLE IMPORT TABLESPACE(http://dev.mysql.com/doc/refman/5.7/en/alter-table.html)操作而引入的fil_space_t :: tablespace_version字段已被删除。 tablespace_version字段确保在导入具有相同space_id的表空间时,旧缓冲条目不会发生更改缓冲区合并。该领域是多余的,不再需要。 (Bug#19710564)
----- 2014-03-31 5.7.4里程碑14& 2014-01-31 5.6.16 - 修复了错误 - InnoDB -----
使用ALTER TABLE ... DISCARD TABLESPACE(http://dev.mysql.com/doc/refman/5.7/en/alter-table.html)丢弃其表空间后操作表可能会导致严重错误。 (缺陷#17700280)
----- 2012-12-11 5.6.9 - 修复了错误 - InnoDB -----
由于文件系统中保留了临时表空间文件,因此在使用DISCARD TABLESPACE或IMPORT TABLESPACE子句执行ALTER TABLE(http://dev.mysql.com/doc/refman/5.6/en/alter-table.html)语句时,Windows系统上可能会发生超时错误。 (Bug#14776799)
----- 2012-12-11 5.6.9 - 错误修复 - -----
发出ALTER TABLE ... DISCARD TABLESPACE后,同一个表的联机DDL操作可能会在Windows系统上失败并出现错误:从存储引擎获得错误11。带有ALGORITHM = INPLACE子句的ALTER TABLE(http://dev.mysql.com/doc/refman/5.6/en/alter-table.html)语句也可以创建一个空的.ibd文件(http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_ibd_file),使表空间不再“被丢弃”。 (缺陷#14735917)
http://forums.mysql.com/read.php?22,633145(表格不存在)
http://forums.mysql.com/read.php?20,615512(MySQL / innodb数据库故障)
http://forums.mysql.com/read.php?22,603093(数据库不断崩溃 - 断言失败?)
http://forums.mysql.com/read.php?22,601100(DISCARD TABLESPACE需要帮助)
http://forums.mysql.com/read.php?10,591035(删除某些表'.ibd文件后应该怎么办?)
http://forums.mysql.com/read.php?22,444342(数据库崩溃和处理器重载)
http://forums.mysql.com/read.php?22,355932(InnoDB无法找到“指定的路径”)
http://forums.mysql.com/read.php?22,290138(删除数据库后,表格“已经存在”)
http://forums.mysql.com/read.php?22,270607(* .frm文件和减少ibdata文件)