Obtenha um indicador de progresso ao importar bancos de dados MySQL

15

Costumo importar bancos de dados MySQL e isso pode demorar um pouco. Não há nenhum indicador de progresso. Alguém pode ser mostrado, de alguma forma? Registros importados, MB importados ou tabelas importadas ... qualquer coisa é melhor que apenas esperar. Alguém tem alguma ideia?

Eu uso este comando:

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

Os arquivos estão entre 40 e 300 MB e o host está na rede local.

    
por user 18.04.2012 / 17:23

3 respostas

24

Existe uma boa ferramenta chamada pv

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

# On Redhat/CentOS
$ sudo yum install pv

depois você pode usá-lo assim

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

Please check UPDATE 2 for my latest version

ps: consulte este link

UPDATE: parece que o link acima está quebrado, mas encontrei o mesmo artigo aqui link

UPDATE 2: solução ainda melhor com a barra de progresso FULL. Para fazer isso, você precisa usar 2 build in pv options. Uma é --progress para indicar a barra de progresso e a segunda é --size para informar a pv quão grande é o arquivo geral.

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

.. o problema é com .gz tamanho original do arquivo. Você precisa de alguma forma obter informações sobre o tamanho do arquivo original descompactado sem descompactá-lo, caso contrário, você perderá um tempo precioso para descompactar este arquivo duas vezes (primeira vez para pv e segunda vez para zcat ). Mas, felizmente, você tem a opção gzip -l que contém informações descompactadas sobre nosso arquivo gziped. Infelizmente você o tem em formato de tabela, então você precisa extrair antes de poder usá-lo. Todos juntos podem ser vistos abaixo:

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

Uff .. então a última coisa que você precisa fazer é apenas 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 torná-lo ainda melhor, você pode adicionar NOME de progres 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%

UPDATE 3: Para uso rápido, crie uma função 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

Se você não sabe onde colocá-lo, leia esta resposta: link

Você pode adicionar funções entre aliases. Então você pode usar por exemplo ~/.bash_aliases file.

    
por 20.06.2012 / 17:43
9

Por que tão complicado?

Isso funciona bem:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database
    
por 12.09.2016 / 16:49
6

Eu sempre importo bancos de dados do shell MySql. Ele não fornece um indicador de progresso, mas rola (rapidamente) as ações que está executando, então sei que está funcionando.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
    
por 18.04.2012 / 18:08

Tags