无法在 pt-online-schema-change 中更改列和更改索引

Unable to change column and alter index in pt-online-schema-change

我正在尝试更改列并同时更改 table 上的几个索引。为此,我使用 pt-online-schema-change 以便在线进行,但出现错误:

Error altering new table `db`.`_test_table_new`: DBD::mysql::db do failed: Key column 'foo' doesn't exist in table [for Statement "ALTER TABLE `db`.`_test_table_new` ADD INDEX test_table_composite_idx (foo, bar), DROP INDEX test_table_foo_idx, DROP_INDEX test_table_bar_idx, CHANGE COLUMN foo foo2 VARCHAR(127) NOT NULL;"] at /usr/bin/pt-online-schema-change line 9040.

table创建如下:

CREATE TABLE `test_table` (
    `id` bigint(20) unsigned NOT NULL,
    `foo` varchar(127) DEFAULT NULL,
    `bar` varchar(32) CHARACTER SET ascii DEFAULT NULL,
    KEY `test_table_id_idx` (`id`),
    KEY `test_table_foo_idx` (`foo`, `id`),
    KEY `test_table_bar_idx` (`bar`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

本质上,我正在尝试以下操作:

ADD INDEX test_table_composite_idx (foo, bar)
DROP INDEX test_table_foo_idx,
DROP INDEX test_table_bar_idx,
CHANGE COLUMN foo foo2 TEXT;

我可以分别进行索引更改和列更改(但是我需要将所有数据复制两次,我宁愿只做一次),但是如果我将两者加在一起,它会给出一个错误。感觉好像我错过了一些明显的东西;有什么想法吗?

尝试:::

ALTER TABLE test_table
  DROP INDEX test_table_foo_idx
  DROP INDEX test_table_bar_idx
  CHANGE COLUMN foo foo2 VARCHAR(127)
  MODIFY COLUMN foo2 TEXT
  ADD INDEX test_table_composite_idx (foo2, bar)

我看到您正在尝试在名称设置为在同一查询中修改的列上应用新索引。所以替换这个:

ADD INDEX test_table_composite_idx (foo, bar)

有了这个:

ADD INDEX test_table_composite_idx (foo2, bar)

现在,关于尝试单独的步骤:首先更改列名,然后应用 ADD INDEX test_table_composite_idx (foo, bar)。你收到什么?一个错误。

现在,反转步骤。发生了什么?正如您所说,它有效。

祝你好运。