Práticas recomendadas para fazer backup de um banco de dados MySQL

23

Descobri recentemente que nossos servidores Web de produção que rodam no MySQL não estão sendo copiados regularmente (ou de todo). Estou acostumado a fazer backup de bancos de dados do SQL Server, mas não tenho muita experiência com os bancos de dados MySQL. Alguma prática recomendada para usar 'mysqldump' ou qualquer outra ferramenta de backup de banco de dados?

Provavelmente, eu agendarei o cronograma da agenda para que seja feito todas as noites e depois faça backup dos arquivos com o meu sistema de backup.

Obrigado.

Valien
fonte

Respostas:

29

Práticas recomendadas para fazer backup do servidor MySQL:

Replicação MySQL

Replicação de instalação no MySQL. Você precisará configurar o servidor Master e Slave. Todas as leituras e gravações no banco de dados podem ir para o seu servidor escravo. A vantagem de ter a replicação é que você pode fazer um backup do servidor escravo sem interromper o servidor mestre. Seu aplicativo continuará funcionando no mestre sem nenhum tempo de inatividade.

Usando o MySQL Dump

Se o seu conjunto de dados é pequeno (eu percebo que "pequeno" é um termo relativo .. para qualificá-lo, digamos <10GB), o mysqldump provavelmente funcionará muito bem. É fácil, está online e é muito flexível. Apenas algumas coisas que o mysqldump pode fazer: faça backup de tudo ou apenas de certos bancos de dados ou tabelas, faça backup apenas do DDL, otimize o dump para uma restauração mais rápida, faça com que o arquivo sql resultante seja mais compatível com outros RDBMSes e muito mais.

No entanto, as opções mais importantes estão relacionadas à consistência do seu backup. Minhas opções favoritas são: - única transação: essa opção fornece um backup consistente, se (e somente se) as tabelas estiverem usando o mecanismo de armazenamento InnoDB. Se você possui alguma tabela MyISAM não somente leitura, não use essa opção ao fazer backup delas. --master-data = 2: essa opção garantirá que seu dump seja consistente (executando um bloqueio de todas as tabelas, a menos que você tenha adicionado a opção - única transação). A opção --master-data também registra a posição do log binário no arquivo de despejo resultante (= 2 faz com que esta linha seja um comentário no arquivo de despejo)

Nota final sobre o mysqldump: lembre-se de que o tempo de restauração pode ser significativamente maior que o tempo de backup. Isso dependerá de vários fatores, por exemplo, quantos índices você possui.

Instantâneo LVM

Para aqueles que possuem conjuntos de dados maiores, um backup físico é o caminho a percorrer. Embora você possa fazer um backup a frio (ou seja, desligar o serviço MySQL, copiar o diretório de dados, reiniciar o serviço), muitas pessoas não desejam tempo de inatividade. Minha solução favorita é instantâneos. Isso pode estar quente (para InnoDB) ou exigir um breve bloqueio (para MyISAM). Não se esqueça de incluir todos os seus dados (inclua os arquivos ib_log). O Lenz fornece um bom utilitário para ajudar com isso: http://www.lenzg.net/mylvmbackup/

Usando o MySQL Enterprise Backup

Vantagens de usar o MySQL Enterprise Backup:

  • Os backups "quentes" de tabelas do InnoDB são totalmente online, sem bloquear o backup apenas de tabelas ou espaços de tabela específicos
  • Faça backup apenas dos dados que foram alterados desde um backup anterior
  • Backup compactado - economiza até 90% de armazenamento e muito mais.

Referência: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html

Peter Venderberghe
fonte
7

Eu recomendaria configurar uma réplica dedicada para usar como backup. Isso permitirá que você execute qualquer tarefa de backup sem afetar o primário. Como isso adiciona complexidade à sua arquitetura, você deseja monitorar o atraso da replicação para garantir que tudo esteja funcionando.

Quanto ao processo real, você tem algumas opções sem ferramentas de terceiros. Os instantâneos podem ser tomadas usando o mysqldumpcomando (supondo que você está usando InnoDB): mysqldump --all-databases --single-transaction > all_databases.sql. Dependendo do tamanho dos dados, pode ser preferível desligar o MySQL e fazer backup dos arquivos de dados diretamente. Quando a réplica é reiniciada, ela repetirá todos os eventos que o primário recebeu na duração em que esteve inativo. Se você estiver usando o MySQL Enterprise, o mysqlbackuputilitário fará isso.

É possível fazer backups incrementais ativando o log binário na réplica. Obviamente, isso registra apenas eventos que modificam dados, portanto, você precisará combinar isso com os instantâneos acima.

Rich Schumacher
fonte
3
+1 para --single-transactionmas não se esqueça de adicionar --events --routinese eu sempre uso --triggerstambém, mesmo que esteja ativado por padrão, pois pode ser desativado no my.cnf. Eu diria que é sempre bom usá-las como prática padrão, se você possui atualmente esses tipos de objetos no banco de dados ou não.
Michael - sqlbot
Nota: mysqldump --all-database pode desencadear erros quando você tem uma configuração baixa de tabelas abertas máxima definida. então fique de olho no seu mysql.log. Replicação seria realmente a melhor maneira de backup
Raymond Nijland
Como, então, você mantém cópias históricas dos dados? (Muitas vezes, um cliente vai querer um mês ou mais de backups mantido, e quando um corrompe bugs aplicativo de dados, os desenvolvedores querem uma cópia do db de antes do bug.)
RonJohn