A solução aqui é dupla, como descrito acima:
- Configure a replicação do seu servidor para um escravo que você pode colocar offline. A melhor maneira de fazer isso é despejar o banco de dados usando o mysqldump e o parâmetro --master-data.
- Configure backups noturnos no escravo. Você pode usar o mysqldump com os sinalizadores --master-data --flush-logs e --single-transaction, ou pode parar o servidor mysql, copiar os arquivos de dados no disco e reiniciá-lo (a replicação continuará onde parou).
- Execute um script no escravo a cada (por exemplo, 5, 10, 20 minutos) para verificar e garantir que o mysql ainda esteja se replicando. Eu escrevi um script python simples para fazer isso, que você pode usar.
Observe que, se você estiver usando o InnoDB para suas tabelas, poderá usar o sinalizador --single-transaction para evitar a necessidade de bloquear qualquer tabela e ainda obter um despejo consistente do banco de dados, mesmo no mestre, e assim fazer seus backups sem derrubando o servidor. A solução acima, no entanto, é melhor.
Além disso, se você estiver usando o LVM no Linux, poderá tirar um instantâneo do LVM da partição e fazer o backup. Os snapshots do LVM são atômicos, portanto, se você 'esvaziar tabelas com bloqueio de leitura' e, em seguida, tirar o snapshot e desbloquear, obterá um snapshot consistente.
Se você está preocupado com a contenção de E / S que faz com que o despejo demore muito, você pode adicionar uma terceira máquina e executar o mysqldump na rede para evitar que seus discos sejam danificados.