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.
December 10th, 2007 at 4:06 pm
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)
December 10th, 2007 at 4:11 pm
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…
December 1st, 2008 at 11:51 pm
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.