Last active
September 28, 2015 17:38
-
-
Save alessandro-fazzi/1472754 to your computer and use it in GitHub Desktop.
Automate dayly/monthly backup of mysql and pgsql dbs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Inizializzo l'array con tutti i nomi dei DB che mi interessano. | |
#+Inserire tra le parentesi tonde il nome del database da backuppare | |
#+rigorosamente uno per riga | |
#DB MySql | |
#E' possibile qui usare "all" come magic word per includere tutti i DB presenti. "all" va usata comunque come prima dell'elenco o meglio come unica | |
dbarray_mysql=( | |
foo | |
bar | |
) | |
#DB pgSql | |
dbarray_pgsql=( | |
foo | |
bar | |
) | |
#Per quanti giorni vogliamo avere un backup dei DB? Occhio allo spazio! | |
#+Lo script cancellerà i backup più vecchi di ret giorni. Modificare solo | |
#+il numero e NON la variabile | |
ret=7 | |
#Per quanti mesi vogliamo avere un backup mensile dei DB? Occhio allo spazio! | |
#+Lo script cancellerà i backup mensili più vecchi di mret giorni. Modificare solo | |
#+il numero e NON la variabile | |
mret=180 | |
#Ricordarsi di aggiungere nel crontab di root (loggati come root digitare | |
#+ "crontab -e" per editarla) due righe simili alle seguenti: | |
#05 00 * * * /root/scripts/bkpdb.sh --daily > /dev/null 2>&1 | |
#00 01 1 * * /root/scripts/bkpdb.sh --monthly > /dev/null 2>&1 | |
#ovviamente correggendo con l'orario desiderato |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
#VARIABILI | |
mysqldump=$(which mysqldump) #__traccio i percorsi assoluti degli eseguibili | |
vacuumdb=$(which vacuumdb) #| | |
pg_dump=$(which pg_dump) #| | |
find=$(which find) #| | |
mysqlshow=$(which mysqlshow) #| | |
logger=$(which logger) #|_fino a qui | |
today=$(date +%F) #giorno | |
ora=$(date +%H:%M) #data | |
path=$(pwd)/ #path dello script comprensiva di trailing slash | |
bkppath="/opt/backupDB/" #path della cartella dove effettuare backup e logging comprensiva di trailing slash | |
logtag="[BKPDB]" #Imposto il tag iniziale del log una volta per tutte | |
admin="root" #L'utente amministratore o adibito ai backups. Non su tutti i sistemi è uguale | |
host="localhost" #L'indirizzo dell'host per collegarsi al DB. Di default è localhost | |
[email protected] #A chi mandare notifiche di errore | |
mysqluser=user | |
mysqlpassword=password | |
pgsqluser= | |
pgsqlpassword= | |
#ATTENZIONE: alcune variabili fondamentali sono definite nel file di configurazione | |
#+che si trova in ${path} in path e che di default è nominato bkpdb.config | |
#Todo: logger sembra ignorare l'istruzione di loggare in un file specifico, loggando | |
#+quindi tutto in /var/log/messages; questo non è grave, in quanto con il [TAG] è | |
#+facile risalire ai log di questo script, però da alquanto fastidio. Vabè... | |
#Controllo che il file di configurazione esista | |
if [ ! -f ${path}bkpdb.conf ] | |
then | |
${logger} -t ${logtag} 'FAIL! Manca il file di configurazione...fatto qualche cazzata?' | |
mail -s "Errore backup database" $mailaddr <<EOT | |
Su questo sistema qualcosa è andato male nel backup dei database. Controlla il syslog (con grep $logtag) | |
EOT | |
exit 1; | |
fi | |
#Controllo che lo script abbia i permessi giusti e sia di proprietà di root:root, altrimenti mi sta sul culo. | |
#+Questo controllo non è fondamentale, ma fa si che se qualcuno modifica i permessi per qualche motivo | |
#+se ne accorga perché qualcosa si rompe... magari leggendo il log. | |
if [ `ls -l ${path}bkpdb.sh | cut -d " " -f1` != "-rwx------" ] || [ `ls -l ${path}bkpdb.sh | cut -d " " -f3` != "${admin}" ] || [ `ls -l ${path}bkpdb.sh | cut -d " " -f4` != "${admin}" ] | |
then | |
${logger} -t ${logtag} 'FAIL! Lo script non ha i giusti permessi. Impostali a 700 per poter eseguire lo script' | |
mail -s "Errore backup database" $mailaddr <<EOT | |
Su questo sistema qualcosa è andato male nel backup dei database. Controlla il syslog (con grep $logtag) | |
EOT | |
exit 1; | |
fi | |
#INCLUDO il conf | |
source ${path}bkpdb.conf | |
#START HERE | |
if [[ ${dbarray_mysql[0]} == 'all' ]]; then | |
#ad ora in questo caso gestisco solo i DB MySQL | |
allDbs=`${mysqlshow} -h ${host} -u ${mysqluser} -p${mysqlpassword} | head -n -1 | tail -n +4 | cut -d " " -f 2` | |
for db in $allDbs | |
do | |
if [[ $1 == '--daily' ]]; then | |
${mysqldump} --lock-tables --single-transaction -h ${host} -u ${mysqluser} -p${mysqlpassword} ${db} | gzip > ${bkppath}${db}.${today}.sql.gz | |
${logger} -t ${logtag} Backup eseguito per il database MYSQL: ${db} | |
elif [[ $1 == '--monthly' ]]; then | |
${mysqldump} --lock-tables --single-transaction -h ${host} -u ${mysqluser} -p${mysqlpassword} ${db} | gzip > ${bkppath}${db}.monthly.${today}.sql.gz | |
${logger} -t ${logtag} Backup MENSILE eseguito per il database MYSQL: ${db} | |
fi | |
done | |
else | |
#MYSQL | |
#Leggo la lista dei database source-ata in precedenza ed eseguo il backup | |
#+di ognuno comprimendolo | |
for db in `echo ${dbarray_mysql[*]:0}` | |
do | |
if [[ $1 == '--daily' ]]; then | |
${mysqldump} --lock-tables --single-transaction -h ${host} -u ${mysqluser} -p${mysqlpassword} ${db} | gzip > ${bkppath}${db}.${today}.sql.gz | |
${logger} -t ${logtag} Backup eseguito per il database MYSQL: ${db} | |
elif [[ $1 == '--monthly' ]]; then | |
${mysqldump} --lock-tables --single-transaction -h ${host} -u ${mysqluser} -p${mysqlpassword} ${db} | gzip > ${bkppath}${db}.monthly.${today}.sql.gz | |
${logger} -t ${logtag} Backup MENSILE eseguito per il database MYSQL: ${db} | |
fi | |
done | |
#PGSQL | |
#Leggo la lista dei database source-ata in precedenza ed eseguo il backup | |
#+di ognuno comprimendolo | |
#ToDo: importante! al momento l'utente "progetti_manager" è hardcoded nel codice, | |
#+ma se servisse fare backup di più DB con permessi ed utenti differenti questo | |
#+ non è per nulla bene... | |
for db in ${dbarray_pgsql[*]:0} | |
do | |
${vacuumdb} -z -U ${pgsqluser} ${db} >/dev/null 2>&1 | |
${pg_dump} -U ${pgsqluser} ${db} | gzip > "${bkppath}postgresql-${db}-${today}.gz" | |
${logger} -t ${logtag} Backup e Vacuum effettuati per il database PGSQL: ${db} | |
done | |
fi | |
#Rintraccio ed elimino file dei backup giornalieri più vecchi di ret giorni | |
#+nella cartella dei backup | |
${find} ${bkppath} -name "*.gz" ! -name "*monthly*" -ctime +${ret} -exec rm -f {} + | |
#Rintraccio ed elimino file dei backup mensili più vecchi di mret giorni | |
#+nella cartella dei backup | |
${find} ${bkppath} -name "*.gz" -name "*monthly*" -ctime +${mret} -exec rm -f {} + |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Improved with configurable host, admin user, auto backup of every mysql DBs