web-dev-qa-db-fra.com

Comment exécuter Optimiser la table sur un cluster à 3 nœuds?

Mes mains sur un cluster à 3 nœuds PerCona Xtradb où, selon mysqlcheck, certaines tables sont corrompues (certains index contiennent le mauvais nombre d'entrées):

mydb.mytable
Warning  : InnoDB: Index 'foo' contains 1393929 entries, should be 1393918.
Warning  : InnoDB: Index 'bar' contains 1393921 entries, should be 1393918.
error    : Corrupt

Quelle est la meilleure pratique pour courir OPTIMIZE TABLE sur un cluster?

J'ai fait des expériences dans un environnement de test sans que les utilisateurs, et il semble qu'un OPTIMIZE TABLE Sur un nœud ne propage pas automatiquement son effet aux autres nœuds. Cela correspond au fait que cette commande modifie les index et l'espace de stockage de la table, pas son contenu ou sa définition.

  • Quels pourraient être les inconvénients dans l'exécution de la commande dans un environnement de production dans chaque nœud, la laisser terminer avant de l'exécuter dans le nœud suivant?

  • Quel serait l'effet sur les utilisateurs, considérant que MySQL (et Percona Xtradb Cluster, autant que je sache) ne pas prendre en charge les serrures de table distribuées? Cela quitterait-il le cluster dans un état incohérent?

7
dr_

S'il y a un besoin de courir OPTIMIZE TABLE En PXC, vous pouvez y parvenir en refusant son enregistrement dans des journaux binaires en une des trois (3) façons:

Méthode n ° 1

SET sql_log_bin = 0;
OPTIMIZE TABLE mydb.mytable;
SET sql_log_bin = 1;

Méthode n ° 2

OPTIMIZE NO_WRITE_TO_BINLOG TABLE mydb.mytable;

Méthode n ° 3

OPTIMIZE LOCAL TABLE mydb.mytable;

SUGGESTION

Exécutez celui de ces réponses OPTIMIZE TABLE Scénarios sur un nœud PXC à la fois tandis que la redirection se lit et écrit à partir du cluster. Si les données sont énormes, supprimez le nœud PXC du cluster, exécuté OPTIMIZE TABLE à volonté et ajoutez le PXC dans le cluster.

4
RolandoMySQLDBA

Sur une meilleure approche de cluster de noeuds serait d'utiliser PT-Online-Schema-Change.

  1. assurez-vous que le moteur de la table est innoDB.
  2. assurez-vous que "Innodb_File_Per_Table est activé", si ce n'est pas sur l'espace ne peut pas être récupéré.
  3. assurez-vous que "WSREP_OSU_METHOD" doit être défini sur TOI, reproduire optimiser à d'autres nœuds.

Puis exécutez la suite.

pt-online-schema-change --execute --alter "ENGINE=InnoDB" h=localhost,u=root,p=password,D=dbname,t=tablename
2
xs2rashid

La meilleure pratique pour OPTIMIZE TABLE ON TOUT Système InnoDB: do -non Run It. Cela ne vaut presque jamais l'effort.

Si vous devez le faire dans un cluster Galera (tel que PXC), traitez-le comme un ALTER: utilisez TOI (pour la simplicité) s'il s'agit d'une petite table; RSU (pour éviter le blocage) si c'est grand.

Étant donné que OPTIMIZE ne change pas le contenu de la table, juste la mise en page, vos questions le permettent de compléter, les incohérences ne sont pas pertinentes.

0
Rick James