mysql – 如何在AWS RDS上修复从创建(errno:-1)锁定表名的InnoDB损坏?

提示:不要在MySQL Workbench中运行ALTER语句以获得“基于SSH的标准TCP / IP”连接.最好是进入服务器并从那里运行ALTER.这样,如果您失去与服务器的连接,ALTER仍应完成其工作.

我正在尝试在我昨天尝试创建的数据库中创建一个新表.问题是,我的互联网一直在失去微辍学的联系.我相信当我创建表时发生了其中一个blips,现在当我尝试创建一个具有完全相同名称的表时:

CREATE TABLE IF NOT EXISTS `adstudio`.`data_feed_param` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

我收到此错误:

Error Code: 1005. Can't create table 'adstudio.data_feed_param' (errno: -1)

以前,我尝试使用许多其他列创建此表,其中一列名为input_type,并且我有一个与input_type具有外键关系的列:

CREATE TABLE IF NOT EXISTS `adstudio`.`data_feed_param` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  ...
  `input_type` TINYINT UNSIGNED NOT NULL DEFAULT '1',
  ...
  PRIMARY KEY (`id`),
  INDEX `fk_input_type_idx` (`input_type` ASC),
  CONSTRAINT `fk_input_type`
    FOREIGN KEY (`input_type`)
    REFERENCES `adstudio`.`input_type` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;

我注意到当Propel无法再生时,这个专栏很糟糕.我删除了表,更改了列名,现在我无法添加与InnoDB引擎完全相同名称的表.

但是,我能够在MyISAM中创建一个具有完全相同名称的表,插入并放弃它而不会出现问题.

如何修复数据库以便创建表格?

更新2015/06/01:除非在不同的情况下,我再次丢失了同一张桌子.首先,我在表名中添加了一个前缀,以避免上述问题,adstudio.account_data_feed_pa​​ram.

其次,我正在对此表进行更改而不是删除它.我运行了一个ALTER添加一个列,但收到消息“MySQL服务器已经消失”.我在MySQL Workbench中完成了所有这些工作.

第三,我有一个多对多表,引用了这个表,其中填充了数据.这怎么可能呢? MySQL如何随意丢弃我的表?

如果我尝试访问外键定义,我收到以下消息:

Error getting DDL for object.
Table 'adstudio.account_data_feed_param' doesn't exist

这是表的创建SQL:

-- -----------------------------------------------------
-- Table `adstudio`.`account_data_feed_param`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `adstudio`.`account_data_feed_param` (
  `id` BIGINT(20) UNSIGNED NOT NULL,
  `account_id` BIGINT(20) UNSIGNED NOT NULL,
  `name` VARCHAR(64) NOT NULL,
  `default_value` VARCHAR(64) NOT NULL,
  `input_type_id` SMALLINT(5) UNSIGNED NOT NULL,
  `lookups_json` MEDIUMTEXT NOT NULL,
  `enabled` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
  `creation_user_id` BIGINT(20) UNSIGNED NOT NULL,
  `creation_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `last_modified_user_id` BIGINT(20) UNSIGNED NOT NULL,
  `last_modified_date` TIMESTAMP NOT NULL DEFAULT '1970-01-01 00:00:01',
  `deletion_user_id` BIGINT(20) UNSIGNED NULL DEFAULT NULL,
  `deletion_date` TIMESTAMP NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `dfp_account_idx` (`account_id` ASC),
  INDEX `dfp_input_type_idx` (`input_type_id` ASC),
  INDEX `dfp_creation_user_idx` (`creation_user_id` ASC),
  INDEX `dfp_last_modified_user_idx` (`last_modified_user_id` ASC),
  INDEX `dfp_deletion_date_idx` (`deletion_user_id` ASC),
  CONSTRAINT `dfp_account`
    FOREIGN KEY (`account_id`)
    REFERENCES `adstudio`.`account` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `dfp_input_type`
    FOREIGN KEY (`input_type_id`)
    REFERENCES `adstudio`.`input_type` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `dfp_creation_user`
    FOREIGN KEY (`creation_user_id`)
    REFERENCES `adstudio`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `dfp_last_modified_user`
    FOREIGN KEY (`last_modified_user_id`)
    REFERENCES `adstudio`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `dfp_deletion_date`
    FOREIGN KEY (`deletion_user_id`)
    REFERENCES `adstudio`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARACTER SET = utf8;

这是我尝试运行的ALTER语句:

ALTER TABLE `adstudio`.`account_data_feed_param` 
    ADD COLUMN `input_type` VARCHAR(32) NOT NULL DEFAULT 'text' AFTER `input_type_id`;

并尝试在纯MySQL命令行界面中创建相同的表,我现在收到:

ERROR 1005 (HY000): Can't create table 'adstudio.account_data_feed_param' (errno: -1)

我假设InnoDB

我的数据库正在运行Amazon RDS,因此我只能访问他们提供的访问权限.这是我正在运行的服务器版本:

mysql> SELECT VERSION();
+------------+
| VERSION()  |
+------------+
| 5.5.40-log |
+------------+
1 row in set (0.02 sec)

我真的,真的不想重构我的所有代码,因为MySQL不允许我重新创建我的表.那只是愚蠢的.与此同时,我正在提出这个问题以获得赏金.

最佳答案
InnoDB中的DDL不是事务性的,因此.frm文件和InnoDB字典中的信息可能不同.在你的情况下,它看起来像.frm文件丢失,但字典中有一个孤立的记录(实际上,几个字典SYS_ *表中的记录).

您无法轻松地从字典中删除记录.您需要一个相应的.frm文件,以便MySQL将您的DROP传递给InnoDB级别.使用RDS,你无法做到.

但是你可以DROP整个数据库.在这种情况下,InnoDB将删除字典中的所有记录,包括孤立的记录.

所以,为了清理你的字典,我建议遵循:

>停止MySQL的所有流量,使其成为只读
>创建临时数据库adstudio_tmp
>从adstudio到adstudio_tmp重命名所有表格
> DROP DATABASE adstudio.此时它是空的. DROP将清除InnoDB字典中的所有条目.
>将所有表格从adstudio_tmp重新命名为adstudio

在此之后,字典应该是干净的,您将能够创建data_feed_pa​​ram.

我在unsuccessful ALTER TABLE之后描述了类似的问题.查看更多详细信息.

转载注明原文:mysql – 如何在AWS RDS上修复从创建(errno:-1)锁定表名的InnoDB损坏? - 代码日志