Como faço backup de um banco de dados mysql, mas com baixa prioridade?

15

Eu quero fazer backup de um banco de dados, mas durante o dia, quando há carga no servidor. É vital que o backup não afete o apache e outros bancos de dados em execução no mesmo servidor.

Deve ser possível usar o comando mysqldump , mas execute o comando em baixa prioridade.

Como posso fazer isso?

Atualização: Parece que simplesmente usar o nice com o mysqldump não funciona desde que o mysqldump gera um novo processo.

    
por andyuk 15.12.2009 / 12:36

8 respostas

8

Se você tiver um servidor sobressalente ao redor que possa lidar com a carga de gravação do servidor, poderá configurar a replicação para esse servidor e, em seguida, fazer o backup a partir do servidor escravo. Isso também tem a vantagem de ser possível interromper a replicação enquanto você faz o backup e obter um instantâneo consistente de seus dados em todos os bancos de dados ou em todas as tabelas em um banco de dados sem afetar o servidor de banco de dados. Esta é a configuração que eu sempre recomendo para fazer o backup do MySQL se você tiver os recursos.

Como um bom bônus, agora você tem um escravo somente leitura que pode ser usado para consultas demoradas e demoradas.

    
por 15.12.2009 / 13:49
14

Andy, até agora eu estou supondo que você teve muito tempo para encontrar uma solução. Recentemente, apresentei uma solução para isso, que está funcionando muito bem para mim em tsheets e imaginei compartilhá-lo.

cstream é uma ferramenta de gerenciamento de fluxo de propósito geral como o UNIX dd, normalmente usado em tubos construídos em linha de comando. O que torna o cstream útil para nós é que ele permite que você especifique a largura de banda máxima para todas as entradas. Isto significa que você pode limitar o disco IO do seu comando mysqldump com um comando simples como este:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

Supondo que você esteja fazendo o backup de um banco de dados que usa todas as tabelas InnoDB, o comando acima é seguro (não afetará outras consultas) e fará seu mysqldump limitando suas leituras de disco a apenas um megabyte por segundo. Ajuste a largura de banda com o parâmetro -t para qualquer valor que permita que seu ambiente realize o backup sem afetar a experiência do cliente.

    
por 20.09.2011 / 02:05
4

FWIW você também deve ser capaz de fazer isso com pv ( link )

mysqldump --single-transaction --quick -u -p | pv --rate-limit 1m > destino (ou | nc ou | tar cfj backup.bz2 -)

O bom disso são as várias opções para monitorar o progresso e a opção -R, que permite que você passe opções para um processo já em execução, por exemplo; --rate-limit para alterar a taxa de transferência.

    
por 19.04.2013 / 05:54
1

se você usar innodb, você pode tentar xtrabackup com o --throttle option .

você também pode olhar para ionice e executar o mysqldump com ele.

ou talvez você queira habilitar o log binário no mysql e executar o despejo completo uma vez por semana / noite, enquanto copia bin-logs para um local seguro a cada 1-2 horas. e .. escravo somente leitura para propósitos apenas de backup também é uma opção.

    
por 15.12.2009 / 12:41
0

Se você o estiver executando no Linux, ou em outra variante * nix, poderá fazê-lo com o seguinte:

nice -n ## mysqldump

Isso dará uma prioridade menor de agendamento. O intervalo de prioridade de agendamento de -20 (prioridade mais alta) a 19 (prioridade mais baixa) o padrão para bom é 10 se o argumento -n for omitido ..

    
por 15.12.2009 / 12:48
0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice para prioridade de E / S e bom para prioridade de CPU.

Execute o vmstat 5, verifique a coluna que diz WA. Alto valor significa que a CPU está esperando por E / S. Use ionice, se é apenas a carga da CPU, use bom.

Resposta para atualizar:

Parece que você está correto. Chama o mysql que não é picado. Eu acho que você poderia usar o renice para isso e definir o valor legal depois de ser executado.

Eu não tenho um banco de dados grande o suficiente para despejar um atm para fazer um script útil para você.

A replicação, como seu link sugere, é um caminho a percorrer. Replicar, parar e despejar, no host anthoer.

    
por 15.12.2009 / 12:55
0

Coloque seus dados do MySQL em um LV e use um trabalho mylvmbackup que captura um instantâneo do LV e do tars up os arquivos de dados do MySQL. Dessa forma, você não bloqueia as tabelas, minimizando o impacto em seus aplicativos para apenas o carregamento de E / S.

    
por 21.12.2009 / 09:26
0

Você pode sempre tentar não executá-lo nos horários de pico. Seja qual for a prioridade que você usar, o despejo ainda vai exigir um bloqueio em todas as suas tabelas.

    
por 19.04.2013 / 17:02