Question

J'ai une table myISAM en cours de production sur mySQL, et en effectuant quelques tests, nous avons constaté que nous pouvions considérablement accélérer une requête en ajoutant un certain index composé. Jusqu'ici tout va bien. Toutefois, je ne suis pas vraiment le meilleur moyen d'ajouter cet index dans un environnement de production sans verrouiller la table pendant longtemps (il contient 27 Go de données, donc pas beaucoup, mais cela prend un certain temps).

Avez-vous des conseils? S'il s'agissait d'une configuration plus sophistiquée, nous aurions évidemment une réplique en direct de toutes les données sur une autre machine et nous pourrions basculer en toute sécurité. Malheureusement, nous n'en sommes pas encore là et j'aimerais accélérer cette requête le plus rapidement possible (cela cause de gros maux de tête à la clientèle). Existe-t-il un moyen simple de répliquer les données, puis de réaliser une astuce de permutation? Quelques autres astuces qui me manquent?

UPDATE: Lecture à propos de & Online; "Opérations sur les index en ligne". dans SQL Server me rend très jaloux http://msdn.microsoft.com/en -us / library / ms191261.aspx :)

Merci!

Était-ce utile?

La solution

vous pouvez utiliser la réplication pour obtenir des temps d'arrêt de l'ordre de quelques minutes au lieu des heures nécessaires à la création d'un index sur cette table.

pour configurer l'esclave, voir http: //dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

une recommandation que je peux faire pour accélérer le processus est à l'étape 2, suivez les instructions de la section "Création d'un instantané de données à l'aide de fichiers de données brutes". méthode. mais au lieu de copier le fil sur l’esclave, copiez-le sur un emplacement différent du maître. et remettez le maître en place dès que la copie est terminée et que vous avez apporté les modifications nécessaires au fichier de configuration (set server-id et activation de la journalisation binaire). cela minimisera votre temps d'arrêt à une minute ou deux. une fois le serveur sauvegardé, vous pouvez copier les fichiers copiés dans la boîte esclave.

une fois que l'esclave est opérationnel et que vous avez vérifié que tout se réplique correctement , vous pouvez mettre l'esclave en pause . créer l'index sur la pommade. lorsque la création de l'index est terminée, reprenez l'esclave. cela attrapera l'esclave jusqu'au maître. sur le master, utilisez FLUSH TABLE WITH READ LOCK. vérifiez l'état de l'esclave pour vous assurer que la position du journal sur le maître et l'esclave correspondent. s’ils le font, arrêtez l’esclave et copiez les fichiers de cette table sur le maître.

Autres conseils

Je suis avec Randy. Nous sommes dans une situation similaire et, dans MySQL, il existe deux façons d'accomplir quelque chose comme ceci:

  1. Arrêtez le serveur pendant son exécution. C'est ce que vous allez probablement faire. C'est simple, facile, ça marche. Temps à faire? Peut-être une demi-heure / 45 minutes, en fonction de la bande passante du disque. Voir ci-dessous.

  2. Créez une nouvelle table avec le nouvel index, copiez toutes les données, mettez le serveur en pause, supprimez la première table, remplacez la nouvelle par l'ancien nom, démarrez le serveur. Temps d'arrêt? 10 minutes peut-être, mais vraiment compliqué.

L'option deux fonctionne et vous évite les temps morts liés à la création de l'index (si cela prend beaucoup de temps). Mais cela prend plus d’espace, c’est plus compliqué (étant donné que vous devez gérer les nouveaux enregistrements insérés dans la table principale, et cela bloquera probablement MyISAM lors de la copie des données. La suppression d’une table prendra un certain temps, ce qui modifiera le nouveau nom prendra un certain temps. C’est vraiment très compliqué. Si vous aviez une table de 2 To, cela pourrait être utile, mais pour 27G, c’est probablement exagéré.

Avez-vous un deuxième serveur dont les spécifications sont proches de celles de votre serveur de production? Chargez votre sauvegarde la plus récente et créez l'index afin que vous sachiez combien de temps il faudra pour l'ajouter. Ensuite, planifiez les temps d'arrêt.

InnoDB résout beaucoup de problèmes, mais les nouveaux index verrouillent toujours la table. Ces capacités que MSSQL (et je pense que PostgreSQL) doivent faire ce genre de choses sans verrouillage seraient géniales.

Recherchez votre fenêtre d’utilisation faible et mettez votre application hors ligne pendant la construction de l’index. Etant donné que vous n'avez pas de réplication, ni de multimaster, peu importe, vous allez devoir vous en prendre à la balle. On se voit à 1h du matin. : -)

Vous ne pouvez pas faire grand chose avec un serveur ici.

Si vous copiez la table et effectuez un essai, vous saurez au moins combien de temps il faudra sans verrouiller la table en direct, de sorte que vous puissiez planifier du temps de maintenance si nécessaire, ou prendre une décision. appuyez simplement sur le bouton et laissez les utilisateurs en attente pendant quelques minutes:)

Ou programmez-le pour un moment de calme ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top