Aqui estão dois exemplos do que eu faço: um para arquivos e outro para o MySQL. Ambos são soluções de puxar; sua máquina local efetua login em uma máquina remota e recupera arquivos. No entanto, a máquina local informa a máquina remota para preparar o arquivo.
Configurar & Antecedentes
Eu uso crontab e autenticação sem senha com o ssh para arquivar e gzip em uma máquina remota e então direcionar a saída do gzip para a máquina local através do ssh. Certifique-se de que o crontab e a autenticação sem senha estejam configurados. Eu também tenho alguns one-liners de limpeza.
O benefício disso é que ele usa a largura de banda com mais eficiência. A desvantagem é que é mais intensivo em recursos, embora no hardware moderno eu duvide que isso seja importante, a menos que você esteja lidando com arquivos absurdamente grandes.
Fazendo backup de arquivos e diretórios
Esta é provavelmente a parte que você mais gosta. Diga ao ssh para executar um tar e pipe para gzip na máquina remota . Faça com que o gzip grave o arquivo compactado na saída padrão ( c
flag) e direcione a saída para um arquivo na sua máquina local .
00 00 * * * /usr/bin/ssh login@host "sudo tar -cf - -C /path/to/directory/to/backup/ file_to_back_up | gzip -9c" > /file/on/local/machine/BackUp_$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).tar.gz
Importante: file_to_back_up
é o arquivo que você está realmente fazendo backup; pode ser um arquivo ou diretório. Pode ser uma série de arquivos também: file1.txt, file2.php, etc.
O sinalizador 9
é a compactação máxima de gzip.
Os sinalizadores e parâmetro -cf -
criam um novo arquivo e os transmitem para a saída padrão. O -C
flag diz ao tar para iniciar a partir de um diretório diferente do atual. file_to_back_up pode ser um arquivo ou um diretório. Isso mantém muitos caminhos relativos estranhos fora do arquivo. Se você quiser fazer backup de algo em seu diretório inicial, eu acho que você pode omitir -C /path/to/directory/to/backup/
porque o ssh irá, por padrão, conectá-lo ao seu diretório pessoal.
date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A
gerará um timestamp como 2015-03-19-08h58m09s_Thursday
As colunas crontab 00 00 * * *
significam basicamente meia-noite todos os dias.
Fazendo backup de um banco de dados MySQL
Semelhante ao acima. A ressalva é que você precisa ter certeza de que seu acesso ao mysql também pode ser sem senha; a maneira segura de fazer isso é com arquivos .cnf. Pule esta seção se você não usa o MySQL, mas o conceito pode passar para outras ferramentas.
30 0,13 * * * /usr/bin/ssh [email protected] "mysqldump --defaults-file=.my.database.cnf -uroot databasename | gzip -9c" > /path/to/databasebackup_$(date +\%Y-\%m-\%d-\%Hh\%Mm\%Ss_\%A).sql.gz
O arquivo .cnf contém credenciais de login para que você não precise passá-las pelo shell para que elas apareçam em ps
para que outros usuários possam ver. Deve conter:
[client]
user=mysqluser
password=yourpassword
host=localhost
Dependendo da sua configuração, você pode querer um monte deles para diferentes projetos / bancos de dados. Se você não fizer isso, o arquivo .my.cnf será usado por padrão.
Segurança: você provavelmente quer fazer chmod 600 *.cnf
para que somente o proprietário possa ler e gravar neste arquivo.
Limpeza
Eu tenho a tendência de excluir automaticamente os backups com mais de cinco dias com o comando find
, a menos que eles caiam na sexta-feira. Eu arquivar sexta-feira mais. É por isso que incluo o dia da semana em meus nomes de arquivos.