weekly-backup - backup agendado
Publicado por Pedro Fernandes (última atualização em 12/01/2022)
[ Hits: 1.375 ]
Homepage: https://github.com/PedroF37
Download 1640474098.weekly-backup (versão 2)
Script usa a ferramenta tar com a opção '-g', ou '--listed-incremental', para fazer 4 backups por mês os quais são:
1 backup completo uma vez no mês.
3 backups diferenciais nas restantes três semana (1 por semana!).
A opção -g do tar, cria um arquivo de snapshot com os metadados dos itens que estão no arquivamento.
Se usarmos sempre o mesmo arquivo como referência, esse arquivo vai sendo atualizado e cria backups incrementais
ao invés de diferenciais.
Mas, se em cada novo backup, copiarmos sempre o arquivo de snapshot original, e usarmos sempre a cópia do original,
então, as diferenças que vão constar, são as diferenças entre 'hoje' e o dia do primeiro backup (o backup completo).
É o que o script faz.
Antes de usar o script, por favor leia o cabeçalho todo do script.
Versão 2 - Enviado por Pedro Fernandes em 25/12/2021
Changelog: Script corrigido e escrito quase do zero, porque a aritmética com as datas (que no script original era o meio de saber se era ou não hora de fazer um backup completo), estava totalmente errada.
O script da forma como estava nunca fazia backup diferencial, fazia sempre backup completo.
Agora script vê se é ou não hora de fazer backup completo, simplesmente contando quantos "DiffBackups..." é que existem na pasta e se existirem 3 ou mais, então o script cria novamente o backup completo e começa do zero.
Download 1640474098.weekly-backup
#!/bin/bash # ########################################################### # # SCRIPT weekly-backup # AUTOR Pedro Fernandes # EMAIL pedrobfernandes37@gmail.com # DATA 17-05-2021 # # --------------------------------------------------------- # # DESCRIÇÃO: # # Script para fazer backups semanais, usando a ferramenta # tar. Scripts serão 1 backup completo (nível 0) por mês, # e os restantes serão backups diferenciais (nível 1) por # semana. # # --------------------------------------------------------- # # FUNCIONAMENTO: # # O script usa a opção '-g' do tar, para criar arquivo de # snapshot, com os metadados dos itens incluidos no backup. # Se usarmos sempre esse mesmo arquivo como referência o # tar cria backups incrementais, porque a cada backup esse # arquivo é atualizado. Mas, se em cada novo backup, nós # fizermos uma cópia do arquivo original, e usarmos sempre # uma cópia, então o backup vai conter as diferenças entre # o dia atual e o dia do primeiro backup (o backup completo) # É isso que o script faz. # # Atenção que script manda muito output, então se for # por em crons e coisas dessas, não se esqueça de redirecionar # as saídas e erros ok!! # # --------------------------------------------------------- # # PROCEDIMENTO: # # O script usa três variáveis, cada uma que retorna uma # data: # # -DateBackup -> esta tem a data de 'hoje' # -NextWeek -> esta tem a data da próxima semana # -LastMonth -> esta tem a data do próximo mês # # ************************************************** # # Com elas (variáveis) o script faz o seguinte: # # 1. Verifica se existe algum arquivo 'FullBackup*.snar' # (.snar é a extensão do arquivo de snapshot). # # 2. Se não houver, o script cria um backup completo (Full) # e o arquivo de snapshot correspondente. O arquivo chama-se: # 'FullBackup-${DateBackup}.snar' # # 3. Se houver, o script usa a data no nome do arquivo, e # compara com a data retornada pela variável LastMonth, # que tem a data do mês passado, e vê se passou um mês # ou mais. # # 4. Se tiver passado, o script cria uma pasta # onde coloca todos os arquivos .snar e .t[gbx]z, e # então começa de novo. Ou seja, cria o backup completo # e seu arquivo de snapshot correspondente. # # 5. Se não tiver passado, então o script faz uma cópia # do arquivo de snapshot original e usa essa cópia para # fazer o backup diferencial. A cópia chama-se: # 'DiffBackup-${DateBackup}-to-${NextWeek}.snar' # # --------------------------------------------------------- # # NOTAS: # # O script usa três variáveis que é para você configurar: # # 1. Compact - nesta variável, você diz se quer usar # gzip, bzip, ou xz. São estes mesmos nomes, # ou seja, você não coloca gz em vez de gzip # nem bzip2 em vez de bzip. O script usa o # case para ver qual está configurado mas, não # fiz 'or' nenhum do tipo 'gzip | gz)', então se # não tiver estes nomes vai dar erro. # # 2. BackupDestiny - nesta você especifica o diretório # para os backups. (Caminho Absoluto) # Você tem que criar o diretório ok? # O script não cria para você!! # Exemplo: # # BackupDestiny=/archive/pedro # # 3. ConfigFile - nesta você coloca o nome do arquivo com # os itens para backup. O arquivo você põe # o caminho absoluto e os itens para backup # a mesma coisa. Exemplo: # # ConfigFile=/home/pedro/BackupList.txt # # Formato do arquivo: # # /home/pedro/Documentos # /home/pedro/MEGAsync # etc etc.. # ########################################################### # ##### PARÂMETROS # ### Você configura aqui # Compact= ConfigFile= BackupDestiny= # ### Daqui em diante não precisa ### mexer mais ok? # DateBackup=$(date +%d-%m-%Y) NextWeek=$(date -d "next week" +%d-%m-%Y) LastMonth=$(date -d "last month" +%d-%m-%Y) FullSnapshot=FullBackup-${DateBackup}.snar DiffSnapshot=DiffBackup-${DateBackup}-to-${NextWeek}.snar # ########################################################### # ##### FUNÇÃO PARA MENSAGENS DE ERRO # function ErrorExit { # echo echo "$@" >&2 echo Terminando script... >&2 exit 1 } # ########################################################### # ##### VERIFICAÇÕES # # Verificamos por existência de diretório, arquivo de # configuração, permissões, etc... # [ -z "$BackupDestiny" ] && { ErrorExit 'Não especificou pasta de destino dos backups.' } # [ ! -d "$BackupDestiny" ] && { ErrorExit "Pasta $BackupDestiny não existe." } # [ ! -r "$BackupDestiny" ] || [ ! -w "$BackupDestiny" ] || [ ! -x "$BackupDestiny" ] && { ErrorExit "Precisa de ter permissão para a pasta $BackupDestiny" } # [ -z "$ConfigFile" ] && { ErrorExit 'Não especificou arquivo com lista de itens para fazer backup.' } # [ ! -f "$ConfigFile" ] && { ErrorExit "$ConfigFile não existe ou não e arquivo regular." } # [ ! -r "$ConfigFile" ] || [ ! -s "$ConfigFile" ] && { ErrorExit "Não tem permissão de leitura para $ConfigFile ou arquivo está vazio." } # if [ -z "$Compact" ] then ErrorExit "Não especificou o método de compactação" else case $Compact in # gzip) Comp=-czf OutFullArchive=FullBackup-${DateBackup}.tgz OutDiffArchive=DiffBackup-${DateBackup}.tgz ;; bzip) Comp=-cjf OutFullArchive=FullBackup-${DateBackup}.tbz OutDiffArchive=DiffBackup-${DateBackup}.tbz ;; xz) Comp=-cJf OutFullArchive=FullBackup-${DateBackup}.txz OutDiffArchive=DiffBackup-${DateBackup}.txz ;; *) ErrorExit "Input Inválido" # esac fi # ########################################################### # ##### LISTA DE ITENS PARA BACKUP # echo Compondo lista de itens para backup. # # Lê o arquivo de configuração. Entada padrão é # ConfigFile. Line, vai guardando as linhas lidas # até ao momento, para falar em que linha está # o item inexistente, ou, o item ao qual usuário # não tem permissão. # exec 3<&0 exec 0<$ConfigFile Line=1 read Item # while [ $? -eq 0 ] do if [ -f "$Item" ] || [ -d "$Item" ] then # # Vemos se tem permissão. Ou é dono # ou é root. Se tiver permissão ok, # se não, saímos do script. # if [ -O "$Item" ] || [ $UID -eq 0 ] then : else echo echo '############################################################' echo echo Você não tem permissão para Item ${Item##*/} >&2 echo especificado na linha $Line de ${ConfigFile##*/} >&2 echo Terminando script... >&2 echo echo '###########################################################' exit 1 fi # # Juntamos itens em lista. # BackupList="$BackupList $Item" else # # Se não existir o Item, simplesmente # avisamos sem sair com erro. Usuário # pode ter deletado arquivo/diretório e # simplesmente esqueceu de atualizar # ConfigFile. # echo echo '##############################################################' echo echo O Item ${Item##*/} não existe. echo Está especificado na linha $Line de ${ConfigFile##*/}. echo Não iremos incluir no backup. Prosseguindo... echo echo '##############################################################' fi # Line=$(($Line + 1)) read Item done exec 0<&3 # echo echo Composição de lista concluída. echo # ########################################################### # ##### BACKUP # # Primeiro tentamos entrar em diretório # cd $BackupDestiny || { ErrorExit "Não conseguimos entrar em $BackupDestiny" } # # OK? Vamos ver se tem arquivo de snapshot. Se não # tiver, criamos um Full. Se tiver, temos que descobrir # se já passou um mês ou não. Se tiver passado um mês, # criamos pasta para armazenar o backup full e os # diferenciais e então começamos tudo de novo. # Criamos o backup Full e o snapshot Full, na semana # seguinte cria os diferenciais etc etc. # Match=$(ls FullBackup*.snar 2> /dev/null) # if [ -z "$Match" ] then echo echo Iniciando backup... tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null else # Expired=$(echo "$LastMonth" | sed 's/-//g') OutOfDate=$(echo "$Match" | cut -d '-' -f 2-4 | \ cut -d '.' -f 1 | sed 's/-//g') # if [ "$Expired" -ge "$OutOfDate" ] then mkdir Backup-$LastMonth mv *.snar *.t[gbx]z Backup-$LastMonth echo echo Iniciando backup... tar -g $FullSnapshot $Comp $OutFullArchive $BackupList 2> /dev/null else cp "$FullSnapshot" "$DiffSnapshot" echo echo Iniciando backup... tar -g $DiffSnapshot $Comp $OutDiffArchive $BackupList 2> /dev/null fi fi # echo Backup concluido.... echo Terminando script... exit 0 # ###########################################################
Backup dinâmico de banco de dados MySQL
Backup Máquina do Tempo com Rsync
Script de backup dos hosts do Zabbix
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Erro ao abrir interface gráfica do Kali linux (0)
É cada coisa que me aparece! - não é só 3% (8)
A impressora não imprimi no win10 (4)