Comment puis-je obtenir des messages d'état lors d'une grande opération de ré-indexation avec MySQL 5.5?

dba.stackexchange https://dba.stackexchange.com/questions/3200

  •  16-10-2019
  •  | 
  •  

Question

je reçois d'importants transferts de données périodiquement que j'ai utilisé pour remplacer complètement le contenu d'une table de MySQL. Chaque fois que je fais cela, je tronquer la table, les clés de désactiver, ajouter plusieurs millions de lignes de données, puis activer les touches. Comme prévu, une fois que j'activation des clés, il y a un retard important alors que la table est réindexer. Le tableau a plusieurs indices actifs et il faut environ 30 minutes.

Malheureusement, je ne peux pas comprendre comment obtenir des messages d'état qui me donnerait des mises à jour progresser sur la façon dont l'opération se poursuit. J'ai trouvé un vieux fil de 2001 sur le forum de MySQL qui dit fondamentalement, vous ne pouvez pas obtenir des mises à jour des progrès .

J'espérais que n'était plus le cas. Je courais MySQL Server 5.5 et MySQL Workbench 5.2, les deux éditions communautaires. Peut-être il y a quelque chose que je peux faire avec l'établi?

question Côté: À l'heure actuelle, je fais mes mises à jour à partir d'un programme Windows qui analyse séquentielle le fichier de données de transfert dans les instructions SQL INSERT j'envoie immédiatement au client de MySQL sur une prise. Serait-il plus rapide de générer toutes les instructions INSERT à un fichier, puis faire une importation en vrac en exécutant le script SQL de Workbench à la place?

- roschler

Était-ce utile?

La solution

Vous devez surveiller les progrès en dehors de tous les programmes clients mysql .

Pour cet exemple, disons que votre table MyISAM est nommé WorkingSet dans la base de données mydata et datadir est la valeur par défaut, / var / lib / mysql

Sidenote: Si vous utilisez Windows, exécutez la commande SQL pour obtenir votre datadir

SHOW VARIABLES LIKE 'datadir';

Vous avez trois fichiers représentant la table

/var/lib/mysql/mydata/workingset.frm
/var/lib/mysql/mydata/workingset.MYD
/var/lib/mysql/mydata/workingset.MYI

Essayez une approche de la table temporaire pour charger la table WorkingSet

use mydata
DROP TABLE IF EXIST workingsetload;
CREATE TABLE workingsetload LIKE workingset;
ALTER TABLE workingsetload DISABLE KEYS;
Perform 7 million row insert into workingsetload here, preferably LOAD DATA INFILE
ALTER TABLE workingsetload ENABLE KEYS;
ALTER TABLE workingset RENAME workingsetold;
ALTER TABLE workingsetload RENAME workingset;
DROP TABLE workingsetold;

Au cours de la charge de la table workingsetload, il y aura une table temporaire dont le premier cinq (5) caractères sont « # sql ». Vous pouvez surveiller visuellement dans le système d'exploitation Linux la progression du chargement de workingsetload comme ceci:

cd /var/lib/mysql/mydata
watch -n 1 "ls -l workingsetload.MY[ID] *sql-*.MY[ID] | awk '{print $5,$9}'"

script pourrait ceci dans linux comme ceci:

cd /var/lib/mysql/mydata
ls -l workingsetload.MY[ID] *sql-*.MY[ID] | awk '{print $5,$9}' > /tmp/IndexRebuild.txt

Vous pouvez ensuite analyser les colonnes en conséquence et soustraire les tailles de .MYD savoir quand la partie de données de la table MyISAM est terminée. , Vous pouvez ensuite analyser ensuite les colonnes en conséquence et soustraire les tailles de .MYI savoir quand la partie d'index de la table MyISAM est terminée.

Pour Windows, vous pourriez ce script en utilisant Perl (ActivePerl pour Windows) ou tout simplement avoir une boucle de commandes DOS, encore et encore.

Quelle que soit l'OS, une fois les "ls -l #sql -. * MY [ID]" ou "if not exist #sql -. * MY *". Revient avec rien, le rechargement et l'indexation sont complets

Lui donner un essai !!!

Mise à jour 2011-07-20 16:55 EDT

Monty a mis en œuvre avec succès cette fonctionnalité dans MariaDB. Check it out !!!

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top