Obtenga un indicador de progreso al importar bases de datos MySQL


21

A menudo importo bases de datos MySQL, y esto puede llevar un tiempo. No hay ningún indicador de progreso en absoluto. ¿Se puede mostrar uno, de alguna manera? Registros importados, MB importados o tablas importadas ... cualquier cosa es mejor que solo esperar. Alguien alguna idea?

Yo uso este comando:

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

Los archivos tienen entre 40 y 300 MB, y el host está dentro de la red local.



@sr_ Creo que pves exactamente lo que busca el interlocutor. Lo acabo de instalar en CentOS a través de rpmforge. Si se le da el parámetro de tamaño , incluso mostrará una ETA.
Nils

pvhizo el truco de verdad! Si alguien puede responder esto, ¡puedo aceptarlo!
Vuelva a instalar Mónica

Respuestas:


31

Hay una buena herramienta llamada pv

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

# On Redhat/CentOS
$ sudo yum install pv

entonces, por ejemplo, puedes usarlo así

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

Por favor, consulte la ACTUALIZACIÓN 2 para ver mi última versión

ps: consulte este blog http://blog.larsstrand.org/2011/12/tip-pipe-viewer.html

ACTUALIZACIÓN: parece que el enlace anterior está roto pero encontré el mismo artículo aquí http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

ACTUALIZACIÓN 2: solución aún mejor con la barra de progreso COMPLETA. Para hacerlo, necesitas usar 2 pvopciones de construcción . Una es --progressindicar la barra de progreso y la segunda es --sizeindicar pvqué tan grande es el archivo general.

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

..el problema es con .gzel tamaño del archivo original. De alguna manera, necesita obtener la información del tamaño del archivo original sin descomprimirlo, de lo contrario perderá un tiempo precioso para descomprimir este archivo dos veces (la primera vez pvy la segunda vez zcat). Pero afortunadamente tiene una gzip -lopción que contiene información sin comprimir sobre nuestro archivo gziped. Desafortunadamente, lo tiene en formato de tabla, por lo que debe extraerlo antes de poder usarlo. Todos juntos se pueden ver a continuación:

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

Uff ... así que lo último que debes hacer es combinar todos juntos.

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

Para hacerlo aún mejor, puedes agregar progres NAME como este

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

Resultado final:

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

ACTUALIZACIÓN 3: Para un uso rápido, cree una función personalizada.

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

uso:

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

Si no sabe dónde colocarlo, lea esta respuesta: /unix//a/106606/20056

Puede agregar funciones entre alias. Para que pueda utilizar, por ejemplo, el ~/.bash_aliasesarchivo.


Esto es asombroso.
Dave

1
Un trazador de líneas con un mejor resultado es el siguiente: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

16

¿Por qué tan complicado?

Esto funciona bien:

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

Mucho más simple y limpio!
donquixote

7

Siempre importo bases de datos del shell MySql. No proporciona un indicador de progreso, pero sí (rápidamente) desplaza las acciones que está realizando, así que sé que está funcionando.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.