2017-06-08 3 views
1

J'essaie de modifier une colonne et de modifier quelques index sur une table en même temps. Pour ce faire, j'utilise pt-online-schema-change afin qu'il puisse se produire en ligne, mais je reçois une erreur:Impossible de changer de colonne et de modifier l'index dans 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.

La table a été créée comme suit:

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 

Essentiellement, je m essayer ce qui suit:

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; 

Je suis capable de faire la modification de l'index et la modification colonne séparément (mais je aurais besoin de copier toutes mes données deux fois, préféreraient le faire qu'une seule fois), mais si j'ajoute les deux euh, ça donne une erreur. J'ai l'impression de manquer quelque chose d'évident; des idées?

+0

Peut-être qu'il me manque quelque chose - Mais pourquoi ne renommez-vous pas la colonne de façon régulière (sans pt-online-schema-change)? –

+0

@PaulSpiegel J'essaie aussi de faire un changement sur la colonne: je veux un type différent. Mais j'ai été en mesure de réduire le problème à simplement renommer. Je suppose que le plus petit ensemble de données devait se reproduire. La raison pour percona toolkit est que je veux que tout se passe en ligne, et capable d'être limité. – Aeveus

+0

Toujours pas sûr si cela aide .. mais regardez le [tableau ici] (https://dev.mysql.com/doc/refman/5.6/fr/innodb-create-index-overview.html). Depuis MySQL 5.6, aucune "reconstruction de table" n'est requise pour renommer une colonne. –

Répondre

1

Je vois que vous essayez d'appliquer un nouvel index sur une colonne qui est le nom est défini à modifier dans la même requête. Donc, remplacer:

ADD INDEX test_table_composite_idx (foo, bar) 

avec ceci:

ADD INDEX test_table_composite_idx (foo2, bar) 

Maintenant, d'essayer vos étapes distinctes: changer le nom de la première colonne et après application de la ADD INDEX test_table_composite_idx (foo, bar). Que recevez-vous? Une erreur.

Maintenant, inversez les étapes. Que ce passe-t-il? Cela fonctionne, comme vous l'avez déjà dit.

Bonne chance.

+0

Intéressant, je ne m'attendais pas à ce qu'il regarde le résultat final, mais cela a du sens. Merci! – Aeveus

+0

@Aeveus Vous êtes les bienvenus. Et je suis content que cela fonctionne maintenant. –

0

essayer :::

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)