Zálohovací skript

Jsem ve spoustě ohledů IT, což na má bedra klade spoustu různých povinností, které musím dodržovat, abych netrhal partu a nekazil tak reputaci IT obecně. Protože velkou část z nich porušuji, rozhodl jsem se, že budu příkladným jedincem alespoň v jednom z atributů, které k počítačům patří. Ano, jsem líný jako veš! A nestydím se za to, protože vím, jak to mám dělat.

Příkladem nám budiž můj zálohovací skript, který jsem vytvořil, když jsme zjistil, jak mě nebaví pravidelných intervalech kopírovat ty pitomé soubory z Doriathu na Luthien. Tak jsem se jednoho rána posadil a začal bashovat. Pro ty co to neznají, bashování je onen podivný stav mysli, kdy váš mozek přestane myslet obvyklým způsobem, ale stane se bash interpreterem a základními myšlenkovými pochody jsou unixové příkazy. A co z toho vzniklo?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash#zkontrolujeme, zda je uživatel root, to se hodí pro zálohování /etc
if [ $UID -ne 0 ];then
    echo "Must be root to do that!"
    exit 1
fi;
 
#Kam půjdou výsledné archivy
archive_location="/media/luthien/"
#datum
day=$( date +%F )
#co budeme zálohovat
backup_folders="/etc/ /home/ /var/www/"
#zálohovat MySQL? 1 znamená ano, ostatní hodnoty ne
backup_mysql=1
 
# Blbuvzdornostní kontrola, zda opravdu existuje místo, kam chceme archivy uložit
if [ ! -d $archive_location ];then
    echo $0": Error! Location for saving archives not found!"
    exit 1
fi;
 
# Kontrola, zda běží MySQL
if [ $backup_mysql -eq 1 ] && [ ! -f /var/run/mysqld/mysqld.pid ];then
    echo $0": Brutal Error! MySQL not running!"   # Povšimněte si krásně zvoleného názvu Erroru
    exit 1
fi;
 
# Zeptáme se uživatele na heslo do MySQL, jinak můžeme těžko zálohovat
if [ $backup_mysql -eq 1 ];then
    echo -n "Please insert your mysql root password"
    read mysql_pass
fi;
 
#zálohování MySQL
if [ $backup_mysql -eq 1 ];then
mysqldump --all-databases -u root --password=$mysql_pass | gzip - > $archive_location/mysqldump-$day.gz
fi;
 
#Pro jistoto smažeme proměnnou s heslem, někdo by jí mohl zkusit zneužít, navíc ulehčíme RAMce ;)
unset mysql_pass
 
#zálohování jednotlivých složek
for loc in $backup_folders;do
    if [ ! -f $loc ];then
        echo $0": Error! File/directory \""$loc"\" should be backuped but doesn\'t exist"
    fi;
 
#opravdu ošklivý hack pro sed, ale na nic lepšího jsem nepřišel
    echo "$loc" > /tmp/backup-script-$day
    name=backup-$(sed "s/\//-/g" /tmp/backup-script-$day )-$day.tar.bz2
    tar -cvvjf $archive_location/$name $loc       #samotná tvorba archivu
done;
 
#úklid po hacku
rm -f /tmp/backup-script-$day

Co to nakonec umí

Vezme to zadané složky, vytvoří to z nich archivy tar, které to protáhne bzip2, takže se radikálně zmenší celková velikost, a ty nakopíruje do zadaného umístění. K tomu to zálohuje celé MySQL do gzipu, neboť jsem nepřišel jak bzip2 donutit, aby četl ze stdinu. Archivy jsou prakticky pojmenovány podle složky a data, takže se dají velmi dobře třídit.

Co tomu ještě chybí

Přemýšlel jsem, co by ještě tak mohl umět. Napadlo mě několik drobností, které by možná někteří uvítali

  • Automatické třídění do složek
  • Zálohování porovnávacím způsobem (podle data editace vytvářet inkrementální zálohu)
  • vytvořit hezčí workaround pro sed
  • Zálohování jiných databází

Nic víc už mě nenapadá, pokud vás ano, nebojte se ozvat.

Pro hnidopichy a jiné právníky

Už z dálky slyším otázky typu: A pod jakou je to licencí, je to GNU GPL_v3 nebo jaká? Můžu to měnit? Můžu to dát do closed-source aplikace. A můžu to použít jako tapetu na plochu notebooku/ tapetu do pokoje?
Těmto věcem jsem se rozhodl předejít. Kód tohoto skriptu je pod současnou BSD licencí, takže si s ním můžete dělat opravdu co chcete.

5 Responses to “Zálohovací skript”

  1. ronny Says:

    Mno :-) super skript.. akorat u kazdeho adresare kterej zalohuje napise “./zaloha: Error! File/directory “/home/” should be backuped but doesn\’t exist” .. nevim proc :-) a radek 30 bych zmenil na ‘echo -n “Please insert your mysql root password: “‘ aby to vypadalo hezceji :D + mysql at to testuje i /var/run/mysqld.pid ne kazdy linux to ma stejne :-) (to jen jestli se ti to chce delat :D)

  2. Jakub Lucký Says:

    Ad Error -> tak to fakt nevím, mě to fakt funguje bez problémů… nemáš tam někde nějakou drobnost

    Ad /var/run/mysql.pid -> kdo nemá, ať hodí patchem

    Ad ten `echo -n` -> mám to v povědomí, ale jsem líný veš… Hlavně bych to chtěl nastavit tak, aby se tam to heslo nepsalo…

  3. default Says:

    Ad Error: v tom ifu na řádku 44 musí být -e. -f testuje, zda objekt existuje a je soubor, což pro adresář /home neplatí. Pak doporučuji dát všechny proměnné, které zastupují cesty, do uvozovek, protože v názvech souborů a adresářů se mohou vyskytovat mezery.

    Ad hack na sed:

    name=backup-$( echo “$loc” | sed -e ’s#/#-#g’ )-$day.tar.bz2

    a netřeba dočasného souboru.

Leave a Reply