it-swarm-pt.tech

Backup de um banco de dados MySQL de 22 GB diariamente

No momento, posso fazer o backup usando mysqldump. Mas eu tenho que desligar o servidor web E leva cerca de 5 minutos para fazer o backup. Se eu não desligar o servidor web, demora uma eternidade e nunca termina + o site fica inacessível durante o backup.

Existe uma maneira mais rápida/melhor de fazer backup de meu banco de dados de 22 GB e do crescente banco de dados?

Todas as tabelas são MyISAM.

28
unknown (yahoo)

Sim.

Configure a replicação para uma segunda máquina. Quando precisar fazer um backup, você pode bloquear a máquina secundária, executar mysqlhotcopy ou mysqldump e então desbloqueá-lo. Ele irá recuperar o atraso com seu mestre, e você nunca terá que colocar o mestre offline.

Você pode até fazer isso na mesma máquina, se não se importar em dobrar a E/S de gravação, mas o ideal é fazer backup em tempo real em um segundo servidor físico e fazer backups instantâneos quantas vezes forem necessárias sem perturbar seu servidor de produção.

Também é teoricamente possível restaurar um banco de dados usando um estado conhecido e binlogs. Eu nunca fiz isso, então investigue primeiro, mas você pode fazer backup de um estado conhecido do seu banco de dados e, em seguida, apenas fazer backup de todos os novos binlogs e reproduzi-los se precisar restaurar. Como os binlogs são gravados linearmente, sincronizar novos binlogs com um computador remoto seria muito rápido.

Editar : Na verdade, parece que o uso de logs binários para backup está documentado.

Esta questão é altamente relacionada

28
John Douthat

Perdoe-me por presumir que o sistema operacional é Linux. Se você não está usando o LVM, deveria estar. Se estiver, aqui está uma maneira muito simples de fazer backups via instantâneo.

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

Isso permitirá que você faça backups noturnos sem precisar adicionar um servidor escravo. Sou totalmente a favor de ter um servidor escravo para alta disponibilidade, mas não quero que você pense que ficará preso até que possa criar esse escravo.

5
Bruno Bronosky

FLUSH TABLES COM READ LOCK não é algo que você queira fazer regularmente (ou mesmo semirregularmente) em um sistema de produção. Deve ser apenas o último recurso.

Configure pelo menos dois escravos de replicação (isso exigirá FLUSH TABLES WITH READ LOCK, é claro). Depois de configurados, você pode fazer backup de um enquanto o outro permanece sincronizado como um mestre sobressalente.

Além disso, se um de seus escravos falhar, você pode usar um instantâneo desse para reconstruir um segundo (ou terceiro) escravo. Se todos os seus escravos falharem, você estará de volta a FLUSH TABLES WITH READ LOCK.

Lembre-se de sempre ter um processo que verifica regularmente se os dados estão em sincronia - use algo como mk-table-checksum para fazer isso (isso não é trivial de configurar, consulte a documentação do Maatkit para obter detalhes).

Como 22 GB é relativamente pequeno, você não terá problemas para fazer isso. Fazer isso com um grande banco de dados pode ser mais problemático.

2
MarkR

A solução aqui é dupla, conforme descrito acima:

  1. 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 mysqldump e o parâmetro --master-data.
  2. 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 será iniciada onde foi interrompido).
  3. Execute um script no escravo a cada (por exemplo, 5, 10, 20 minutos) para verificar e certificar-se de que o mysql ainda está replicando. Eu escrevi um simples python script para fazer isso, que você pode usar.

Note que se você estiver usando InnoDB para suas tabelas, você pode usar o sinalizador --single-transaction para evitar ter que fazer qualquer bloqueio de tabela e ainda obter um dump consistente do banco de dados, mesmo no master, 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á obter um instantâneo do LVM da partição e fazer o backup. Os instantâneos do LVM são atômicos, portanto, se você 'liberar tabelas com bloqueio de leitura' e, em seguida, tirar o instantâneo e desbloquear, você obterá um instantâneo consistente.

Se você estiver preocupado com a contenção de E/S fazendo com que o dump demore muito, você pode adicionar uma terceira máquina e executar o mysqldump nela pela rede para evitar danificar seus discos.

1
Dan Udey

Você poderia fazer um backup gradual. Faça backup de 1/24 dos registros a cada hora. O único problema com essa abordagem é se ele travar durante as primeiras horas do dia, você perderá qualquer coisa desde aquele momento até o momento do travamento. De qualquer forma, são menos de 24 horas de registros perdidos (não sei o quão importante isso é para você).

0
musicfreak

Dependendo do seu ambiente, os instantâneos costumam ser uma excelente opção. Principalmente se você precisar fazer backup do mestre por algum motivo. Executamos pares mestre e escravo e usamos backups instantâneos em ambos.

  1. FLUSH TABLES WITH READ LOCK;
  2. Extraia um instantâneo do banco de dados e dos sistemas de arquivos de log.
  3. UNLOCK TABLES;
  4. Copie seus arquivos de dados do instantâneo quando quiser.

Com tabelas InnoDB, você deseja executar SET AUTOCOMMIT=0; antes de executar o bloqueio de leitura.

0
jasonjwwilliams

Dê uma olhada em " Melhor prática para fazer backup de um banco de dados MySQL de produção? ". É uma postagem semelhante no Stack Overflow.

0
Charles Faiga