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?
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:
SET sql_log_bin = 0;
OPTIMIZE TABLE mydb.mytable;
SET sql_log_bin = 1;
OPTIMIZE NO_WRITE_TO_BINLOG TABLE mydb.mytable;
OPTIMIZE LOCAL TABLE mydb.mytable;
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.
Sur une meilleure approche de cluster de noeuds serait d'utiliser PT-Online-Schema-Change.
Puis exécutez la suite.
pt-online-schema-change --execute --alter "ENGINE=InnoDB" h=localhost,u=root,p=password,D=dbname,t=tablename
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.