Zálohování databáze mysql a souborů na linuxu

Po delší době jsem se díky velikonocům dostal ke správě linuxového stroje. Již delší dobu jsem věděl, že by to chtělo nějak lépe vyřešit zálohování. Ne že by nefungovalo, ale řešení bylo poplatné době kdy vznikalo a také lidem, kteří ho implementovali.

A nakonec to nebylo ani tak těžké…

Záloha MySQL databází

Požadavky

  • denní zálohu držet 7 dní
  • týdenní zálohu držet 4 týdny
  • měsíční zálohu držet 3 měsíce
  • zálohovat každý web zvlášť
  • komprimovat zálohy

Použité prostředky

  • mysqldump
  • cron
  • scriptovací jazyk perl

Implementace

Script backup_day_mysql.pl

#!/usr/bin/perl -w
# vytáhneme si seznam jednotlivých databází, krom systémových
my @seznam = `echo "show databases" | mysql -uUSER_NAME -pPASSWORD | egrep -v '^(Database|information_schema|mysql)\$'`;
# připravíme si proměnou obsahující datum, pro pozdější název souboru
my $datum = `date +\%Y-\%m-\%d_\%H-\%M`;
$datum =~ s/\n//;
# každou databázi zkomprimujeme, pojmenujeme a uložíme do adresáře záloh
foreach my $radek (@seznam) {
  $radek =~ s/\n//;
  my $out = `mysqldump -uUSER_NAME -pPASSWORD $radek | bzip2 -c9 > /var/backups/day/mysql/$datum-$radek.bz2`;
}

Automatické spouštění
Toto zajistíme CRONem. CRON upravujeme po zadání příkazu crontab -e. Více v manuálu.

5 3 * * *  /home/backup_day_mysql.pl

Záloha souborů s weby

Požadavky

  • denní zálohu držet 7 dní
  • týdenní zálohu držet 4 týdny
  • měsíční zálohu držet 3 měsíce
  • zálohovat každý web zvlášť
  • komprimovat zálohy

Použité prostředky

  • cron
  • scriptovací jazyk perl

Implementace

Script backup_day.pl

#!/usr/bin/perl -w
my @seznam = `ls -1 /var/www`;
my $datum = `date +\%Y-\%m-\%d_\%H-\%M`;
$datum =~ s/\n//;
foreach my $radek (@seznam) {
  $radek =~ s/\n//;
  my $out = `tar -cvzf /var/backups/day/www/$datum-$radek.tgz /var/www/$radek`;
}

Automatické spouštění
Toto zajistíme opět CRONem.

10 3 * * * /home/backup_day.pl

Automatický úklid

Pokud bychom jen spouštěli tyto scripty, tak by velikost zabraného místa stále jen stoupala. A pokud provozujeme třeba web s 1GB daty, tak to máme každý den pěkný přírůstek.
Takže musíme po sobě i uklízet. To zajistíme pro denní zálohy dle požadavku příkazem:

# najdi všechny soubory starší než 7 dní a ty smaž
find /var/backups/day/www/ -type f -mtime +7 -delete

Opět spouštěným pravidelně v CRONu.

Pro denní, týdenní a měsíční zálohy to pak celé vypadá takto

CRON

# m h  dom mon dow   command
5 3 * * *  /home/backup_day_mysql.pl
10 3 * * * /home/backup_day.pl
15 3 * * * find /var/backups/day/www/ -type f -mtime +7 -delete
15 3 * * * find /var/backups/day/mysql/ -type f -mtime +7 -delete
20 3 * * 7 /home/bacup_mysql.pl
25 3 * * 7 /home/backup_week.pl
30 3 * * 7 find /var/backups/week/www/ -type f -mtime +28 -delete
30 3 * * 7 find /var/backups/week/mysql/ -type f -mtime +28 -delete
35 3 1 * * /home/backup_month_mysql.pl
40 3 1 * * /home/backup_month.pl
45 3 1 * * find /var/backups/month/www/ -type f -mtime +90 -delete
45 3 1 * * find /var/backups/month/mysql/ -type f -mtime +90 -delete

Know-how, které jsem v článku pro zjednodušení zamlčel

  • Soubory ukládám do /var/backups/{DRUH_ZALOHY}/{CO_ZALOHUJI}/ (DRUH_ZALOHY – day, week, month; CO_ZALOHUJI – www, mysql). Netvrdím, že to je jedniné možné a správné řešení, ale umožňuje se mi celkem snadno ve struktuře orientovat
  • /var/backups mám namapované na samostatný oddíl (/dev/sda6) což brání, aby díky zálohování došlo místo na primárním disku a tím to shodilo systém (zálohy ale v tuto dobu nepoběží). Na toto narazilo i mnoho profesionálních hostingů.
  • Scriptům je třeba dát právo na spuštění (např. chmod +x /home/backup_day.pl)
  • CRON je třeba nastavit tak, aby se nejlépe jednotlivé probíhající zálohy neovlivňovaly a zbytečně se nesnižoval výkon systému.
  • I přes tento sytém je třeba občas kontrolovat, zda zálohy probíhají korektně.
  • Je dobré zálohy občas stáhnout a vypálit či uložit geograficky dále od serveru.

Co se dá ještě vylepšit?

  • Mailová notifikace o (ne)provedení zálohy.
  • Automatický upload záloh mimo server (FTP, SCP).
  • Tvorba jen inkrementálních záloh.
  • Test správného vytvoření souborů.
  • Optimalizace příkazu mysqldump o doprovodné atributy.

7 komentářů u „Zálohování databáze mysql a souborů na linuxu

  1. tloudev

    osobne delam full dump databaze 1xtydne a archivuji kazdy den binarni logy databaze. Veskere souborove zalohy (tzn dump+binarni logy) zalohuji pres rsync-snapshots na centralni backup server.
    Co se mi na zde popsanem reseni ani pranic nelibi je:
    1/ „perl wrapper“ na shellove prikazy – pokud uz pisu perlovy script, pak bych ocekaval mysql spojeni realizovane pres perl knihovny
    2/ prilis mnoho uloh spoustenych z cronu – nakonec i ten find by mohl byt soucasti backup scriptu.
    google rsync snapshots ;-)

  2. Jan Kocmánek Autor příspěvku

    Já neprezentoval toto řešení jako dokonalé, ale jako dostačující na mé podmínky. Neprovozuji žádný maxi hosting :)

  3. Fanda

    I přes všechny výhrady co padly, díky za článek. Je to myslím dobrý start a inspirace pro vytvoření vlastního řešení.

  4. Stanislav Pecka

    Chtel bych se zeptat, jak by vypadal zalohovaci skript pro postgresql. Dekuji

Napsat komentář

Vaše emailová adresa nebude zveřejněna.