Arquivos - BackupCriei 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.