MySQL InnoDB表空间存在(表空间损坏)

MySQL InnoDB表空间存在(表空间损坏),mysql,innodb,Mysql,Innodb,首先:我不是在寻找一种方法来修复发现的可怕的表空间存在InnoDB错误,而是在寻找一种方法来防止它!在过去的几周里,我们从数据库中随机发现了一个表,无法重新创建它(因为它给出了一个表空间存在错误)。我们将其缩小到下表: CREATE TABLE product_localised ( id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, product_id INT (10) UNSIGNED NOT NULL, language_id INT

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

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;
问题是:有人能看看桌子的结构和键,看看有没有什么问题吗

我们将数据库托管在亚马逊的RDS上,并尝试了MySQL 5.5和5.6,启用了innodb_file_per_table

我们还在Ubuntu服务器14.04 LTS(使用Vagrant)上尝试了MySQL 5.5,在Windows上使用xampp尝试了MySQL 5.6

针对以下问题:

考虑删除id并使用(产品id、语言id)作为PK。当然,您不需要20亿种语言,所以将收缩语言-IdID考虑为Simunt无符号:

  • 我们更喜欢单列主键,因为它使ORM的使用更加容易
  • 我们没有一百万种语言,但这只是我们在整个项目中使用的自动增量设置,当然这不会引起任何问题吗
  • 据此,

    这可能有多种原因

    1) 您的查询正在超时

    2) 有人通过运行“设置外键检查=0”删除了外键检查,查看是否存在以下情况:

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

    ALTER TABLE()表空间操作失败(放弃表空间或导入表空间可能会产生不正确的内部表空间状态,导致后续语句失败。(错误#76424,错误#20748660)

    -----2015-03-09 5.7.6里程碑16——漏洞修复——InnoDB-----

    fil_space_t::tablespace_version字段,用于跟踪ALTER TABLE…DISCARD tablespace(),后跟ALTER TABLE IMPORT tablespace()已删除操作。tablespace_version字段确保在导入具有相同空间_id的表空间时,不会对旧缓冲项进行更改缓冲区合并。该字段是冗余的,不再需要。(错误19710564)

    -----2014-03-31 5.7.4里程碑14和2014-01-31 5.6.16——漏洞修复——InnoDB-----

    使用ALTER table…DISCARD tablespace()放弃表空间后操作表可能会导致严重错误

    -----2012年12月11日5.6.9——漏洞修复——InnoDB-----

    在Windows系统上使用DISCARD TABLESPACE或IMPORT TABLESPACE子句执行ALTER TABLE()语句时,由于文件系统中存在临时表空间文件,可能会发生超时错误。(错误#14776799)

    -----2012年12月11日5.6.9--漏洞修复-------

    发出ALTER TABLE…DISCARD TABLESPACE后,在Windows系统上对同一个表的联机DDL操作可能会失败,并出现错误:从存储引擎中获取错误11。带有ALGORITHM=INPLACE子句的ALTER TABLE()语句也可能会创建一个空的.ibd文件(),使该表空间不再“被丢弃”(Bug#14735917)

    (表不存在)
    (MySQL/innodb数据库出现故障)
    (数据库持续崩溃-断言失败?
    (丢弃表空间需要帮助)
    (删除某些表“.ibd文件”后应该做什么?
    (数据库崩溃和进程过载)
    (InnoDB找不到指定的“路径”)
    (删除数据库后,表“已存在”)

    (*.FRM文件和减少IbDATA文件)

    “<代码>表空间子句?您运行的是什么版本的MySQL?考虑删除<代码> ID <代码>,并使用<代码>(产品ID,语言)作为PK。当然你不需要20亿种语言,所以考虑收缩<代码> LoalGracyID 到<代码> SimultUnSube < /Cord>。你使用的是<代码NoNdBuxFielyPiLaTaby< /Cord> >代码>梭子鱼< /代码>?完全正确,伙计,我确信它与表结构有关。只是用版本和Co更新了我的问题。配置请向我们显示错误的全文,以及引发错误的语句。(如果是
    CREATE
    ,请说出来。)该语句是手动输入的,还是作为重新加载或导入的方式输入的我们禁用外键检查的唯一时间是在运行迁移脚本(我们使用Laravel 5的迁移)时,该脚本禁用了外键检查,执行了一些数据库操作,并将其重新打开(我添加了更多)