Pagina 1 di 1

[GUIDA] Backup Database MySQL

Inviato: 17 giu 2013, 20:49
da Arianna
Salve ragazzi,
casualmente ho trovato alcuni post, anche se vecchi, di utenti che chiedono come effettuare il backup dei DB di MySQL. Alcuni anche senza risposta (es. http://www.qnapclub.it/viewtopic.php?f= ... 74&p=16928)
Per questo motivo ho pensato di fare una semplice guida.

Lo script, tramite la funzione pulizia(), cancella i file della cartella di Backup più vecchi di 14 giorni.
Ovviamente potete cambiare il 14 oppure non richiamare proprio la funzione pulizia se non volete che vengano mai cancellati.

Per fare i backup (compressi), che per mia comodità faccio separatamente per ogni DB, ho creato uno script in /share/MD0_DATA/Maintenance/ chiamato backupdb.sh.
Il log dell'esecuzione del backup viene scritto in /share/MD0_DATA/Maintenance/dblog.txt
I backup vengono salvati in /share/MD0_DATA/Backup.
Ovviamente le variabili che contengono questi due dati, rispettivamente LOG e BCKPATH, potete modificarle a vostro piacere.
Così come DBUSER e DBPASSWD che contendono user e pass del db.

Contenuto dello script /MD0_DATA/Maintenance/backupdb.sh:

Codice: Seleziona tutto

#!/bin/sh

LOG="/share/MD0_DATA/Maintenance/dblog.txt"
DATA=`date +"%d-%m-%Y"`
DBUSER="root"
DBPASSWD="PasswordDiRootDiMysql"
DUMP="/mnt/ext/opt/mysql/bin/mysqldump"
DUMPOPTS="--add-drop-table"
BCKPATH="/share/MD0_DATA/Backup"
BCKDIR=$BCKPATH/$DATA

echo INIZIO BACKUP DATABASE >$LOG
date >>$LOG
echo >>$LOG

mkdir $BCKDIR

db_backup() {
	for database in $(/mnt/ext/opt/mysql/bin/mysql --user=$DBUSER --password=$DBPASSWD -e 'show databases' -s --skip-column-names);
	do
	echo Creo $database-$DATA.sql >>$LOG
	$DUMP --user=$DBUSER --password=$DBPASSWD $DUMPOPTS $database > "$BCKDIR/$database-$DATA.sql";
	done
}

comprimi() {
	echo >>$LOG
	echo Creo DB_backup_$DATA.tar.gz >>$LOG
	tar -czf $BCKPATH/DB_backup_$DATA.tar.gz $BCKDIR
}

cancella () {
	echo >>$LOG
	echo Cancello $BCKDIR >>$LOG
	rm -r $BCKDIR
}

pulizia () {
	files=`find $BCKPATH -type f -mtime +14`
	echo >>$LOG
	echo Elimino backup vecchi >>$LOG

	for file in $files
	do
		echo  ... Elimino $file >>$LOG
		rm $file
	done
}



db_backup && comprimi && cancella && pulizia

#log fine
echo >>$LOG
date >>$LOG
echo FINE BACKUP DATABASE >>$LOG
Infine ho schedulato lo script con crontab affinchè venga eseguito automaticamente.
Per farlo dovete modificare il file /etc/config/crontab con qualsiasi editor ed aggiungere la riga:

Codice: Seleziona tutto

0 4 * * * sh /share/MD0_DATA/Maintenance/backupdb.sh > /dev/null 2>&1
In questo modo il backup verrà eseguito ogni notte alle 4.
poi bisogna eseguire da shell il comando "crontab /etc/config/crontab" per rendere i cambiamenti effettivi e riavviare crontab con "/etc/init.d/crond.sh restart"


A proposito di mysql, ribadisco una cosa.
Molti provano ad usarlo da linea di comando digitando: mysql -u root -p
ma ottengono: mysql : command not found

per usare mysql bisogna indicare il percorso completo:
/mnt/ext/opt/mysql/bin/mysql -u root -p

Per qualsiasi dubbio/chiarimento, chiedete pure!

Re: [GUIDA] Backup Database MySQL

Inviato: 18 giu 2013, 15:50
da luciano
Grazie Arianna! Aggiungerei che per non perdere quanto inserito in crontab si debba poi seguire l'altra guida....

Re: [GUIDA] Backup Database MySQL

Inviato: 18 giu 2013, 16:50
da Arianna
perchè l'altra guida?
L'altra riguarda l'autorun.
Il backup non è innescato dall'autorun, ma dal crontab.

O intendi dopo eventuali aggionarmenti?
Oppure volevi dire qualcos'altro e non ho capito :P

Re: [GUIDA] Backup Database MySQL

Inviato: 18 giu 2013, 17:20
da luciano
scusa hai ragione, stò fuso, pensavo parlassi di autorun.... per farmi perdonare: http://forum.qnap.com/viewtopic.php?f=94&t=10902 per i meno smanettoni : Chessygrin :
cmq se aveste problemi col crontab (al riavvio si perde le entry customizzate da voi) leggete in fondo qui.

Re: [GUIDA] Backup Database MySQL

Inviato: 18 giu 2014, 18:50
da lucascuba
Scusate, ma se il mio backup sarà puntato su un hard disk esterno (eSATA per la precisione) collegato al NAS, quale sarà l'indirizzo esatto da inserire nello script per il dump?

Re: [GUIDA] Backup Database MySQL

Inviato: 20 giu 2014, 11:24
da luciano
Guarda il nome con cui viene montata no? Dovrebbe essere qualcosa tipo "esata1" se ricordo bene...

Re: [GUIDA] Backup Database MySQL

Inviato: 21 giu 2014, 01:26
da lucascuba
Ok, grazie mille Luciano.
Secondo te cosa è meglio tra questa procedura ed un database slave su di un altra macchina in rete?

Re: [GUIDA] Backup Database MySQL

Inviato: 21 giu 2014, 11:57
da luciano
dipende dalle tue esigenze, con un db slave sei allineato praticamente in tempo reale col crontab no.

Re: [GUIDA] Backup Database MySQL

Inviato: 26 giu 2014, 15:29
da lucascuba
Grazie mille Luciano!
Ho caricato lo script e schedulato il tutto in crontab, ma nella cartella che ho indicato trovo solo il file log che mi scrive l'inizio della procedura...e nien'altro! Le path le ho ricontrollate diverse volte ma nulla....idee?
Grazie in anticipo

Re: [GUIDA] Backup Database MySQL

Inviato: 27 giu 2014, 22:46
da Arianna
e cosa c'è scritto dentro il file di log?

Re: [GUIDA] Backup Database MySQL

Inviato: 07 lug 2014, 16:27
da lucascuba
a posto risolto Arianna grazie comunque, era un problema di permessi di scrittura. : RedFace :

Re: [GUIDA] Backup Database MySQL

Inviato: 16 lug 2014, 09:13
da Arianna
Meglio così allora! :)

Re: [GUIDA] Backup Database MySQL

Inviato: 11 mar 2018, 11:56
da gipasoft
Grazie mille per l'utilissima guida, nel mio Qnap la cartella di mysql la trovo in:

Codice: Seleziona tutto

/mnt/ext/opt/mariadb/bin

Re: [GUIDA] Backup Database MySQL

Inviato: 27 feb 2020, 07:03
da Jfk105
Grazie per la guida. Una domanda: non ho capito (non sono un programamtore) dove viene definito il nome del database.
Cioè non vedo la variabile Sdatabase tra le variabili settate all'inizio.
Questo perchè così configurato mi si blocca probabilmente perchè ho più database con user e password uguali (è un'eredità di altre persone...) e quindi non mi esegue il backup di tutti. Se potessi definire a mano il nome del database dove dovrei sostituire la variabile con il nome del database nel codice?
Grazie mille, ciao
J