PDA

View Full Version : Script per backup automatico database


franksisca
19-10-2014, 10:03
ciao ragazzi, sto cercando di far funzionare lo script per il backup automatico dei miei database.

ho fatto nel seguente modo
#!/bin/bash
mysqldump -u***** -p****** –-opt ****** > /root/scriptDB/backupGiornaliero
dt=`date +%y%m%d`
tar cvf /root/backup/sqlbackup-$dt.tar /root/backup/*


ed ho messo tutti nel file dailyBackup.sh e poi gli ho dato i permessi di esecuzione
chmod +x dailyBackup.sh



poi ho aggiunto tutto al crontab crontab -e
00 00 * * * root sh /root/scriptDB/dailyBackup.sh


ma non mi genera alcun file. Il server è Ubuntu 12.04 se non erro (comunque ubuntu sicuro). Cosa sbaglio?

Maui78
19-10-2014, 20:13
Metti un export della variabile PATH prima di eseguire il mysqldump ed assicurati che la variabile contenga il puntamento agli eseguibili di mysql dove, appunto, si trova il comando sopracitato.
In ogni caso, se dovesse esserci ancora qualche rogna, digita il comando mail e guarda il sistema cosa ti ha segnalato in corrispondenza della schedulazione.

Ciao

Tasslehoff
19-10-2014, 23:33
Prova a lanciare manualmente lo script con l'utente con cui vuoi che giri (root).
Nel caso lancialo invocando la bash con il parametro di debug -x (bash -x /root/scriptDB/dailyBackup.sh) e se si rompe da qualche parte verifica bene gli eventuali errori.

Se vuoi redirigere l'output verso un file di log fallo direttamente per tutto lo script e non solo per mysqldump, così com'è se dovesse andare storto qualcosa nella creazione del tar non te ne accorgeresti.
Eventualmente puoi usare tee per loggare tutto e inviare anche una mail, es:
/root/scriptDB/dailyBackup.sh 2>&1 | tee -a /var/log/dailyBackup.log | mail -s "[BACKUP] MySQL Daily" utente@dominio.com

Verifica la sintassi del cron, specificare l'utente ha senso se definisci il cron in /etc/cron.d, con "crontab -e" editi direttamente il cron dell'utente con cui sei loggato, non serve specificarlo.

Infine se posso consigliare inserisci il controllo dell'exit status dei comandi presenti nello script, puoi definire una piccola funzione per inviare una mail di avviso solo se qualche comando termina con uno status diverso da 0, dai un'occhiata a questo ottimo howto (http://fvue.nl/wiki/Bash:_Error_handling).

franksisca
20-10-2014, 09:02
Prova a lanciare manualmente lo script con l'utente con cui vuoi che giri (root).
Nel caso lancialo invocando la bash con il parametro di debug -x (bash -x /root/scriptDB/dailyBackup.sh) e se si rompe da qualche parte verifica bene gli eventuali errori.

Se vuoi redirigere l'output verso un file di log fallo direttamente per tutto lo script e non solo per mysqldump, così com'è se dovesse andare storto qualcosa nella creazione del tar non te ne accorgeresti.
Eventualmente puoi usare tee per loggare tutto e inviare anche una mail, es:
/root/scriptDB/dailyBackup.sh 2>&1 | tee -a /var/log/dailyBackup.log | mail -s "[BACKUP] MySQL Daily" utente@dominio.com

Verifica la sintassi del cron, specificare l'utente ha senso se definisci il cron in /etc/cron.d, con "crontab -e" editi direttamente il cron dell'utente con cui sei loggato, non serve specificarlo.

Infine se posso consigliare inserisci il controllo dell'exit status dei comandi presenti nello script, puoi definire una piccola funzione per inviare una mail di avviso solo se qualche comando termina con uno status diverso da 0, dai un'occhiata a questo ottimo howto (http://fvue.nl/wiki/Bash:_Error_handling).


Innanzitutto grazie ad entrambi per l'aiuto. Purtroppo sono un pò a secco in questo ambito, quindi sto leggendo guide in giro per far funzionare il tutto.

allora ho provato ad eseguire lo script in debug come consigliavi ed in risultato è questo:root@PW-APP:~/scriptsDB# bash -x dailyBackup.sh
+ mysqldump -u***** -p***** $'\342\200\223-opt' ******
dailyBackup.sh: line 3: /root/scriptDB/backupDatabase: No such file or directory
++ date +%y%m%d
+ dt=141020
+ tar cvf /root/backup/sqlbackup-141020.tar '/root/backup/*'
tar: /root/backup/sqlbackup-141020.tar: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now


è come se non potesse creare la cartella o il file, ma ovviamente i permessi li ha (è l'utente root).

Poi per inviarmi la mail devo installare mailutils?risolto...ho installato mailutils e mi sono inviato la mail ;)

franksisca
20-10-2014, 09:29
allora ho aggiunto nel crontab i vari parametri per mandare la mail con allegato l'output del log

00 00 * * * root sh /root/scriptDB/dailyBackup.sh 2>&1 | tee -a /var/log/dailyBackup.log | mail -s "[BACKUP] MySQL Daily" franksisca@gmail.com


ma l'errore sulla creazione della folder continua ad esistere

Tasslehoff
20-10-2014, 10:32
Devo correggere una vaccata che ho scritto nel mio precedente post a causa di fretta e distrazione.
mysqldump produce l'esatta sequenza di query da lanciare per ricreare il database ed eventualmente ripopolarlo con i dati (a seconda delle opzioni passate), quindi la redirezione dell'output non è un log ma il dump vero e proprio del database (in questo caso chiamato "backupGiornaliero".

Tre suggerimenti:

verifica che la directory dove vai a scrivere il backup (/root/scriptDB/) esista e sia scrivibile dall'utente con cui lanci il backup

dai al backup un nome che sia parlante e identifichi il database, magari seguito dal seriale della data e magari seguito da una estensione che permetta di identificare immediatamente quel file come backup (es .sql o .dmp o qualsiasi altra cosa, basta che ti sia chiaro che quello è un backup).
Dato che poi i dump sono semplici file di testo, risulteranno molto comprimibili, puoi usare gzip per risparmiare un sacco di spazio.

Riassumendo quindi puoi usare questo (sostituisci <DATABASE> con il nome del database che vuoi backuppare):
mysqldump -u***** -p****** –-opt ****** <DATABASE> | $(which gzip) -9 > /root/scriptDB/<DATABASE>.sql.$(date +"%Y%m%d%H%M%S").gz

franksisca
20-10-2014, 11:08
questi sono i permessi alla cartella drwxrwxrwx 2 root root 4096 Oct 20 10:42 scriptsDB/



e qesto è il contenuto del file dailyBackup
mysqldump -uuser -ppassword --opt nomeDB | $(which gzip) -9 > /root/scriptDB/nomeDB.sql.$(date +"%Y%m%d%H%M%S").gz
tee -a /var/log/dailyBackup.log | mail -s "[Backup] database mysql nomeDB" franksisca@gmail.com


e se eseguo con il debug
root@PW-APP:~/scriptsDB# bash -x dailyBackup.sh
+ mysqldump -uuser -ppassword --opt nomeDB
++ which gzip
+ /bin/gzip -9
++ date +%Y%m%d%H%M%S
++ date +%Y%m%d%H%M%S
dailyBackup.sh: line 3: /root/scriptDB/nomeDB.sql.20141020120330.gz: No such file or directory
mysqldump: Got errno 32 on write
+ tee -a /var/log/dailyBackup.log
+ mail -s '[Backup] database mysql nomeDB' franksisca@gmail.com



sinceramente non riesco a capire perchè dia questo errore, sembra che non riesca a creare il file ma non ne vedo i motivi!!!

franksisca
20-10-2014, 11:22
just for info

root@PW-APP:~/scriptsDB# mysqldump -uuser -ppassword --opt nomeDB > /root/scriptDB/nomeDB.sql.$(date +"%Y%m%d%H%M%S")
-bash: /root/scriptDB/nomeDB.sql.20141020121911: No such file or directory
root@PW-APP:~/scriptsDB# mysqldump -uuser -ppassword --opt nomeDB > nomeDB.sql.$(date +"%Y%m%d%H%M%S")



possibile che non becca l'indirizzamento nell'output del file???

Maui78
20-10-2014, 12:02
Ciao
Ma la cartella si chiama scriptDB o scriptsDB ?!
Da una parte hai scritto al singolare, dall'altra al plurale. Dai un'occhiata.

Ciao

franksisca
20-10-2014, 12:13
Ciao
Ma la cartella si chiama scriptDB o scriptsDB ?!
Da una parte hai scritto al singolare, dall'altra al plurale. Dai un'occhiata.

Ciao

questo non potrebbe fare altro che dimostrare che sono un emerito rinco :P

ora me lo metto nel crontab e vedo se va

Maui78
20-10-2014, 12:18
questo non potrebbe fare altro che dimostrare che sono un emerito rinco :P

ora me lo metto nel crontab e vedo se va

Tranquillo, questi so quei dettagli che chi fa lo script non noterà mai ! :D
E infatti serve sempre l'intervento esterno per trovare l'inghippo.
Almeno un migliaio di volte ci sarò caduto pure io ! :p