Eu faço em tais casos quando é necessário acesso rápido ao conteúdo de backup - backup incremental usando a opção rsync
with --link-dest=
.
Ele roda muito rápido, não afeta as cópias de backup anteriores que você pode ter quantas desejar e o backup não ocupa muito espaço, pois as cópias de backup são links físicos para arquivos existentes. Nesse caso, o acesso ao backup é instantâneo e a transferência real de arquivos leva alguns segundos, mesmo em uma quantidade enorme de arquivos, já que rsync
copiou apenas arquivos novos.
#!/bin/sh
srcDir='/importunt/data' # Use full path
bkpDir='/backups' # Use full path
cd "${bkpDir}"
previousDir="$(ls -td -- */ | head -n 1 | awk -F'/' '{print $1}')" # Get most newest directory
currentDir="$(date '+%Y-%m-%dT%H;%M;%S')"
[ -n "${previousDir}" ] && {
rsync_opts="-aPvz --safe-links --link-dest=${bkpDir}/${previousDir} --exclude=*.mp3"
} || {
rsync_opts="-aPvz --safe-links --exclude=*.mp3"
}
mkdir -m 770 "${currentDir}"
rsync ${rsync_opts} "${srcDir}" "${bkpDir}"/"${currentDir}"
Basicamente, essa solução cria instantâneos exatos no tempo, portanto a restauração de arquivos é bem fácil.
Não seja assustador se você usar du
no diretório /backups
quando ele mostrar um tamanho crescente em cada atualização, se você usar df
, verá que o espaço real não é reduzido. É assim que os hard links contavam com o Linux e o FreeBSD, então não se preocupe. Para ter certeza de que não menti, você pode verificar o inode em algum arquivo em backup incremental com ls -i file
. Você verá que o mesmo arquivo em todos os diretórios tem o mesmo inode, o que significa rsync
duplicado apenas nomes de arquivos com links físicos, mas todos eles apontando para o mesmo conteúdo.
Mais uma vantagem deste método é que você pode excluir os diretórios de backup mais antigos em qualquer ordem, - mais recente, intermediária ou mais antiga.
O script acima é um exemplo simplificado. Se o conteúdo do backup incremental deve ser editado, não use o mecanismo ls -t
para detectar o diretório anterior mais novo no backup, mas salve ${currentDir}
em algum arquivo e restaure para ${previousDir}
na chamada subsequente.
Como rsync
suporta transferência acima de ssh
, você pode mover o backup incremental para a máquina remota com a mesma eficiência, as únicas alterações serão sincronizadas.