J'ai une grande table avec une colonne VARCHAR (20), et je dois la modifier pour devenir une colonne VARCHAR (50). En règle générale, l'exécution d'une ALTER TABLE (ajout d'un TINYINT) sur cette table particulière prend environ 90 à 120 minutes, donc je ne peux vraiment le faire que le samedi ou le dimanche soir pour éviter d'affecter les utilisateurs de la base de données. Si possible, je voudrais faire cette modification avant cela.
La colonne est également indexée, ce qui, je présume, ralentira ALTER TABLE, car elle doit reconstruire l'index après avoir modifié la longueur de la colonne.
L'application Web est installée dans un environnement de réplication MySQL (26 esclaves et un maître). Je me souviens d'avoir lu quelque part qu'une méthode consiste à exécuter d'abord la ALTER TABLE sur chaque esclave (minimiser l'impact sur les utilisateurs), puis à le faire sur le maître, mais cela n'essaiera-t-il pas alors de répliquer la commande ALTER TABLE sur les esclaves?
Ma question est donc: quelle est la meilleure façon pour moi de modifier ce tableau avec un minimum de perturbations pour mes utilisateurs?
Edit: la table est InnoDB.
la source
Réponses:
Si vous êtes un peu aventureux, vous pouvez prendre les choses en main en effectuant la ALTER TABLE par étapes que vous pouvez voir. Supposons que la table que vous souhaitez modifier s'appelle WorkingTable. Vous pouvez effectuer les modifications par étapes comme ceci:
Vous pouvez effectuer cela sur tous les esclaves. Et le maître ??? Comment empêchez-vous cela de se répliquer sur les esclaves. Simple: N'envoyez pas le SQL dans les journaux binaires du maître. Fermez simplement la journalisation binaire dans la session avant de faire les choses ALTER TABLE:
Mais attendez !!! Qu'en est-il des nouvelles données qui arrivent lors du traitement de ces commandes ??? Renommer la table au début de l'opération devrait faire l'affaire. Modifions un peu ce code pour éviter de saisir de nouvelles données à cet égard:
Essaie !!!
la source
Ma conjecture de la documentation serait que simplement augmenter la contrainte de longueur sur un
varchar
ne causerait pas le même problème que l'ajout d'une colonne:Mais cela semble être contredit dans les commentaires sur cette question SO .
ÉDITER
Au moins sur 5.0, je pense pouvoir confirmer que l'augmentation de la longueur nécessite en effet une table temporaire (ou une autre opération tout aussi chère):
banc d'essai:
résultat:
la source
Je pensais, je mentionnerais que depuis le
ENGINE=INNODB
Si vous avez des contraintes de clé étrangère, vous ne pouvez pas modifier et renommer sans vos contraintes pointant vers l'ancienne table (maintenant renommée). Vous devrez ensuite modifier ou supprimer les contraintes pour la durée.
la source