diffs rolantes para armazenamento de arquivos altamente semelhantes?


15

No trabalho, fazemos um despejo noturno de nossos bancos de dados mysql. Diariamente, gostaria de estimar que cerca de 90-95% dos dados são duplicados, aumentando à medida que o tempo passa. (Heck neste momento alguns são provavelmente 99%)

Esses despejos são onde uma linha é uma única instrução INSERT do mysql; portanto, as únicas diferenças são as linhas inteiras e a ordem em que elas estão no arquivo. Se eu os classificasse, a diferença real de arquivo para arquivo seria muito pequena.

Eu estive procurando e não encontrei nenhuma maneira de classificar a saída no dump. Eu poderia passar através do sortcomando, no entanto. Então haveria longos, longos blocos de linhas idênticas.

Então, eu estou tentando descobrir uma maneira de armazenar apenas as diferenças. Eu poderia começar com um despejo mestre e diferir disso todas as noites. Mas as diferenças seriam maiores a cada noite. Ou, eu poderia fazer diferenças de rolagem, que individualmente seriam muito pequenas, mas parece que levaria mais e mais tempo para calcular, se eu tiver que montar uma comparação mestre de toda a série a cada noite.

Isso é viável? Com quais ferramentas?


Editar Não estou perguntando como fazer backups do mysql. Esqueça o mysql por enquanto. É um arenque vermelho. O que eu quero saber é como fazer uma série de diferenças de rolagem a partir de uma série de arquivos. A cada noite, obtemos um arquivo (que por acaso é um arquivo mysqldump ) 99% semelhante ao arquivo anterior. Sim, nós compactamos todos eles. Mas é redundante ter toda essa redundância em primeiro lugar. Tudo o que realmente preciso é das diferenças da noite anterior ... que são apenas 1% diferentes da noite anterior ... e assim por diante. Então, o que eu estou procurando é como fazer uma série de diferenças, então eu preciso armazenar apenas 1% a cada noite.

Respostas:


12

Duas ferramentas de backup que podem armazenar diffs binários são rdiff-backup e duplicidade . Ambos são baseados librsync, mas acima disso, eles se comportam de maneira bem diferente. O Rdiff-backup armazena as diferenças mais recentes de cópia e reversão, enquanto a duplicidade armazena diferenças incrementais tradicionais. As duas ferramentas também oferecem um conjunto diferente de recursos periféricos.


1
IIUC, rdiff-backup é mais atraente, pois permite navegar normalmente pelo backup, enquanto a duplicidade possui apenas uma cópia antiga.
Tshepang

Eu sei que a pergunta + pergunta é bastante antiga, mas você poderia adicionar um exemplo de comandos mostrando como usá-lo? Por exemplo, para backup201901.tar.gz, backup201902.tar.gz, ..., backup201912.tar.gz, backup202001.tar.gz. Isso seria útil para referência futura.
Basj

11

Ultimamente, tenho tentado armazenar dumps de banco de dados no git. Isso pode ser impraticável se os despejos de banco de dados forem realmente grandes, mas funcionou para bancos de dados pequenos (sites do Wordpress e similares).

Meu script de backup é aproximadamente:

cd /where/I/keep/backups && \
mysqldump > backup.sql && \
git commit -q -m "db dump `date '+%F-%T'`" backup.sql

Isso só armazena diffs?
usar o seguinte comando

2
Sim. É muito conveniente! Você pode "retirar" o arquivo a partir de qualquer ponto no tempo, e o git combinará automaticamente as diferenças para fornecer o arquivo inteiro como ele existia naquele momento.
precisa saber é o seguinte

1
Esta postagem do blog (não a minha) entra em mais detalhes: viget.com/extend/backup-your-database-in-git Os comentários abordam mais os prós e os contras e as advertências. Também acrescentarei que, se você usar o git, terá mais do que apenas poder reverter versões. Você também pode marcar despejos ou ter ramificações separadas (dev / prod). A maneira como vejo isso é o git (ou insira seu sistema de controle de versão moderno favorito) faz um trabalho melhor do que eu, lançando minha própria 'solução' diff / gzip. Um aviso sobre este artigo: não envie seus despejos para o github, a menos que você os queira publicamente (ou esteja pagando por um repo privado).
drench

1
O Git não armazena apenas diferenças. De fato, ele armazena principalmente o instantâneo completo de cada revisão, mas com várias otimizações. Veja esta excelente resposta e sua pergunta
tremby 31/03

1

Você pode fazer algo assim (com a.sqlo backup semanal).

mysqldump > b.sql
diff a.sql b.sql > a1.diff
scp a1.diff backupserver:~/backup/

Seus arquivos diff ficarão maiores até o final da semana.

Minha sugestão, porém, é apenas gzip-lo (use gzip -9para máxima compressão). Fazemos isso no momento e isso fornece um arquivo de 59 MB gz enquanto o original é de 639 MB.


Nós já estamos gzipping eles :)
user394

-3

(Eu não fiz isso na produção.)

Faça um backup completo uma vez por dia ou semana. Os logs de retransmissão de backup uma vez por hora ou dia.


O que é um log de retransmissão?
user394
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.