【问题标题】:MySQL InnoDB tablespace exists (corrupt tablespace)MySQL InnoDB 表空间存在(损坏的表空间)
【发布时间】:2016-07-05 06:57:05
【问题描述】:

首先:我不是在寻找一种方法来修复可怕的tablespace exists InnoDB 错误发现here,而是我在寻找一种方法来防止它!在过去的几周里,我们的数据库中随机出现了一个表消失,无法重新创建它(因为它给出了一个表空间存在错误)。我们已将其范围缩小到下表:

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;

问题:有人可以查看表的结构和键并判断它是否有任何问题?!

我们将我们的数据库托管在 Amazon 的 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:

  1. 我们更喜欢单列主键,因为这样可以更轻松地使用我们的 ORM
  2. 我们没有一百万种语言,但这只是我们在整个项目中使用的自动增量设置,这肯定不会造成任何问题吗?

【问题讨论】:

  • TABLESPACE 子句在哪里?你运行的是什么版本的 MySQL?
  • 考虑删除id 并使用(product_id, language_id) 作为PK。当然,您不需要 20 亿种语言,因此请考虑将 language_id 缩小为 SMALLINT UNSIGNED
  • 你在使用innodb_file_per_table吗? Barracuda?
  • 绝对正确,我确信它与表结构有关。刚刚用版本和配置更新了我的问题
  • 请向我们展示错误的全文以及引发错误的语句。 (如果是CREATE,那么就这么说吧。)该语句是手动输入的,还是作为重新加载输入的,还是作为IMPORT 输入的?

标签: mysql innodb


【解决方案1】:

据此

Error: Tablespace for table xxx exists. Please DISCARD the tablespace before IMPORT

这可能有多种原因。

1) 您的查询超时
2) 有人通过运行 set foreign_key_checks=0

删除了外键检查

【讨论】:

  • 1) 极不可能看到,因为我们的查询都不会超过一秒 2) 我们禁用外键检查的唯一一次是在我们运行迁移脚本时(我们使用 Laravel 5 的迁移),它禁用了外键检查,执行一些数据库操作,然后重新打开。
【解决方案2】:

看看这些是否适用:

-- 2015-08-03 5.7.8 -- 错误修复 -- -----

失败的 ALTER TABLE (http://dev.mysql.com/doc/refman/5.7/en/alter-table.html) 表空间操作(DISCARD TABLESPACE 或 IMPORT TABLESPACE 可能会产生不正确的内部表空间状态,导致后续语句失败。(错误 #76424,错误 #20748660)

-- 2015-03-09 5.7.6 里程碑 16 -- 已修复错误 -- InnoDB -----

fil_space_t::tablespace_version 字段,用于跟踪 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) 操作,已被删除。 tablespace_version 字段确保在导入具有相同 space_id 的表空间时,不会发生旧缓冲条目的更改缓冲区合并。该字段是多余的,不再需要。 (错误号 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 系统可能会发生超时错误。 (错误号 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(需要帮助丢弃表空间)
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文件)

【讨论】:

  • (我又加了一些。)
猜你喜欢
  • 2014-04-06
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多