J'ai besoin de créer un index sur une table MySQL d'environ 5 millions de lignes. C'est une table de production, et je crains un bloc complet de tout si j'exécute une instruction CREATE INDEX ...
Existe-t-il un moyen de créer cet index sans bloquer les insertions et les sélections?
Je me demande simplement que je ne dois pas m'arrêter, créer un index et redémarrer mon système!
mysql
indexing
production
alter-table
table-locking
n0cturne
la source
la source
Réponses:
[2017] Mise à jour: MySQL 5.6 prend en charge les mises à jour d'index en ligne
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html#online-ddl-index-syntax-notes
[2015] La mise à jour de la table indique les écritures de blocs dans MySQL 5.5
D'après la réponse ci-dessus:
C'est **** FALSE **** (du moins pour les tables MyISAM / InnoDB, ce que 99,999% des gens utilisent. L'édition en cluster est différente.)
Faire des opérations UPDATE sur une table bloquera pendant la création de l'index. MySQL est vraiment, vraiment stupide à ce sujet (et quelques autres choses).
Script de test:
Mon serveur (InnoDB):
Sortie (notez comment la 6ème opération se bloque pendant les ~ 400 ms nécessaires pour terminer la mise à jour de l'index):
Vs lire les opérations qui ne bloquent pas (permuter le commentaire de ligne dans le script):
Mettre à jour le schéma de MySQL sans temps d'arrêt
Ainsi, je ne connais qu'une seule méthode pour mettre à jour un schéma MySql et ne pas subir de panne de disponibilité. Maîtres circulaires:
Ce n'est pas un moyen simple de mettre à jour le schéma. Réalisable dans un environnement de production sérieux; Oui, ça l'est. S'il vous plaît, s'il vous plaît, s'il existe un moyen plus simple d'ajouter un index à une table MySQL sans bloquer les écritures, faites le moi savoir.
Googler m'amène à cet article qui décrit une technique similaire. Mieux encore, ils conseillent de boire au même moment de la procédure (notez que j'ai écrit ma réponse avant de lire l'article)!
Changement de schéma pt-en-ligne de Percona
L' article que j'ai lié ci-dessus parle d'un outil, pt-online-schema-change , qui fonctionne comme suit:
Je n'ai jamais essayé l'outil moi-même. YMMV
RDS
J'utilise actuellement MySQL via le RDS d'Amazon . C'est un service vraiment astucieux qui encapsule et gère MySQL, vous permettant d'ajouter de nouvelles répliques en lecture avec un seul bouton et de mettre à niveau de manière transparente la base de données à travers les SKU matériels. C'est vraiment pratique. Vous n'obtenez pas un accès SUPER à la base de données, vous ne pouvez donc pas visser directement avec la réplication (est-ce une bénédiction ou une malédiction?). Cependant, vous pouvez utiliser la promotion de réplique en lecture pour apporter des modifications de schéma sur un esclave en lecture seule, puis promouvoir cet esclave pour qu'il devienne votre nouveau maître. Exactement la même astuce que j'ai décrite ci-dessus, juste beaucoup plus facile à exécuter. Ils ne font toujours pas grand-chose pour vous aider avec la transition. Vous devez reconfigurer et redémarrer votre application.
la source
Comme le souligne cet article de blog , l'InnoDB
ALTER TABLE
mécanisme a été complètement repensé pour MySQL 5.6.(Pour un aperçu exclusif de ce sujet, la documentation MySQL peut fournir un après-midi de lecture.)
Pour ajouter un index à une table sans verrou résultant sur
UPDATE
/INSERT
, le format d'instruction suivant peut être utilisé:la source
Mise à jour MySQL 5.6 (février 2013): Vous pouvez désormais effectuer des opérations de lecture et d'écriture pendant la création d'un index, même avec des tables InnoDB - http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
et:
depuis http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
la source
pt-online-schema-change est la voie à suivre si vous voulez vraiment vous assurer que la migration ne fera pas tomber le site.
Comme je l'ai écrit dans le commentaire ci-dessus, j'ai plusieurs expériences avec pt-online-schema-change en production. Nous avons notre table principale de 20M + enregistrements et un maître -> 2 esclaves de réplication en lecture seule. J'ai effectué au moins des dizaines de migrations avec pt-online-schema-change, de l'ajout d'une nouvelle colonne, du changement de charset à l'ajout de plusieurs index. Nous desservons également des tonnes de trafic pendant la période de migration et nous n'avons eu aucun hoquet. Bien sûr, vous devrez tester tous les scripts de manière approfondie avant de passer en production.
J'ai essayé de regrouper les modifications en 1 script afin que pt-online-schema-change n'ait à copier les données qu'une seule fois. Et soyez très prudent avec le changement de nom de colonne car vous perdrez vos données. Cependant, l'ajout d'un index devrait convenir.
la source
pt-online-schema-change
. C'est génial, mais c'est exagéré pour de nombreuses situations où les capacités DDL en ligne de MySQL 5.6 + fonctionnent déjà correctement. Il a également des limitations (comme ne pas jouer correctement avec les déclencheurs) et double la quantité d'écriture nécessaire par insertion dans la table d'origine pendant qu'un changement de schéma est en cours. Cela imposera beaucoup plus à votre disque qu'un changement de schéma en ligne ordinaire, et a donc le potentiel de «faire tomber votre site» dans des circonstances où le simple fait d'exécuter le changement de schéma de manière simple aurait bien fonctionné.pt-online-schema-change
c'est un outil utile, il y a de très nombreuses situations dans lesquelles le DDL en ligne ordinaire est tout aussi bon et une poignée là où c'est meilleur, donc toute recommandation devrait être soigneusement mise en garde plutôt qu'universelle.