Desejo fazer backup do meu site que contém imagens carregadas pelo usuário e dados armazenados no banco de dados MySQL, de modo que sejam sempre consistentes entre si em qualquer ponto específico do tempo. Enquanto procurava soluções, encontrei este rsnapshot de aplicativo que pode ser apropriado para a tarefa. Tendo passado por alguns blogs na internet, percebi que isso é realmente feito com um backup_script usando o método mysqldump:
backup_script ssh [email protected] "mysqldump -A > /var/db/dump/mysql.sql" unused2
backup [email protected]:/var/db/dump/ example.com/
O que não tenho certeza é se há necessidade de liberar todas as tabelas com bloqueio de leitura antes de executar o dump no script para garantir a consistência do banco de dados. Em caso afirmativo, como isso deve ser incorporado? Se não, por que não é necessário?
Por padrão, o uso de
mysqldump
bloqueará cada tabela à medida que a despeja e não haverá consistência entre as tabelas. Você também não obterá nenhum backup de gatilhos, procedimentos armazenados, funções armazenadas ou eventos e, se qualquer uma das definições de exibição for inválida (referindo-se a tabelas ou colunas inexistentes que você pode ter descartado ou renomeado desde que a exibição foi definida), o dump processo terminará quando esse erro for encontrado.Se todas as suas tabelas forem InnoDB, você pode obter um instantâneo consistente adicionando isto:
Esta opção desativa o padrão
--lock-tables
que bloqueia cada tabela à medida que ela é despejada e, em seguida, a desbloqueia quando termina de despejá-la e, em vez disso, emite as seguintes instruções para o servidor no início do despejo (que você pode observar ativando o log de consulta geral):Claro, isso só ajuda com o InnoDB. Se suas tabelas são MyISAM ou qualquer outro mecanismo não transacional, você só tem uma opção:
...que bloqueia todas as tabelas para todo o despejo, já que é a única maneira de garantir consistência sem transações para auxiliar.
Para fazer backup de seus procedimentos armazenados, eventos e gatilhos, adicione:
Para evitar
mysqldump
falhas quando há uma definição de visualização inválidaPara capturar sua posição binlog e armazená-la no arquivo de backup, adicione:
Esta opção não funciona se sua máquina não for escrava.
Sua pergunta era sobre fazer backup do banco de dados "com rsnapshot", embora, para colocar um ponto final, você está propondo fazer backup do banco de dados com mysqldump e, em seguida, fazer backup do dumpfile com rsnapshot ... É difícil dizer com uma breve olhada em seu site se essa será uma boa escolha, porque o rsnapshot parece ter granularidade no nível do arquivo. Ele não parece armazenar diferenças, mas armazena arquivos completos para "cada" arquivo que muda entre os ciclos de backup:
Aceito correção se eu estiver errado neste ponto. Neste caso, você tem apenas 1 arquivo, seu arquivo de despejo do mysqldump, que obviamente mudará toda vez.
Faça o que fizer, não pense em tentar fazer backup dos arquivos reais (.frm, .ibd, .MYD, etc.) subjacentes às suas tabelas no MySQL. Isso não funciona com o servidor em execução, embora em raras condições você possa obter um backup que pareça estar intacto. Não é.
Atualizar:
Há uma distinção importante entre o que o mylvmbackup está fazendo e "fazer backup dos arquivos reais". Para usar mylvmbackup, você deve usar LVM , que pode ser visualizado como uma camada de abstração entre seu sistema de arquivos e seu disco rígido. Com o LVM, você tem a capacidade de congelar o sistema de arquivos e fazer um instantâneo pontual de todo o sistema de arquivos.
Parece que mylvmbackup está fazendo um
FLUSH TABLES
seguido por umFLUSH TABLES WITH READ LOCK
antes de procurar as coordenadas de replicação (se especificado na configuração), que é o mesmo processo que mysqldump faz quando--single-transaction
e--master-data
são usados. Isso estabiliza o MySQL, mas não desativa totalmente o InnoDB;Se os arquivos de dados do seu site estivessem no mesmo sistema de arquivos, então um instantâneo LVM conteria tudo consistente para um único ponto no tempo, mas se ter seus outros arquivos do site no mesmo sistema de arquivos do banco de dados é uma boa prática (se, de fato, executar seu servidor web no mesmo servidor é uma boa prática) é outra discussão.
Seja qual for a abordagem, é de vital importância em qualquer estratégia de backup verificar periodicamente se seus backups podem realmente ser restaurados (em uma máquina diferente). O método verdadeiramente mais seguro seria ter certeza
innodb_fast_shutdown
= 0 e realmente desligar o MySQL, mas isso provavelmente não é prático.Claro, se você quiser com algo como rsnapshot, você sempre pode capturar os arquivos do site, depois capturar o banco de dados e, em seguida, capturar os arquivos do site novamente. Se nada mudar nos arquivos do site durante o backup do banco de dados, o rsnapshot usará muito pouco espaço para a segunda execução. Se as coisas mudarem, deve ser bastante trivial entender as diferenças se você precisar se recuperar.