Ajout d'un index très lent… existe-t-il un cmd mysql pour obtenir un ETA ou afficher les progrès?

13

J'exécute actuellement une autre requête sur ma table (20 millions d'entrées) afin d'ajouter un index. il fonctionne déjà depuis plus de 3 jours (coincé sur 'copier dans la table tmp').

Existe-t-il un moyen de voir la progression de la requête ou en d'autres termes existe-t-il un moyen d'obtenir une estimation du temps de réalisation?

Merci.

Atai Voltaire
la source
4
MyISAM? InnoDB? Si InnoDB, le fichier par table est-il activé?
Charles
Grande question - la meilleure chose à laquelle je peux penser instantanément est de faire une estimation approximative en utilisant la taille des fichiers bruts temporaires et réels - fera encore plus de recherches
S'il vous plaît SHOW CREATE TABLE tblname\Gsur le tableau et dites-nous l'index que vous souhaitez faire.
RolandoMySQLDBA

Réponses:

3

Lorsque mysql modifie une table, il en fait essentiellement une copie puis échange la copie. De cette façon, si vous annulez la mise à jour au milieu, la table est toujours dans un état stable. Vous pouvez donc regarder dans le répertoire de données mysql (/ var / lib / mysql /?) Pour voir la taille du nouveau fichier, qui vous dira à quel point il est long. C'est un peu plus difficile avec Innodb, mais il y a une table tmp en cours de création quelque part.

Vous pouvez réduire considérablement le temps nécessaire à un index en augmentant vos variables de tampon de tri (myisam_sort_buffer_size, sort_buffer_size). Faites-les aussi grandes que possible avec la mémoire dont vous disposez. Vous pouvez réduire de quelques jours le délai de modification, voire le réduire à quelques heures en fonction de la quantité de mémoire dont vous disposez. J'ai fait une table d'enregistrement de 150M en environ 3 heures.


la source
Malheureusement, je n'ai trouvé aucune table tmp. J'utilise innoDB, avec innodb_file_per_table réglé sur OFF.
2

Puisque innodb_fle_per_table est désactivé, vous ne pouvez pas voir le tableau et mesurer sa progression.

J'ai fait un post antérieur sur la façon de procéder pour MyISAM . Vous pouvez le faire pour InnoDB si et seulement si innodb_file_per_table a été activé et que vous avez réarchitecturé l'infrastructure InnoDB . Il faut toujours regarder dans le système d'exploitation la taille des fichiers en question.

Une fois que vous avez entièrement implémenté le nettoyage InnoDB et que vous avez activé innodb_file_per_table, vous pouvez effectuer la mise à jour de l'index comme suit:

EXEMPLE vous avez les éléments suivants

  • Instance MySQL avec / var / lib / mysql comme datadir
  • Table InnoDB appelée db.lotsofdataavec 20 millions de noms:

Le tableau ressemble à ceci:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Supposons que vous souhaitiez créer un index de nom. Tu peux le faire:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

Pendant l'insertion, vous allez dans le système d'exploitation et exécutez ceci:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Cela vous donnera une liste de la taille actuelle de lotsofdata_new.ibd. Quand il devient plus gros que ça lotsofdata.ibd, alors vous savez que vous êtes presque terminé.

BTW MariaDB a un statut de progression implémenté en interne .

RolandoMySQLDBA
la source
merci pour vos retours. pour l'instant, j'ai décidé de supprimer la requête et de réessayer après la mise à niveau vers la dernière version de mysql. j'espère que cela se passera plus facilement de cette façon.
Atai Voltaire
1

Il n'existe aucun moyen fiable de voir la progression de la création d'un index. Si vous aviez innodb-file-per-table, vous pouvez obtenir des indications en regardant le fichier .ibd temporaire qui est créé dans le répertoire de données et le comparer à la taille du fichier actuel, mais ce n'est pas très fiable, car votre fichier de données actuel pourrait être gonflé en raison de suppressions / fragmentation et le nouveau fichier de données aura un index supplémentaire que votre précédent n'avait pas.

On dirait que vous utilisez une version de MySQL sans plugin InnoDB installé. Le plugin InnoDB a une création d'index rapide qui ne nécessite pas une reconstruction complète de la table pour les ajouts et suppressions d'index. Le plugin InnoDB est activé par défaut dans MySQL 5.5 et disponible avec un paramètre de configuration dans 5.1.38 et versions ultérieures.

  • Quelle version de MySQL utilisez-vous?

Percona Server recule un peu (avant 5.5) le plugin InnoDB est activé par défaut.

Aaron Brown
la source
0

pt-online-schema-change de Percona montre l'estimation du temps restant. Par défaut, il imprime l'estimation du temps restant et le pourcentage de progression toutes les 30 secondes.

Il a également des fonctions supplémentaires par rapport à l'exécution de la commande ALTER seule.

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

Haluk
la source