Mysql 如何修复在AWS RDS上通过创建(errno:-1)锁定表名而导致的InnoDB损坏?

Mysql 如何修复在AWS RDS上通过创建(errno:-1)锁定表名而导致的InnoDB损坏?,mysql,amazon-web-services,innodb,amazon-rds,errno,Mysql,Amazon Web Services,Innodb,Amazon Rds,Errno,提示:不要在MySQL工作台中为“标准TCP/IP over SSH”连接运行ALTER语句。最好是将外壳插入服务器并从那里运行ALTER。这样,如果您与服务器失去连接,ALTER仍应完成其工作 我正在尝试在我昨天尝试创建的数据库中创建一个新表。问题是,我的互联网已经因为微型辍学而失去了连接。我相信其中的一个光点发生在我创建表时,现在当我尝试创建一个完全相同名称的表时: 我得到这个错误: Error Code: 1005. Can't create table 'adstudio.data_fe

提示:不要在MySQL工作台中为“标准TCP/IP over SSH”连接运行
ALTER
语句。最好是将外壳插入服务器并从那里运行
ALTER
。这样,如果您与服务器失去连接,
ALTER
仍应完成其工作

我正在尝试在我昨天尝试创建的数据库中创建一个新表。问题是,我的互联网已经因为微型辍学而失去了连接。我相信其中的一个光点发生在我创建表时,现在当我尝试创建一个完全相同名称的表时:

我得到这个错误:

Error Code: 1005. Can't create table 'adstudio.data_feed_param' (errno: -1)
现在,在前面,我尝试使用许多其他列创建此表,其中一列名为
input\u type
,我有一个与
input\u 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\u data\u feed\u param

第二,我对这张桌子做了些改变,而不是把它扔了。我运行了一个
ALTER
来添加一个列,但收到消息“MySQL服务器已经离开了”。我在MySQL工作台中完成了所有这些

第三,我有一个多对多表,它引用了这个,其中填充了数据。这怎么可能呢?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不允许我重新创建我的表。那太傻了。同时,我要向悬赏部提出这个问题。

医生说:

Error 1005 (ER_CANT_CREATE_TABLE)

If the error message refers to error –1, table creation probably failed because the table includes a column name that matched the name of an internal InnoDB table.

首先尝试在该表上放置一个
,然后尝试重新添加它

如果您的方案正确,请检查mysql/data/{your database name}中的目录,以查找具有表名的文件。删除任何(仅在需要进一步解决问题时移动它们)。
然后,创建一个名为的表和一列,只检查这是否解决了问题。

InnoDB中的DDL不是事务性的,因此.frm文件和InnoDB字典中的信息可能不同。在您的例子中,.frm文件似乎丢失了,但字典中有一条孤立记录(实际上,只有少数几个字典SYS_*表中有记录)

你不能轻易地从字典中删除一条记录。您需要一个相应的.frm文件,以便MySQL将您的删除传递到InnoDB级别。有了RDS,你无法做到这一点

但您可以删除整个数据库。在这种情况下,InnoDB将从字典中删除所有记录,包括孤立记录

因此,为了清理字典,我建议如下:

  • 停止MySQL的所有流量,使其为只读
  • 创建一个临时数据库
    adstudio\u tmp
  • adstudio
    中的所有表重命名为
    adstudio\u tmp
  • 删除数据库adstudio
    。此时它是空的。
    下拉菜单将删除InnoDB字典中的所有条目
  • RENAME
    将所有表格从
    adstudio\u tmp
    重新命名为
    adstudio
  • 在此之后,字典应该是干净的,您将能够创建您的
    数据\u feed\u param


    之后我描述了一个类似的问题。查看它以了解更多详细信息。

    从5.5升级到5.6后,我现在在尝试创建完全相同的表时收到一个新错误:

    Error Code: 1813. Tablespace for table '`adstudio`.`account_data_feed_param`' exists. Please DISCARD the tablespace before IMPORT.
    
    我假设声明:

    DROP TABLESPACE `data_feed_param`;
    

    现在可以解决我的问题,而无需
    重命名
    我的表,但遗憾的是,我们无法为数据库用户获得
    创建表空间
    权限。

    您是否尝试先删除表?是的。我尝试了
    删除表格
    删除表格(如果存在)
    ,两者都说“未知表格”。请告诉我们您执行的实际命令。我爱胆小鬼,他们对问题进行了近距离投票,但没有给出问题的实际错误,特别是当问题是错误编号时。此外,我还添加了我正在使用的SQL。如果我将表缩减为一个自动递增的
    id
    列,我仍然无法创建表。我可以在任何地方看到InnoDB内部表的列表吗?信息模式,我假设?
    从信息模式中选择表名称。TABLES WHERE engine='InnoDB'
    如果我将表引擎从InnoDB更改为MyISAM,它将创建良好的(显然没有任何外键)。这似乎是InnoDB的腐败。现在我将检查该查询。如果其中一个列名以前与InnoDB表的名称匹配,但我删除了这两个表,然后更改了列名(请参阅我的问题的最新编辑),该怎么办?它应该可以工作,但不能。是的,如果您删除数据库,mysqldump也会清理字典<代码>重命名
    的速度更快。感谢这里提供的更多分步说明和出色的博客链接。我已经从数据中考虑了你的解决方案
    DROP TABLESPACE `data_feed_param`;