2009-10-21 5 views
0

J'ai une table myISAM qui s'exécute en production sur mySQL, et en faisant quelques tests, nous avons constaté que nous pouvions accélérer énormément une requête en ajoutant un certain index composé. Jusqu'ici tout va bien. Cependant, je ne suis pas vraiment sur la meilleure façon d'ajouter cet index dans un environnement de production sans verrouiller la table pendant longtemps (il a 27 Go de données, donc pas tellement, mais cela prend un certain temps).Quel est le moyen le plus simple d'ajouter un index sur une table myISAM live?

Avez-vous des conseils? Si c'était une installation plus sophistiquée bien sûr, nous aurions une réplique en direct de toutes les données sur une autre machine, et nous pourrions changer en toute sécurité. Malheureusement, nous n'en sommes pas encore là, et je voudrais accélérer cette requête le plus rapidement possible (cela cause de gros soucis aux clients). Existe-t-il un moyen simple de répliquer les données et de faire un tour d'échange? D'autres trucs qui me manquent?

MISE À JOUR: Lecture sur "Opérations Index en ligne" dans SQL Server me rend très jaloux :) http://msdn.microsoft.com/en-us/library/ms191261.aspx

Merci!

+0

Pouvez-vous restreindre l'accès en écriture à la base de données pendant un moment? –

Répondre

3

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. méthode

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

une recommandation que je peux faire pour aider à accélérer le processus est à l'étape 2 suivre la section « Création d'un instantané données à l'aide des fichiers de données brutes ». mais au lieu de copier sur le câble à l'esclave, copiez à un emplacement différent sur le 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 (définissez l'ID du serveur et la journalisation binaire activée). Cela réduira votre temps d'arrêt à seulement 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 verified everything is replicating properly, vous pouvez pause the slave. créer l'index sur le baume. Lorsque la création de l'index est terminée, reprenez l'esclave. cela attrapera l'esclave jusqu'au maître. sur le maître, utilisez la commande 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. si c'est le cas, arrêtez l'esclave et copiez les fichiers de cette table sur le maître.

0

Trouvez votre fenêtre de faible utilisation et mettez votre application hors ligne pendant la construction de l'index. Puisque vous n'avez pas de réplication ou un multimaître ou quoi que ce soit, vous allez juste devoir mordre la balle sur celui-ci. On se voit à 1h du matin. :-)

0

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

Si vous copiez la table et effectuez une analyse à sec, vous saurez au moins combien de temps cela prendra sans verrouiller la table dynamique, de sorte que vous pouvez planifier un temps de maintenance si nécessaire, ou décider si vous peut simplement appuyer sur le bouton et de laisser les utilisateurs suspendus pendant quelques minutes :)

Ou programmer pour un temps calme ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)' 
1

Je suis avec Randy. Nous avons été dans une situation similaire, et il y a deux façons de MySQL pour accomplir quelque chose comme ceci:

  1. éteindre le serveur pendant qu'il fonctionne. C'est ce que vous ferez probablement. C'est simple, c'est facile, ça marche. Temps de faire? Peut-être une demi-heure/45 minutes, en fonction de la bande passante du disque. Voir ci-dessous.

  2. Créer une nouvelle table avec le nouvel index, copier toutes les données, suspendre le serveur supprimer la première table, modifier la nouvelle à l'ancien nom, démarrer le serveur. Temps d'arrêt? 10 minutes, peut-être, mais vraiment compliqué.

L'option deux fonctionne et vous évite l'indisponibilité de la création de l'index (si cela prend beaucoup de temps). Mais cela prend plus de place, c'est plus compliqué (puisque vous devez gérer les nouveaux enregistrements insérés de la table principale, et il se verrouillera probablement sur MyISAM en copiant les données.) Supprimer une table prendra du temps le nouveau nom prendra un certain temps, c'est vraiment compliqué, si vous aviez une table de 2 To cela pourrait être utile, mais pour 27G, c'est probablement trop cher

Avez-vous un second serveur proche des spécifications de votre serveur de production? ? Chargez votre sauvegarde la plus récente et faites l'index là-bas, de sorte que vous savez combien de temps il faudra pour ajouter.Préparer les temps d'arrêt

InnoDB est mieux sur beaucoup de choses, mais de nouveaux index verrouillent encore la table. capacités que MSSQL (et je pense que PostgreSQL) doivent faire ce genre de les choses sans verrouillage seraient super.

Questions connexes