MySQL backuppen in 4 simpele stappen
Ik zocht naar een eenvoudige manier om de databases van verschillende sites van mij automatisch te backuppen en op een externe locatie te bewaren. Mijn databases zijn niet groot en het zijn er ook niet veel, dus een Gmail-adres zou voldoende zijn.
Je kent het verhaal wel. Ik was ontevreden met wat ik vond en besloot om het zelf te maken.
- een shell-script die een dump van de inhoud van een MySQL-database maakt en deze verpakt in een .gz zipfile;
- een php-script dat de gemaakte mysqldump als attachment mailt naar een Gmail-adres;
- een cronjob die bijvoorbeeld elke zondagnacht om 4:00 de voorgaande twee scripts na elkaar uitvoert;
- filtering in Gmail zodat de gemailde backups (evt. ook van andere databases) later eenvoudig teruggevonden kunnen worden.
Downloaden en plaatsen
Download het shell-script en phpmailer
Plaats de bestanden class.phpmailer.php, class.smtp.php, mail-backup.php en backup.sh in je webroot, dus boven je map /public_html of /www, zodat er niemand vanaf de browser bij kan. Zet ze eventueel in een nieuwe map. Ik heb zelf een map aangemaakt, genaamd 'backups', hoe origineel.
CHMOD=711 voor backup.sh;
Stap 1: vul de variabelen in het shell-script in
Met het volgende shell-script maak je een backup van een mysql-database en verpak je het in een .gz file. Wanneer het klaar is, roept het vanaf de commandline het php-script mail-backup.php aan.
#!/bin/sh # db gegevens DBNAME=je_db_naam DBPASS=je_db_wachtwoord DBUSER=je_db_username # absoluut pad backupdir (bv 'backups'). Gebruik evt. phpinfo() BACKUPDIR=/pad/naar/jouw/webroot/backups # naam sql file, wordt na elke cronjob overschreven SQLGZFILE=$BACKUPDIR/$DBNAME.sql.gz # naam php file die mail verzorgt PHPBACKUPFILE=mail-backup.php # absoluut pad naar mysqldump (bv /usr/local/bin/mysqldump) MYSQLDUMP=/usr/local/bin/mysqldump # absoluut pad naar php (bv /usr/bin/php) PHP=/usr/bin/php # uitvoeren en pijpen (zucht) door gzip $MYSQLDUMP --opt -c -e -Q -u$DBUSER -p$DBPASS $DBNAME | gzip > $SQLGZFILE # php mailer proggel aanroepen $PHP $BACKUPDIR/$PHPBACKUPFILE
Voor alle duidelijkheid: de opdracht 'mysqldump' creƫert een volledige query als backup. Als je deze query uitvoert (bijvoorbeeld in phpmyadmin bij 'sql', dan wordt de query uitgevoerd. Test dit wel eerst op een testdatabase :).
Stap 2: vul de variabelen in mail-backup.php in
Je kunt op allerlei manieren attachments versturen per email. Ik vind phpmailer prettig en simpel werken. Het php-bestand 'mail-backup.php' is ingesteld op het aanroepen van phpmailer en het versturen van een attachment genaamd 'databasenaam.sql.gz', maar gebruik gerust je eigen mailapplicatie.
Let bij het invullen van de variabelen erop dat je als afzender en 'reply-to' email een BESTAAND emailadres opgeeft. Mocht je Gmail-account volraken, dan wordt namelijk alles retour afzender gestuurd.
IsSMTP();
$mail->Host = "localhost";
$mail->SMTPAuth = true;
$mail->Username = "je_smtp_username";
$mail->Password = "je_smtp_wachtwoord";
$mail->From = "email_adres_afzender";
$mail->FromName = "naam_afzender";
$mail->AddAddress("email_adres_ontvanger","naam_ontvanger");
$mail->AddReplyTo("reply_to_adres","reply_to_naam");
$mail->WordWrap = 50;
$mail->AddAttachment("precies_hetzelfde_als_SQLGZFILE");
$mail->IsHTML(true);
$mail->Subject = "subject_naam ".date('Y-m-d H:i')."";
$mail->Body = "bodytekst";
$mail->AltBody = "bodytekst";
if(!$mail->Send())
{
echo "Mail niet goed verstuurd";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "Mail verstuurd";
?>
Stap 3: automatiseer met cron
Cron is een heel handig Unix-programma waarmee je commandline opdrachten (bijvoorbeeld een shell-script of php) op een gegeven datum/tijdstip kunt laten uitvoeren, bijvoorbeeld elke week op zondagnacht om 4:00u. Zie voor een inleiding in Cron Introductie in Cron.
Ziehier een voorbeeldweergave van een cronjob voor mijn shell-script in cPanel (= webhosting accountbeheer, vergelijkbaar met Plesk):

Belangrijk om te onthouden is dat het shell-script aangeroepen wordt met '/bin/sh', gevolgd door het absolute pad naar het shell-script.
Stap 4: filter inkomende backups in Gmail
Ik gebruik Gmail omdat het veel opslagruimte biedt en je er grote attachments naartoe kunt sturen (ca. 17MB, zie ook hier) en omdat je er makkelijk in kan zoeken door het gebruik van labels. Maar je kunt natuurlijk iedere willekeurige mailproggel gebruiken.
Hieronder zie je enkele filters/labels die ik gebruik in een apart Gmail account dat enkel gebruikt wordt voor mijn Database backups:

En toen?
Toen kreeg je automatisch backups :) Je kunt bijvoorbeeld met phpmyadmin backups herstellen. Als je het shell-scripten snapt, kun je er nog veel meer mee doen, bijvoorbeeld in plaats van backups versturen naar een emailadres, ze versturen naar een andere ftp-server. Handig als je grotere databases hebt, maar in mijn geval niet nodig.
Vergeet niet om eens in de zoveel tijd (zeg: zes maanden) in te loggen in je Gmail-backup account en oude backups te verwijderen.
Interessant?
Lees dan ook eens meer artikelen over tools, ...
Reacties
door Ramon Eijkemans, 2011 06 30
Graag gedaan. Heb 'm recentelijk nog geupdate, dus ja, het werkt nog steeds prima. Het enige wat verouderd is, is de screenshot in gmail, maar ook dat werkt nog steeds precies hetzelfde
Mooie scripts. Heb even getest hoe alles werkt, heb werken met cron nog niet eerder gedaan, ik doe het met Directadmin, maar ik heb een probleem. Na wat proberen zag ik dat ik mooi een e-mail kreeg en ook de sql.gz wordt opgeslagen in het bedoelde path, maar de gz backup is leeg?? Alle db-gegevens kloppen en de paden ook
Ik help met het beheren van een forum en het leek me handig om de boel automatisch te backuppen.. Wat doe ik verkeerd?
door Ramon Eijkemans, 2011 07 15
Hoi Ronald, heb je de SQL query die wordt uitgevoerd via mysql-dump getest? Als verder alles werkt qua mail en verpakken, dan lijkt het me dat de fout zit in het uitvoeren van de juiste query. Zie ook http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html
Rants/opmerkingen/suggesties?
Wat is MONLOG
Sinds 2002 is MONLOG het weblog van Ramon Eijkemans, freelance SEO-gun for hire.
Dit weblog bevat how-to's, mijmeringen, soms wat humor. Het gaat vrijwel altijd over SEO. Ik herhaal geen nieuws. Het doel van dit weblog is om jou van praktische en doordachte informatie te voorzien!
En dan nog dit: guestpostings zijn welkom! Mail me als je je ei kwijt wil op dit goed rankende podium.
Laatste comments
@Aartjan: ik heb hetzelfde met 'lekker kontje' :)...
25.11.2011 door Ramon Eijkemans op Ranken op Banaan
Bij mij is 'banaan' toevallig al jaren het zoekwoord waar ik...
23.11.2011 door Aartjan van Erkel op Ranken op Banaan
Gewoon maken waar vraag naar is. Dat is zo oud als de weg...
22.11.2011 door Thomas op Ranken op Banaan
Een banaan natuurlijk :)
09.11.2011 door Ramon Eijkemans op Ranken op Banaan
In welk tineu zien we jou terug binnenkort?
09.11.2011 door Emiel op Ranken op Banaan
@Simme @Navin proost! :)
07.09.2011 door Ramon Eijkemans op Vakantie!
Zo maak je mij wel erg jaloers :)
05.09.2011 door Navin Poeran op Vakantie!
12 bier geeft plezier.en veel succes gewenst tijdens de tw...
31.08.2011 door simme op Vakantie!
@Willem: ik denk op de manier zoals ik in dit artikel...
20.08.2011 door Ramon Eijkemans op Faceted search & SEO: vloek of zegen?
Goed en interessant artikel. Wat mij vooral bezighoudt, is...
20.08.2011 door Willem Hoekstra op Faceted search & SEO: vloek of zegen?


door kockie, 2011 06 30
Bedankt voor je duidelijke uitleg (al is die al oud) Heb er veel aan gehad!