J'ai donc un serveur de base de données de test qui a été installé sur un flux de réplication. Sur le nom, une optimisation est apparue qui a rapidement rempli l'espace sur le datadir des esclaves. Mysql attendait consciencieusement un peu plus d'espace.
Ce datadir est un système de fichiers utilisé UNIQUEMENT comme datadir de mysql donc il n'y avait rien d'autre à libérer.
J'avais une table de test innodb de 4 gig qui ne faisait pas partie du flux de réplication alors j'ai pensé que j'essaierais quelque chose pour voir si cela fonctionnerait, et étant un environnement de test, je n'étais pas trop inquiet si les choses tournaient horriblement mal.
Voici les étapes que j'ai prises
- Rincé la table que j'allais bouger
- Placé un verrou de lecture dessus (même si rien n'y était écrit et qu'il n'était pas dans le flux de réplication)
- Copié le .frm et le .ibd sur un système de fichiers avec une pièce de rechange
- Déverrouillé la table
- La table a été tronquée - cela a libéré suffisamment d'espace pour que l'optimisation se termine et que la réplication recommence à avancer.
- Arrêtez l'asservissement / l'arrêt de mysql
- Copiez le fichier de tmp dans le répertoire de données
- Redémarrez mysql
Rien n'apparaît dans le journal .err, les choses semblent bonnes. Je me connecte et utilise mydb; et voir la table avec laquelle je jouais dans les tables d'exposition. Mais si j'essaye
select * from testtable limit 10;
Je reçois l'erreur
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
D'après ce que je peux dire jusqu'à présent, je peux lire à partir de toutes les autres tables très bien et la réplication a commencé sans aucune plainte.
Puis-je faire quelque chose pour récupérer à partir de ce point? Je peux le reconstruire à partir de zéro si nécessaire, mais j'étais curieux de savoir ce que les autres pensaient de cette entreprise en général. Y avait-il quelque chose dans la série d'étapes que j'ai prises qui aurait abouti à des résultats plus parfaits?
Et si ce n'était pas un serveur de test, je ne pouvais pas simplement "le faire vivre" et voir ce qui se passait? Quelle serait la meilleure façon de libérer temporairement de l'espace sur un esclave de production si je devais aimer ça?
Table 'X' doesn't exist in engine
. Dois-je faire la méthode ci-dessus pour chacune des tables ou existe-t-il de meilleures façons de résoudre ce problème?