MySQL backuppen in 4 simpele stappen

2007 07 21 door monchito

php codeIk 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.

  1. een shell-script die een dump van de inhoud van een MySQL-database maakt en deze verpakt in een .gz zipfile;
  2. een php-script dat de gemaakte mysqldump als attachment mailt naar een Gmail-adres;
  3. een cronjob die bijvoorbeeld elke zondagnacht om 4:00 de voorgaande twee scripts na elkaar uitvoert;
  4. 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):

Gmail filters MySQL backup

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:

Gmail filters MySQL backup

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

kockie

door kockie, 2011 06 30   kockie

Bedankt voor je duidelijke uitleg (al is die al oud) Heb er veel aan gehad!

Ramon Eijkemans

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

ronald

door ronald, 2011 07 15   ronald

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?

Ramon Eijkemans

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?