Come posso monitorare l'avanzamento di un'importazione di un file .sql di grandi dimensioni?


204

Sto importando un 7 GB foobar.sqlper ripristinare una tabella in un database locale.

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

Come posso monitorare i suoi progressi?


1
Le risposte a questa domanda mostrano che questa è una chiara carenza del client mysql
William Entriken,

Risposte:


267

Se stai solo importando da un file di dump dalla CLI su * nix, ad es

mysql -uxxx -pxxx dbname < /sqlfile.sql

quindi prima installa pipe viewer sul tuo sistema operativo quindi prova qualcosa del genere:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

che mostrerà una barra di avanzamento durante l'esecuzione del programma.

È molto utile e puoi anche usarlo per ottenere una stima dei progressi di mysqldump.

pv esegue il dump di sqlfile.sqle li passa a mysql (a causa dell'operatore pipe). Mentre è in dumping, mostra i progressi. La cosa interessante è che mysql prende i dati solo il più velocemente possibile, in modo che pv possa mostrare l'avanzamento dell'importazione. Non ho alcuna prova. Ma sembra di si. Immagino che ci sia un po 'di buffer usato, ma a un certo punto penso mysqlche non legga più dati quando è ancora in fase di elaborazione.

Schermata Pipe Viewer


1
Immagino che mysql potrebbe avere un buffer, in cui alcuni dati possono essere reindirizzati, senza essere completamente "elaborati" (vale a dire se si verifica un errore, pv potrebbe aver riportato un po 'più di quanto è effettivamente entrato). Ma in generale, è così che funzionano le pipe. È la stessa ragione per cui puoi fare sudo hd /dev/sda1 | lesse non avere l'intera partizione di sistema in memoria.
snapfractalpop

2
@snapfractalpop pvnon sarà eccessivamente accurato in molti casi perché alcuni blocchi di SQL impiegheranno più tempo per l'elaborazione rispetto ad altri. Una riga che costituisce un semplice inserto verrà eseguita molto più velocemente di quella creata su un indice in una tabella che ha già molte righe, ad esempio. Ma una vaga idea di progresso l'output dovrebbe essere utile a meno che il buffer di lettura utilizzato da non mysqlsia particolarmente grande (per un input da 7 Gb il buffer dovrebbe essere molto grande per rendere pvl'output non utile affatto.
David Spillett,

1
@DavidSpillett davvero. Il tuo commento rispecchia il mio sentimento. Fondamentalmente, il fotovoltaico è grezzo, ma efficace. Quello che mi piace di più è quanto sia generale. Tale è la bellezza delle pipe unix (grazie McIlroy).
snapfractalpop

1
@rob Questo è fantastico amico, potresti anche fornire un esempio mysqldump?
Josue Alexander Ibarra,

Ottima soluzione! Se la password è manuale, pv non aspetta che visualizzi la sua progressione però
Pierre de LESPINAY,

27

Se hai già avviato l'importazione, puoi eseguire questo comando in un'altra finestra per visualizzare le dimensioni correnti dei tuoi database. Questo può essere utile se conosci la dimensione totale del file .sql che stai importando.

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

Ringraziamo: http://forums.mysql.com/read.php?108,201578,201578


Il riferimento MySQL 8.0 afferma quanto segue sull'accuratezza:

DATA_LENGTH

Per MyISAM, DATA_LENGTH è la lunghezza del file di dati, in byte.

Per InnoDB, DATA_LENGTH è la quantità approssimativa di memoria allocata per l'indice cluster, in byte. In particolare, è la dimensione dell'indice cluster, in pagine, moltiplicata per la dimensione della pagina InnoDB.

 

INDEX_LENGTH

Per MyISAM, INDEX_LENGTH è la lunghezza del file indice, in byte.

Per InnoDB, INDEX_LENGTH è la quantità approssimativa di memoria allocata per gli indici non cluster, in byte. In particolare, è la somma delle dimensioni dell'indice non cluster, in pagine, moltiplicata per la dimensione della pagina InnoDB.


Il mio tavolo è ora a 12 GiB secondo i comandi di questa risposta e continua a importare. Il mio file sqldump è solo 5 GiB. Sarei interessato a una spiegazione per questa discrepanza
lucidbrot il

17

Quando si esegue un mysqldump di un singolo database, tutte le tabelle vengono scaricate in ordine alfabetico.

Naturalmente, anche il ricaricamento di mysqldump in un database sarebbe in ordine alfabetico.

Potresti semplicemente fare una SHOW PROCESSLIST; e scopri la connessione DB che esegue mysqldump. Quando il dump viene ricaricato, la connessione DB svanirà.

Se vuoi sapere quali tabelle sono nel dumpfile, esegui questo su foobar.sql

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

AGGIORNAMENTO 2012-05-02 13:53 EDT

Ci scusiamo per non aver notato che esiste solo una tabella.

Se la tabella è MyISAM, l'unico modo per monitorare è dal punto di vista del sistema operativo. La ragione? La tabella è bloccata in scrittura durante il ricaricamento. Cosa cerchi? La dimensione dei file .MYDe .MYI. Ovviamente, devi confrontarlo con quello che era la dimensione della tabella precedente sull'altro server DB da cui hai importato.

Se la tabella è InnoDB e hai innodb_file_per_table abilitato, l'unico modo per monitorare è dal punto di vista del sistema operativo. La ragione? La tabella è bloccata in scrittura durante il ricaricamento. Cosa cerchi? La dimensione del .ibdfile. Ovviamente, devi confrontarlo con quello che era la dimensione della tabella precedente sull'altro server DB da cui hai importato.

Se la tabella è InnoDB e innodb_file_per_table è disabilitato, nemmeno il punto di vista del sistema operativo può essere d'aiuto.

AGGIORNAMENTO 2012-05-02 13:56 EDT

Ho affrontato qualcosa come questo l'anno scorso: come posso ottenere progressi% per "digitare db.sql | mysql"

AGGIORNAMENTO 2012-05-02 14:09 EDT

Poiché un mysqldump standard blocca la tabella in questo modo:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

quindi, non è possibile ottenere progressi con mysql fino al rilascio del blocco tabella.

Se riesci a ottenere LOCK TABLESe UNLOCK TABLEScommentare dal dumpfile ...

  • se la tabella è MyISAM, SELECT COUNT (*) funzionerebbe
  • se la tabella è InnoDB, SELECT COUNT (*) probabilmente rallenterebbe / arresterebbe il carico fino al termine del conteggio

Ha funzionato Grazie. Un'ultima domanda è, per esperienza, sai se il tempo di importazione è approssimativamente lineare rispetto alle dimensioni del file .MYDe .MYI?
qazwsx,

1
La ricarica della tabella è lineare. Le ricostruzioni dell'indice sono lineari. Anni fa, non è stato come me l'ho avventurato come una domanda a MySQL ( lists.mysql.com/mysql/202489 ) e l'ho menzionato in DBA StackExchange ( dba.stackexchange.com/a/2697/877 )
RolandoMySQLDBA

8

Ogni 2 secondi vedrai i processi in esecuzione.

watch 'echo "show processlist;" | mysql -uuser -ppassword';

Se lo desideri meno frequentemente, aggiungi -n xdove x è il numero di secondi. 5 secondi sarebbero:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

Puoi pubblicare un esempio di output? Inoltre, mostra semplicemente il processo o indica davvero l'avanzamento dell'importazione, cosa che stavo davvero chiedendo?
qazwsx,

Questo è un codice così utile. Grazie
NarayaN,

6

Se vuoi solo verificare se è bloccato puoi eseguire una query

show processlist; 

e vedere cosa viene eseguito.


5

Come soluzione per qualcuno che non riesce a far funzionare il fotovoltaico o per chi dice bugie. È possibile monitorare la dimensione del file ibdata1 in / var / lib / mysql che contiene i dati. Ciò finirà per avere le stesse dimensioni (o successive) del file nel server di origine.

Se ci sono molte tabelle, puoi anche vederle apparire una per una in / var / lib / mysql / <nome database>.

Mi è capitato di usare questo fatto di recente quando un database a lungo termine ha creato un file di registro di circa 20 G per un periodo di tre o quattro anni. Ho notato che il trasferimento stava impiegando anni e ho usato questa tecnica per monitorare i progressi.

Penso che sia altamente improbabile che sorga il giorno in cui un database non coinvolge un file da qualche parte. Nel frattempo, puoi monitorare il file per vedere come sta procedendo un trasferimento. Il metodo che ho suggerito è stato qualcosa che potresti fare in un modo o nell'altro da quando è stato scritto il primo database sql. Non ho mai pensato di suggerire che fosse un tipo di tecnica "ufficiale" su cui un fantino manuale poteva ricorrere. Presuppone un livello generale di competenza con i computer in generale e unix in particolare.


2

Se il tuo DB è altrimenti silenzioso (cioè non ci sono altri utenti attivi) e vuoi solo vedere l'attività di lettura / scrittura perché non fare semplicemente qualcosa del tipo:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

Vedrai il numero di letture / scritture / inserti / attese / aggiornamenti.

Se stai inserendo ad esempio vedrai qualcosa di simile:

Innodb_rows_inserted                          | 28958 

Dove 28958 è il numero di righe inserite per l'intervallo (10 secondi nel mio caso).


1

Per qualcuno che sta cercando l'esempio del visualizzatore di pipe che usa mysqldumpte, farebbe semplicemente una cosa del genere:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

Il -Wflag dice a pv di attendere che arrivi il primo byte prima di mostrare l'avanzamento (dopo il prompt)


0

È possibile monitorare un'importazione nella cartella \ Msql \ Data [nome DB]


0

Ok, un'altra soluzione. Ma questa potrebbe essere l'opzione peggiore e imprecisa.

Detto questo, ecco la mia soluzione per Windows:

Aprire il Task Manager premendo

CTRL + SHIFT + ESC

Copia la velocità del valore del disco "mysqld.exe"

e.g. 11mb/s

Mettilo in una calcolatrice come questa: https://techinternets.com/copy_calc?do

Stimare l'ETA. Il mio caso era:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

risultati:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

Sono così sorpreso che nessuno abbia appena pubblicato 'mysql -v' come opzione. Se si blocca, l'uscita si arresterà.


3
"Monitorare i progressi" generalmente significa cercare di stimare quanto è progredito il processo o quando verrebbe completato, cosa mysql -vche non offrirà. Inoltre, l'invio di 7 GB di dati al terminale rallenterà notevolmente il ripristino.
Mustaccio,

vedo, grazie per la spiegazione. è vero, l'output di 7 GB non sarebbe buono per l'output nel terminale. immagino che usare -v fosse solo per un piccolo caso di test locale in cui il mio db sarebbe rimasto bloccato.
dtc,

2
Questo suggerimento mi ha aiutato a individuare un problema, per quanto poco pratico potrebbe essere per l'utilizzo con file di grandi dimensioni. (Il mio era piccolo).
Casey Perkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.