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

12

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

No meu arquivo /etc/cronjob , 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.sh eu tenho:

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

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

Se o arquivo de backup do SQL for mais antigo do que uma semana , eu gostaria que o cronjob apagasse ele automaticamente.

Espero que alguém possa me ajudar.

    
por pbaldauf 04.04.2014 / 21:30

4 respostas

14

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

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 prudente ver o que você está excluindo antes de excluir (pelo menos ao testar seu script) para fazer isso:

find /home/users/backup_MyDB -type f -mtime +7
    
por 04.04.2014 / 21:35
4

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

Espero que isso ajude alguém.

Usando as informações acima, criei um script de 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 coloco isso no meu crontab -e:

# MYSQL Dump and retention for 3 days
30 22 * * * bash /root/bin/mysqldump.sh > /dev/null 2>&1
    
por 11.02.2015 / 19:14
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 ser o melhor compressor disponível. Se o seu Linux distro suporta, você pode usar o instalador do apt:

sudo apt-get install p7zip-full

Alternativamente, você pode usar tar.gz se você se sentir mais confortável com isso.

2) Então, 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

Este script irá encontrar os arquivos com mais de 7 dias e apagá-los, então ele fará o sql dump, então ele irá 7-zip todos os arquivos .sql no diretório, então ele irá apagar todo o arquivo .sql no diretório. o diretório (BTW, você pode, opcionalmente, adicionar um comando mysql antes do despejo, como indicado na resposta anterior, se você precisar)

3) Fazemos chmod +x /home/users/backup.sh para poder ser executável.

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

4) Nós 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 de seu banco de dados MySQL todos os dias da semana às 4h30 (exceto aos domingos) e compactará o backup

    
por 27.01.2017 / 07:59
0

Para adicionar à resposta do @ Graeme, talvez seja interessante notar que às vezes você precisa escapar do caractere '%' em uma tarefa do cron para que fique assim:

 mysqldump -uroot -p MyDatabase >/home/users/backup_MyDB/$(date +\%F)_full_myDB.sql
    
por 19.03.2017 / 12:11