cronjob para backup automático de banco de dados até o arquivo prefixado de data


12

Estou usando o Linux Mint mais recente. Eu queria saber se é possível criar um cronjob especial para um backup do banco de dados.

No meu /etc/cronjobarquivo, tenho o seguinte código:

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
30        4          *            *                1-6            /home/users/backup.sh

No meu /home/users/backup.sheu tenho:

mysqldump -uroot -p MyDatabase > /home/users/backup_MyDB/full_myDB.sql

Em vez de full_myDB.sqleu gostaria de ter algo como 2014-04-04_full_myDB.sqlonde a data é adicionada dinamicamente, dependendo da data que temos.

Se o arquivo SQL Backup é mais de uma semana que eu gostaria que o cron para apagar automaticamente.

Respostas:


15

Com o GNU date(padrão no Linux Mint), você pode:

mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +%F)_full_myDB.sql

Para excluir arquivos com mais de uma semana:

find /home/users/backup_MyDB -type f -mtime +7 -exec rm {} +

Embora geralmente seja aconselhável ver o que você está excluindo antes de excluir (pelo menos ao testar seu script), basta fazer o seguinte:

find /home/users/backup_MyDB -type f -mtime +7

Eu estava preparando a resposta, mas você me venceu: P
Ramesh

2
@ Jamesh, feliz por ter batido em alguém para variar - geralmente eu posto e alguém já tem uma resposta semelhante.
Graeme

Muito agradável. A única coisa que estou mudando para o meu uso é colocar os detalhes de acesso ao banco de dados em um arquivo .my.cnf.
Johann Dyck

4

Usei as informações acima e queria fornecer mais uma atualização menor que realmente trunca uma das tabelas realmente grandes que estavam atrasando nossos backups.

Espero que isso ajude outra pessoa.

Usando as informações acima, criei um script shell básico chamado mysqlbackup.sh com o seguinte conteúdo:

#!/bin/sh
find /data/var/backups/mysql/dumps -type f -mtime +3 -exec rm {} +
mysql -e "truncate table sitename_prod.cache_table"
mysqldump sitename_prod > /data/var/backups/mysql/dumps/$(date +%F)_full_sitename_prod.sql

Certifique-se de executar: chmod + x mysqlbackup.sh

Eu também coloquei isso no meu crontab -e:

# MYSQL Dump and retention for 3 days
30 22 * * * bash /root/bin/mysqldump.sh > /dev/null 2>&1

3

Eu sei que é muito antigo, mas usei as respostas acima e adicionei uma instrução de compactação de arquivos. Espero que alguém ache isso útil.

1) Pesquisando um pouco, o 7-zip parece o melhor compressor por aí. Se a sua distribuição Linux o suportar, você pode usar o instalador do apt:

sudo apt-get install p7zip-full

Como alternativa, você pode usar o tar.gz se sentir mais confortável com ele.

2) Em seguida, você cria um script, por exemplo /home/users/backup.sh Com o conteúdo:

#!/bin/sh
find /home/users/backup_MyDB -type f -mtime +7 -exec rm {} +
mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +%F)_full_myDB.sql
7z a /home/users/backup_MyDB/$(date +%F)_full_myDB.7z /home/users/backup_MyDB/*.sql
rm -f /home/users/backup_MyDB/*.sql

Esse script encontrará os arquivos com mais de 7 dias e os excluirá; em seguida, fará o dump do sql; em seguida, compactará 7 todos os arquivos .sql no diretório e excluirá todo o .sql no diretório ( BTW, você pode opcionalmente adicionar um comando mysql antes do despejo, conforme observado na resposta anterior, se necessário)

3) Fazemos um chmod +x /home/users/backup.shpara que possa ser executável.

3.1) Você deve testar seu script se ele funcionar como pretendido

4) Programamos a tarefa com crontab -e

# Minute   Hour   Day of Month       Month          Day of Week        Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)                
30        4          *            *                1-6            /home/users/backup.sh >> /dev/null 2>&1

E é isso. Ele fará backup do seu banco de dados MySQL todos os dias da semana às 4:30 da manhã (exceto aos domingos) e compactará o backup


1

Para adicionar à resposta do @ Graeme, pode ser interessante notar que, às vezes, você precisa escapar do caractere '%' em um trabalho cron para que fique assim:

 mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +\%F)_full_myDB.sql
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.