首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能仅在MySQL Aurora上删除索引

不能仅在MySQL Aurora上删除索引
EN

Stack Overflow用户
提问于 2021-02-24 03:57:52
回答 2查看 620关注 0票数 2

背景

我们运行MySQL Aurora (5.7.mysql_aurora.2.07.2),托管供应商产品。供应商为其版本升级提供迁移SQL脚本。

我们有一个问题,即迁移不能在MySQL Aurora上成功运行,而是在其他MySQL 5.7数据库上运行,我们非常想知道为什么只在Aurora上发生这种情况。

详细信息

代码语言:javascript
复制
-- 1
DROP DATABASE IF EXISTS drop_index_test;

-- 2
CREATE DATABASE IF NOT EXISTS drop_index_test DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;

-- 3
use drop_index_test;

-- 4
CREATE TABLE msg
(
    id                      BIGINT AUTO_INCREMENT NOT NULL,
    uuid                    VARCHAR(36)           NOT NULL,
    user_id                 VARCHAR(36),
    title                   LONGTEXT,

    CONSTRAINT pk_msg PRIMARY KEY (id),
    CONSTRAINT uq_msg_uuid UNIQUE (uuid)
);

-- 5
CREATE TABLE ack
(
    id                   BIGINT AUTO_INCREMENT NOT NULL,
    msg_id      BIGINT                NOT NULL,
    user_id              VARCHAR(36)           NOT NULL,

    CONSTRAINT pk_ack PRIMARY KEY (id),
    CONSTRAINT fk_ack2msg_01 FOREIGN KEY (msg_id) REFERENCES msg (id)
);

-- 6
CREATE UNIQUE INDEX ix_ack_mid_uid
    ON ack (msg_id, user_id);

-- 7
ALTER TABLE msg
  ADD user_id_upper VARCHAR(36) AS (UPPER(user_id));

-- 8
CREATE INDEX ix_msg_upper_user_id ON msg(user_id_upper);

-- 9
ALTER TABLE ack
  ADD user_id_upper VARCHAR(36) AS (UPPER(user_id));

-- 10
CREATE UNIQUE INDEX ix_ack_mid_upper_uid
    ON ack (msg_id, user_id_upper);

-- 11
DROP INDEX ix_ack_mid_uid ON ack;

上面是一个精简的语句版本,这些语句仍然只在Aurora上复制这个问题,并且仍然在'vanilla‘MySQL 5.7中工作(经过测试的brew install、RDS实例和来自Docker的mysql/mysql-server:5.7 )。语句1-6是初始安装语句,7-11是导致以下错误的迁移语句。

误差

代码语言:javascript
复制
ERROR 1553 (HY000): Cannot drop index 'ix_ack_mid_uid': needed in a foreign key constraint

迄今为止的探索发现

  1. 如果我们在普通的MySQL 5.7上运行语句1-11,我们永远不会看到任何错误。
  2. 如果我们在MySQL Aurora (5.7.mysql_aurora.2.07.2)上运行语句1-11,我们总是会看到这个错误。
  3. 如果我们运行语句1-6,然后在普通的MySQL 5.7上运行语句11,我们会看到与上面第2条相同的错误。
  4. 报表7-10是决定此错误是否错误的关键区别。如果没有7-10的普通MySQL 5.7抛出与Aurora相同的Cannot drop index错误。Aurora在第7-10行中抛出此错误。

问题陈述

造成这一问题的根本原因是什么?这是Aurora中的一个bug,还是已知版本的差异,还是我们端潜在的Aurora错误配置?

报表7-10如何影响指数ix_ack_nid_uid是否会在MySQL 5.7中下降,而它们似乎没有触及该指数呢?为什么同样不影响极光呢?

EN

回答 2

Stack Overflow用户

发布于 2021-03-10 05:11:13

我也遇到了同样的问题。无论如何,我首先删除外键,然后删除索引,从而解决了这个问题。

为了解决这个问题,我的一位朋友( said )说,这看起来像是Bug #17449901 in MySQL Aurora中提到的一个现有问题。

使用foreign_key_checks=0,InnoDB允许删除外键约束所需的索引,将表放入不一致的表中,并导致表加载时发生的外键检查失败。InnoDB现在可以防止删除外键约束所需的索引,即使使用foreign_key_checks=0也是如此。在删除外键索引之前,必须删除外键约束。

这可能是问题的原因,因为InnoDB现在阻止删除外键约束所需的索引。

票数 1
EN

Stack Overflow用户

发布于 2021-03-17 01:16:56

尝试禁用sql文件开头的键检查。

代码语言:javascript
复制
SET FOREIGN_KEY_CHECKS=0;

并在最后启用:

代码语言:javascript
复制
SET FOREIGN_KEY_CHECKS=1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66344502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档