Ottieni un indicatore di avanzamento durante l'importazione di database MySQL


21

Importa spesso database MySQL e questo può richiedere del tempo. Non esiste alcun indicatore di progresso. Uno può essere mostrato, in qualche modo? O record importati, MB importati o tabelle importate ... tutto è meglio di una semplice attesa. Qualcuno ha idea?

Io uso questo comando:

mysql -uuser -p -hhost database < largefile.sql

I file sono compresi tra 40 e 300 MB e l'host si trova all'interno della rete locale.



@sr_ Penso che pvsia esattamente ciò che cerca l'interrogante. L'ho appena installato su CentOS tramite rpmforge. Se dato il parametro size - size mostrerà anche un ETA.
Nils,

pvfatto davvero il trucco! Se qualcuno può farne una risposta, posso accettarlo!
Ripristina Monica il

Risposte:


31

C'è un bel strumento chiamato pv

# On Ubuntu/Debian system
$ sudo apt-get install pv

# On Redhat/CentOS
$ sudo yum install pv

allora ad es. puoi usarlo in questo modo

$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname

Controlla UPDATE 2 per la mia ultima versione

ps: controlla questo blog http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

AGGIORNAMENTO: sembra che il link sopra sia rotto ma ho trovato lo stesso articolo qui http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

AGGIORNAMENTO 2: soluzione ancora migliore con barra di avanzamento COMPLETA. Per farlo è necessario utilizzare 2 pvopzioni integrate. Uno è --progressquello di indicare la barra di avanzamento e il secondo è --sizedi dire pvquanto è grande il file complessivo.

pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES

..il problema è con la .gzdimensione del file originale. In qualche modo è necessario ottenere le informazioni sulla dimensione del file originale decompresso senza decomprimerlo autonomamente, altrimenti si perderà tempo prezioso per decomprimere questo file due volte (prima volta per pve seconda volta per zcat). Ma per fortuna hai gzip -lun'opzione che contiene informazioni non compresse sul nostro file gziped. Purtroppo lo hai in formato tabella, quindi devi estrarlo prima che possa essere usato. Tutti insieme possono essere visti sotto:

gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'

Uff ... quindi l'ultima cosa che devi fare è combinare tutti insieme.

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname

Per renderlo ancora più bello puoi aggiungere progressi NAME in questo modo

zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass dbname

Risultato finale:

Importing.. : [===========================================>] 100%

AGGIORNAMENTO 3: per un utilizzo rapido, creare una funzione personalizzata.

mysql_import() {
  zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name '  Importing.. ' | mysql -uuser -ppass $1
}

utilizzo:

mysql_import dbname /path/to/our/database.sql.gz

Se non sai dove metterlo, leggi questa risposta: /unix//a/106606/20056

È possibile aggiungere funzioni tra gli alias. Quindi puoi usare ad esempio il ~/.bash_aliasesfile.


Questo e spettacolare.
dave,

1
Una fodera con un risultato migliore è questa può essere questa:pv --progress --name 'DB Import in progress' -tea /path/to/our/database.sql.gz | zcat | mysql -h db_host -u db_user -pdb_password db_name
Denis Pitzalis il

16

Perché così complicato?

Funziona bene:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database

Molto più semplice e pulito!
donquixote

7

Importo sempre database dalla shell MySql. Non fornisce un indicatore di avanzamento, ma scorre (rapidamente) le azioni che sta eseguendo, quindi so che funziona.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
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.