Realizando backup de arquivos em servidores Linux
Criei um conjunto de scripts para facilitar a realização de backup de arquivos de servidores Linux. A idéia é a de agendar o backup no agendador de tarefas do Linux (cron) para ser executado periodicamente. O backup é feito localmente em uma pasta predefinida e uma cópia é enviada para um servidor de backup Linux, através de uma conexão SSH com relação de confiança. O script mantém o backup local dos últimos dias, semanas ou meses, de acordo com sua configuração.
Nos servidores que administro sempre configuro um backup mensal ou semanal de toda a pasta /etc, que é onde é mantida as principais configurações do servidor. Além disso, se o servidor executa algum serviço web, também configuro o backup periódico da pasta /var/www (ou a equivalente para a sua instalação/disribuição). Para as demais pastas executo o backup conforme o serviço em execução. Não costumo realizar o backup da instalação completa do Linux pois, acredito que em caso de necessidade de se restaurar o servidor como um todo, o ideal é a reinstalação da distribuição Linux em sua versão mais recente.
Este tutorial apresenta os scripts para backup de arquivos e também como configurá-los em seu servidor Linux. Ele faz parte da série de tutoriais sobre Backup de servidores Linux.
Pré-Requisitos
- Configuração de relação de confiança SSH entre o servidor que será copiado e o servidor que receberá os backups. Leia meu artigo sobre como configurar a relação de confiança SSH entre servidores Linux.
- Usuário com privilégios suficientes de leitura nas pastas a serem copiadas para o servidor de backups. Muitas vezes esse usuário é o root.
Tutorial
Costumo salvar meus scripts em /usr/local/scripts/. Provavelmente será necessário criar a pasta scripts (mkdir /usr/local/scripts).
Salve o script abaixo com o nome backup_pastas.sh na pasta /usr/local/scripts:
###################################################################
# backup_pastas.sh
#
# Desenvolvido por: Nerd
# Data: 27-set-2010
# Objetivo: Realiza backup de uma pasta informada
# Funcionamento:
# - Comprime a pasta e salva em pasta local
# - Faz copia via scp para máquina remota
# Parâmetros:
# <Pasta a ser realizado backup> <Label do backup> <Label de tempo> \
# <Pasta para o backup local> <Pasta para o backup remoto> \
# <Usuario remoto> <Host remoto>
#
# (c) Blog do Nerd 2010
###################################################################
#!/bin/bash
local_data=$1
label1=$2
label2=$3
backup_folder=$4
remote_folder=$5
remote_user=$6
remote_host=$7
if [ ! ${remote_host} ]; then
echo "Uso: "
echo "$0 <Pasta a ser realizado backup> <Label do backup> <Label de tempo> <Pasta para o backup local> <Pasta para o backup remoto> <Usuario remoto> <Host remoto> "
exit 1
fi
backup_file="${backup_folder}/${hostname}_${label1}_backup_${label2}"
date=$(date)
echo "-----------------------------------------------------------------------"
echo "${date}: ${backup_file} - ${hostname} - Inicio do Backup!"
tar -czf ${backup_file}.tar.gz ${local_data}
scp ${backup_file}.tar.gz ${remote_user}@${remote_host}:${remote_folder}
date=$(date +%Y-%m-%d)
cp ${backup_file}.tar.gz ${backup_file}_${date}.tar.gz
date=$(date)
echo "${date}: ${backup_file} - ${hostname} - Backup realizado!"
echo "-----------------------------------------------------------------------"
exit 0
Este script recebe vários parâmetros e faz o seguinte:
- Comprime a pasta informada e salva o conteúdo comprimido em uma pasta de backup local
- Copia o arquivo comprimido para uma máquina remota utilizando scp. É estritamente necessário a utilização de relação de confiança entre a máquina local e a máquina remota que receberá o backup.
- Copia o arquivo local incluindo a data atual no nome. Isto é feito para manter backups periódicos (diários, semanais, mensais) na máquina local.
É interessante manter uma cópia local dos backups dos últimos dias ou semanas, pois em caso de ocorrer a corrupção de informações, estes arquivos poderão ser utilizados. Se algo grave acontecer, sendo necessário a restauração completa de um backup, a utilização do backup mais recente é a melhor alternativa. Com o script a cópia mais recente estará armazenado na máquina remota.
Para chamar este script e definir as pastas que serão copiadas, bem como definir os backups que serão mantidos localmente, vamos utilizar outro script.
Salve o script abaixo na pasta /usr/local/scripts com o nome backup_diario.sh:
###################################################################
# backup_diario.sh
#
# Desenvolvido por: Nerd
# Data: 27-set-2010
# Objetivo: Realiza backup diario de arquivos do sistema (Mysql, SVN, arquivos)
# Funcionamento: - Realiza backup de pastas localmente e remotamente
# Parametros: [Rótulo do backup] - opcional
#
# (c) Blog do Nerd 2010
###################################################################
#!/bin/bash
label=$1
if [ ! ${label} ]; then
label="diario"
fi
random_log="/tmp/$RANDOM"
# Altere as variáveis abaixo para sua realidade
pasta_backup_local="/backup"
pasta_backup_remoto="/backup/${hostname}"
usuario_backup="backup"
servidor_backup="servbackup"
arquivo_log="/var/log/backup.log"
email="backup@dominio.com.br"
# Altere as variáveis acima para sua realidade
# Ajuste as chamadas abaixo para sua realidade
/bin/sh /usr/local/scripts/backup_dados.sh /etc etc ${label} ${pasta_backup_local} ${pasta_backup_remoto} ${usuario_backup} ${servidor_backup} > ${random_log} 2>&1
/bin/sh /usr/local/scripts/backup_dados.sh /var/www www ${label} ${pasta_backup_local} ${pasta_backup_remoto} ${usuario_backup} ${servidor_backup} > ${random_log} 2>&1
# Ajuste as chamadas acima para sua realidade
# Mantém backup diario dos últimos 7 dias.
find {pasta_backup_local} -name "*diario*" -type f -atime +6 -exec rm "{}" \;>> ${random_log} 2>&1
# Mantém backup semanal dos últimos 90 dias.
find {pasta_backup_local} -name "*semanal*" -type f -atime +90 -exec rm "{}" \; >> ${random_log} 2>&1
cat ${random_log} >> ${arquivo_log}
/bin/mail -s "[Backup Diário] $hostname" ${email} < ${random_log}
rm -f ${random_log}
exit 0
Altere o valor das variáveis abaixo, de forma a refletir sua realidade:
- pasta_backup_local - Pasta local que receberá uma cópia do backup
- pasta_backup_remoto - Pasta no servidor remoto, que receberá o backup
- usuario_backup - Usuário no servidor remoto que receberá o backup. É estritamente necessário a existencia de relação de confiança SSH entre o usuário local e o usuário configurado nesta variável
- servidor_backup - Nome DNS ou IP do servidor remoto que receberá o backup
- arquivo_log - Arquivo local que receberá o log do backup
- email - Endereço de e-mail que receberá uma cópia do log de execução do backup local
No script acima existem duas chamadas para o script de backup (/usr/local/scripts/backup_dados.sh). A primeira é para executar o backup da pasta /etc e adicionar o rótulo etc no nome do arquivo de backup. A segunda linha executa o backup da pasta /var/www e adiciona o rótulo www no nome do arquivo de backup.
Altere ou inclua mais pastas as quais deseja realizar backups.
Agende o script /usr/local/scripts/backup_diario.sh no agendador de tarefas da máquina local. Para isso, execute cron -e e inclua uma linha semelhante a seguinte:
15 3 * * * /bin/sh /usr/local/scripts/backup_diario.sh
A sintaxe das entradas no cron é a seguinte:
[minuto] [hora] [dia do mês] [mês] [dia da semana, domingo=0] [programa a ser executado]
Sendo que o caracter * simboliza qualquer valor. Desta forma a entrada no cron que criamos indica que será executado o backup diário todos os dias as 03:15 da manhã.
O script backup_local.sh irá manter na pasta de backup local uma cópia dos backups diários realizados nos últimos 7 dias e uma cópia dos backus semanais realizados nos últimos 90 dias.
Para agendar a execução de backups semanais, utilize o parametro semanal na chamado do script backup_local.sh. Um entrada cron semelhante a esta deverá ser utilizada:
40 3 * * 6 /bin/sh /usr/local/scripts/backup_diario.sh semanal
Com esta entrada no cron, será realizado um backup semanal todo sábado (6) às 03:40 da manhã. Ajuste a chamada conforme sua necessidade.
Espero que o artigo tenha sido útil. Qualquer dúvida, sugestão ou relato de erros é só postar nos comentários.



Otimo script, so não entendi sobre as pastas a serem feitas backup. o script vai solicitar ao usuario que as insira ou deve ser colocado o caminho do diretorio? em qual parte? abraços!