it-swarm.it

Aggiunta di un indice molto lento ... esiste un cmd mysql per ottenere un ETA o mostrare progressi?

Attualmente sto eseguendo una query di modifica sulla mia tabella (20 milioni di voci) per aggiungere un indice. funziona già da più di 3 giorni (bloccato su "copia nella tabella tmp").

c'è un modo in cui posso vedere l'avanzamento della query o in altre parole c'è un modo in cui posso ottenere un tempo di stima del completamento?

grazie.

15
Atai Voltaire

Quando mysql altera una tabella, ne fa essenzialmente una copia e quindi scambia la copia. In questo modo se si annulla l'aggiornamento nel mezzo, la tabella è ancora in uno stato stabile. Quindi puoi guardare nella directory dei dati mysql (/ var/lib/mysql /?) Per vedere quanto è grande il nuovo file, che ti dirà quanto è lungo. Questo è un po 'più difficile con Innodb, ma c'è una tabella tmp creata da qualche parte.

È possibile ridurre significativamente il tempo impiegato da un indice aumentando le variabili del buffer di ordinamento (myisam_sort_buffer_size, sort_buffer_size). Rendi quelli più grandi che puoi con la memoria che hai. Potresti tagliare alcuni giorni di tempo di modifica, anche ridurlo a poche ore a seconda di quanta memoria hai. Ho fatto una tabella record di 150 milioni in circa 3 ore.

3
Brent Baisley

Poiché innodb_fle_per_table è OFF, non è possibile visualizzare la tabella e misurarla in corso.

Ho scritto un post precedente su come farlo per MyISAM . Puoi farlo per InnoDB se e solo se innodb_file_per_table è stato abilitato e cerchi nuovamente l'infrastruttura InnoDB . Richiede ancora di guardare nel sistema operativo le dimensioni dei file in questione.

Dopo aver implementato completamente InnoDB Cleanup e aver abilitato innodb_file_per_table, potresti voler eseguire l'aggiornamento dell'indice come segue:

ESEMPIO hai il seguente

  • Istanza MySQL con/var/lib/mysql come datadir
  • Tabella InnoDB chiamata db.lotsofdata con 20 milioni di nomi:

La tabella è simile alla seguente:

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

Supponiamo di voler creare un indice dei nomi. Puoi farlo:

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;

Mentre INSERT è in esecuzione, vai nel sistema operativo ed esegui questo:

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

Questo ti darà un elenco delle dimensioni correnti di lotsofdata_new.ibd. Quando diventa più grande di lotsofdata.ibd, allora sai di essere vicino al completamento.

BTW MariaDB ha uno stato di avanzamento implementato internamente .

2
RolandoMySQLDBA

Non esiste un modo affidabile per vedere l'avanzamento della creazione di un indice. Se hai attivato il file innodb per tabella, potresti ottenere qualche indicazione guardando il file .ibd temporaneo che viene creato nella directory dei dati e confrontarlo con la dimensione del file corrente, ma non è molto affidabile, poiché il tuo file di dati corrente potrebbe essere gonfiato a causa di eliminazioni/frammentazione e il nuovo file di dati avrà un indice aggiuntivo rispetto al tuo precedente.

Sembra che tu stia utilizzando una versione di MySQL senza plug-in InnoDB installato. Il plug-in InnoDB ha creazione rapida dell'indice che non richiede una ricostruzione completa della tabella per aggiunte ed eliminazioni di indici. Il plug-in InnoDB è abilitato per impostazione predefinita in MySQL 5.5 e disponibile con un'impostazione di configurazione in 5.1.38 e successive.

  • Quale versione di MySQL stai usando?

Percona Server in un certo senso (pre 5.5) ha il plugin InnoDB abilitato di default.

1
Aaron Brown

pt-online-change-change di Percona mostra la stima del tempo rimanente. Per impostazione predefinita, stampa la stima del tempo rimanente e la percentuale di avanzamento ogni 30 secondi.

Ha anche funzioni aggiuntive rispetto alla semplice esecuzione del comando ALTER da solo.

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

1
Haluk