2017-06-08 30 views
1

我試圖改變列並同時更改表上的一些索引。要做到這一點,我使用的是pt-online-schema-change,以便它可以在網上發生,但我得到了一個錯誤:無法更改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.

該表是作爲創建如下:

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; 

我能夠單獨做指數變化和列變化(但我需要我的所有數據複製兩次,寧願做它只有一次),但如果我添加二人共同呃,它給出了一個錯誤。這感覺就像我失去了一些明顯的東西;有任何想法嗎?

+0

也許我錯過了一些東西 - 但爲什麼你不以常規方式重命名列(沒有pt-online-schema-change)? –

+0

@PaulSpiegel我實際上也試圖對列做一個修改:我想要一個不同的類型。但我能夠將問題簡化爲重命名。我想,需要更小的數據集來重現。 percona工具包的原因是我希望所有事情都可以在線發生,並且能夠限制速度。 – Aeveus

+0

仍然不知道這是否有幫助..但看看[表格](https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html)。由於MySQL 5.6不需要「表重建」來重命名列。 –

回答

1

我看你是想在列誰的名字被設置在同一個查詢修改應用的新指標。所以替換此:

ADD INDEX test_table_composite_idx (foo, bar) 

與此:

ADD INDEX test_table_composite_idx (foo2, bar) 

現在,關於你嘗試獨立的步驟:首先更改列名,之後應用ADD INDEX test_table_composite_idx (foo, bar)。你收到什麼?一個錯誤。

現在,逆轉步驟。發生了什麼?正如你已經說過的那樣,它很有效。

祝你好運。

+0

有趣的是,我沒有期待它看到最終結果,但這確實有道理。謝謝! – Aeveus

+0

@Aeveus不客氣。我很高興它現在可以工作。 –

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)