Obtenha um indicador de progresso ao importar bancos de dados MySQL

21

Geralmente importo 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 do que apenas esperar. Alguém tem alguma ideia?

Eu uso este comando:

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

Os arquivos têm entre 40 e 300 MB e o host está na rede local.

Restabelecer Monica
fonte
@sr_ Eu acho que pvé exatamente o que o pesquisador procura. Acabei de instalar no CentOS via rpmforge. Se dada a dimensão -parameter ele vai mesmo mostrar uma ETA.
Nils
pvfez o truque de fato! Se alguém puder fazer disso uma resposta, eu posso aceitar!
Reintegrar Monica

Respostas:

31

Existe uma boa ferramenta chamada pv

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

# On Redhat/CentOS
$ sudo yum install pv

então, por exemplo, você pode usá-lo assim

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

Verifique a atualização 2 para a minha versão mais recente

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

UPDATE: parece que o link acima está quebrado, mas eu encontrei o mesmo artigo aqui http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html

ATUALIZAÇÃO 2: Solução ainda melhor com a barra de progresso COMPLETA. Para fazer isso, você precisa usar 2 pvopções de compilação . Uma é --progressindicar a barra de progresso e a segunda é --sizedizer pvo tamanho do arquivo geral.

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

..o problema está no .gztamanho do arquivo original. De alguma forma, você precisa obter as informações do tamanho do arquivo original descompactado sem descompactá-lo, caso contrário, perderá um tempo precioso para descompactar esse arquivo duas vezes (primeira pve segunda vez zcat). Mas, felizmente, você tem a gzip -lopção que contém informações não compactadas sobre o arquivo gziped. Infelizmente você o possui no formato de tabela, portanto é necessário 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 tudo.

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 os programas 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%

ATUALIZAÇÃO 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 souber onde colocá-lo, leia esta resposta: /unix//a/106606/20056

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

sobi3ch
fonte
isso é incrível.
dave
11
Um liner com um melhor resultado é este: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 que tão complicado?

Isso funciona bem:

pv dump.sql.gz | zcat | mysql -u user -ppasswd database
Vincent
fonte
Muito mais simples e limpo!
donquixote 13/01
7

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, para que eu saiba que está funcionando.

# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
George M
fonte