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

15

Quero fazer backup de um banco de dados, mas durante o dia em que houver 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 com baixa prioridade.

Como posso fazer isso?

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

andyuk
fonte
você já viu o mysqlhotcopy?
@fsb como o mysqlhotcopy suporta o que o OP quer?
Tomas

Respostas:

8

Se você tiver um servidor sobressalente que possa lidar com a carga de gravação do seu servidor, poderá configurar a replicação para esse servidor e fazer backup no servidor escravo. Isso também tem a vantagem de que você pode interromper a replicação enquanto faz o backup e obter uma captura instantânea 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 backup do MySQL se você tiver os recursos.

Como um bônus interessante, agora você tem um escravo somente leitura que pode ser usado para consultas lentas de longa duração.

David Pashley
fonte
Infelizmente, esta opção parece ser a mais trabalhosa, mas acho que é a única opção real se eu quiser um impacto mínimo no servidor principal.
18715 Andy
2
É quase a única maneira de obter um backup desativado adequadamente, se você não deseja impactar as operações. Como diminuir a velocidade mysqldumpfará com que um bloqueio longo seja mantido ou as tabelas estejam fora de sincronia.
21711 Dan Carley
15

Andy, acho que você já teve tempo de sobra para encontrar uma solução. Recentemente, eu vim com uma solução para isso que está funcionando muito bem para mim no tsheets , e achei que eu iria compartilhá-lo.

cstream é uma ferramenta de manipulação de fluxo de uso geral como o UNIX dd, geralmente usada em tubos construídos por linha de comando. O que torna o cstream útil para nós é que ele permite especificar a largura de banda máxima para todas as entradas. Isso significa que você pode limitar a E / S de disco 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 backup de um banco de dados que utilize todas as tabelas do InnoDB, o comando acima é seguro (não afetará outras consultas) e fará o mysqldump enquanto limita as 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 execute o backup sem afetar a experiência do cliente.

Brandon
fonte
Acabei de testar e eu trabalho como um encanto! Obrigado por compartilhar Brandon!
22713 sucotronic
4

FWIW, você também deve conseguir fazer isso com o pv ( http://linux.die.net/man/1/pv )

mysqldump - única transação --quick -u -p | pv --rate-limit 1m> destination (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 passar opções para um processo já em execução, por exemplo; --rate-limit para alterar a taxa de transferência.

alex.pilon
fonte
1

se você usa o innodb, pode tentar o xtrabackup com a opção --throttle .

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

ou talvez você queira habilitar o log binário no mysql e executar o dump 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 somente de backup também é uma opção.

pQd
fonte
0

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

nice -n ## mysqldump

Isso lhe dará uma prioridade de agendamento mais baixa. Planejando o intervalo da prioridade de -20 (prioridade mais alta) a 19 (prioridade mais baixa), o padrão para nice é 10 se o argumento -n for omitido.

Kevin K
fonte
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 agradável para prioridade de CPU.

Execute o vmstat 5, verifique a coluna que diz WA. Valor alto significa que a CPU está aguardando E / S. Use ionice, se for apenas carga da CPU, use nice.

Resposta à atualização:

Parece que você está correto. Chama mysql que não é niced. Eu acho que você pode usar o renice para isso e definir o valor agradável após a execução.

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

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

artifex
fonte
0

Coloque seus dados do MySQL em um LV e use um trabalho detalhado mylvmbackup, que tira um instantâneo do LV e agiliza os arquivos de dados do MySQL. Dessa forma, você não bloqueia as tabelas, minimizando o impacto nos seus aplicativos apenas na carga de E / S.

rodjek
fonte
0

Você sempre pode tentar não executá-lo durante o horário de pico. Qualquer que seja a prioridade que você use, o dump ainda exigirá um bloqueio em todas as suas tabelas.

Pedro
fonte
Isso não é verdade: se as tabelas são InnoDB, nenhum bloqueio é colocado nelas para leitura.
dr01