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

时间:2017-06-08 14:38:06

标签: mysql database-schema alter percona

我试图改变列并同时更改表上的一些索引。要做到这一点,我使用pt-online-schema-change以便它可以在线发生,但我收到了错误:

  

更改新表`db` ._test_table_new`时出错:DBD :: mysql :: db do failed:键列' foo'表格中没有[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 ;"] / usr / bin / pt-online-schema-change line 9040。

该表创建如下:

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;

我能够单独进行索引更改和列更改(但是我需要将所有数据复制两次,更喜欢只复制一次),但是如果我将两者一起添加,它会给出一个错误。感觉我错过了一些明显的东西;任何想法?

2 个答案:

答案 0 :(得分:1)

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

IRegionManager

用这个:

ADD INDEX test_table_composite_idx (foo, bar)

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

现在,颠倒这些步骤。发生了什么?正如你已经说过的那样,它有效。

祝你好运。

答案 1 :(得分:0)

试:::

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)