Mysql
 sql >> Base de données >  >> RDS >> Mysql

Modification des grandes tables MySQL InnoDB

Modifier 2016 : nous avons récemment (août 2016) publié gh-ost , en modifiant ma réponse pour la refléter.

Aujourd'hui, il existe plusieurs outils qui vous permettent de faire des modifications de table en ligne pour MySQL. Ce sont :

Considérons le "ALTER TABLE" "normal" :

Une grande table prendra beaucoup de temps pour ALTER . innodb_buffer_pool_size est important, tout comme les autres variables, mais sur une très grande table, elles sont toutes négligeables. Cela prend juste du temps.

Ce que MySQL fait pour ALTER un tableau consiste à créer un nouveau tableau avec un nouveau format, à copier toutes les lignes, puis à basculer. Pendant ce temps, la table est complètement verrouillée.

Étudiez votre propre suggestion :

Il effectuera très probablement la pire de toutes les options. Pourquoi donc? Parce que vous utilisez une table InnoDB, le INSERT INTO tablename_tmp SELECT * FROM tablename fait une transaction. un énorme transaction. Cela créera encore plus de charge que le ALTER TABLE normal .

De plus, vous devrez fermer votre application à ce moment-là pour qu'elle n'écrive pas (INSERT , DELETE , UPDATE ) à votre table. Si c'est le cas, toute votre transaction est inutile.

Ce que proposent les outils en ligne

Les outils ne fonctionnent pas tous de la même façon. Cependant, les bases sont partagées :

  • Ils créent une table "fantôme" avec un schéma modifié
  • Ils créent et utilisent des déclencheurs pour propager les modifications de la table d'origine à la table fantôme
  • Ils lentement copiez toutes les lignes de votre table vers la table fantôme. Ils le font par tranches :disons, 1 000 lignes à la fois.
  • Ils font tout ce qui précède pendant que vous pouvez toujours accéder à la table d'origine et la manipuler.
  • Lorsqu'ils sont satisfaits, ils échangent les deux, en utilisant un RENAME .

Le kit openark outil est utilisé depuis 3,5 ans maintenant. L'outil Percona a quelques mois, mais peut-être plus testé que le premier. On dit que l'outil de Facebook fonctionne bien pour Facebook, mais ne fournit pas de solution générale à l'utilisateur moyen. Je ne l'ai pas utilisé moi-même.

Modifier 2016 : gh-ost est une solution sans déclenchement, qui réduit considérablement la charge d'écriture du maître sur le maître, en dissociant la charge d'écriture de la migration de la charge normale. Il est auditable, contrôlable, testable. Nous l'avons développé en interne chez GitHub et l'avons publié en open source; nous effectuons toutes nos migrations de production via gh-ost aujourd'hui. En savoir plus ici .

Chaque outil a ses propres limites, regardez bien la documentation.

La manière conservatrice

La méthode conservatrice consiste à utiliser une réplication active-passive maître-maître, faites le ALTER sur le serveur de secours (passif), puis changez de rôle et faites ALTER à nouveau sur ce qui était le serveur actif, maintenant devenu passif. C'est également une bonne option, mais nécessite un serveur supplémentaire et une connaissance approfondie de la réplication.