Skip to content

Instantly share code, notes, and snippets.

@alessandro-fazzi
Last active September 28, 2015 17:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alessandro-fazzi/1472754 to your computer and use it in GitHub Desktop.
Save alessandro-fazzi/1472754 to your computer and use it in GitHub Desktop.
Automate dayly/monthly backup of mysql and pgsql dbs
#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
#!/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
mailaddr=foo@b.ar #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 {} +
@alessandro-fazzi
Copy link
Author

  • Need a usege() function to handle invocation w/o arguments
  • need to implement monthly/daily argument also for pgsql

@alessandro-fazzi
Copy link
Author

Improved with configurable host, admin user, auto backup of every mysql DBs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment