Falha ao tar arquivo grande com pipe e xargs

1

Eu tentei colocar arquivos de backup mysql como abaixo:

find /data/mysqldata \( ! -name "*mysql-bin*" -a ! -name "*.log" \) |
    xargs tar -zcf /data/backup.tgz

Na verdade, eu executei este comando com Popen e esperei para ler a saída através do método select-poll, no entanto, descobri que às vezes o arquivo de backup se tornava muito pequeno depois de já ser muito grande, reiniciado. Este caso geralmente acontecia quando o arquivo de destino era extremamente grande e eu estava bastante confuso sobre isso.

    
por perse 05.09.2017 / 10:54

2 respostas

4

Usando o GNU tar :

tar -cz -f /data/backup.tgz --exclude '*.log' --exclude 'mysql-bin.*' /data/mysqldata 

O problema que você encontrou foi que xargs execution tar multiple (pelo menos duas) vezes. Na segunda vez em que tar foi executado, o arquivo de backup "encolherá" (será sobrescrito).

Isso é o que o xargs faz. Ele executa um utilitário com tantos argumentos quanto possível, e quando ele recebe mais argumentos (nomes de arquivos no seu caso), corta a lista e continua com a lista em outra chamada do utilitário.

O problema ocorreu porque você enviou todos os diretórios e nomes de arquivos para xargs , gerando uma lista muito longa.

    
por 05.09.2017 / 11:29
1

Canalize a lista de arquivos para o comando de arquivamento diretamente, em vez de usar xargs , o que poderia (e, em alguns casos, você) dividir a lista em várias invocações do arquivador.

Aqui, usando o comando padrão pax , embora com -print0 / -0 extensões não padrão suportadas por algumas para maior confiabilidade:

find /data/mysqldata ! -name "*mysql-bin*" ! -name "*.log" -print0 |
  pax -0wd | gzip > file.tar.gz

(observe também o -d sem o qual todos os arquivos seriam incluídos, já que arquivar /data/mysqldata (que não corresponde a nenhum padrão de exclusão) significaria arquivar tudo como na sua abordagem tar ).

Além de pax , muitas tar implementações suportam a obtenção da lista de arquivos de stdin, mas geralmente com interface diferente entre implementações.

    
por 05.09.2017 / 12:31

Tags