Senų seniausiai nepaslaptis, jog visada yra verta daryti svarbių duomenų atsargines kopijas. Kalbant apie web hosting’ą backup’ai turi ypač didelę svarbą, nes egzistuoja daug faktorių ir sutuacijų, kurios gali nulemti svarbių duomenų praradimą. Taigi šiame straipsnelyje trumpai aprašysiu vieną iš būdų kaip organizuoti atsarginių duomenų kopijų darymą ir saugojimą savo nuosavajame arba virtualiajame (VPS, VDS) serveryje (netinka Shared Hosting naudotojams – jie dažnai ir taip turi priejimą prie kokio nors superPanel, kuris leidžia kurti backup’us ir juos organizuoti).

Didesnės ir rimtesnės kompanijos, kurios siūlo hosting’ą, suprantama, automatiškai daro jūsų patalpintų duomenų atsargines kopijas. Ir, dėmesio, tuos duomenis kartais netgi galima atstatyti. Tačiau retai kada užsiminama, jog šita paslauga yra mokama. Lietuvos didesnės kompanijos už tai prašo nuo 25Lt iki 50Lt + PVM + ant alaus + už kojas ir t.t. Ir nesvarbu ar tau reikia atstatyti tik vieną poros kilobaitų failiuką, ar visą failų sistemą (kas yra suprantama). Todėl verta paaukoti dalį turimos kietojo disko vietos (arba užsisakyti didesnės talpos) tokiem dalykams, kaip atsarginės kopijos, kurias galėtum pats valdyti ir nieko niekam nereikės papildomai mokėti.

Iš visų rinkoje esančių nemokamų serverio valdymo panelių asmeniškai man arčiausias širdies yra Webmin. Taip, jis turi savo trūkumų, turi savo privalumų, palyginus su kitomis panelėmis, bet šiame straipsnyje apie tai nešnekėsime ir nesiaiškinsime kaip jį įsiinstaliuoti (apie tai galima paskaityti oficialioje svetainėje) – toliau darysiu prielaidą, kad naudojame webmin’ą.

Taigi, prisijungę prie webmin’o ir užėję į SystemFilesystem Backup pagalvojame WUOLIA!, štai ir viskas ko mums reikia – yra Scheduled Backups, kurie ir leis mums automatiškai darytis atsargines kopijas. Iš esmės – taip, jis gali padaryt backup’ą ir išsaugoti jį kur reikia. Su šiuo moduliu galima daryti bet kurių sistemos failų backup’us, pavyzdžiui, backup’iname direktoriją, kur saugomi tinklapių failai (pvz. /var/www/). Taip pat galima daryti ir duomenų bazės atsargines kopijas, tačiau tai patogiau padaroma su ServersMySQL Database ServerBackup Databases, kur irgi leidžiama paleisti automatiškus backup’us būtent duomenų bazei.

Dabar prie reikalo. Norisi tuos backup’us kaip nors gražiai organizuoti – pavyzdžiui, saugoti skirtingose direktorijose pagal datas. Webmin leidžia naudoti placeholder’ius target failų pavadinimuose, bet norint grupuoti juos į direktorijas reikia papildomų veiksmų. Tiek Filesystem, tiek MySQL duomenų bazių Scheduled Backups nustatymuose yra galimybė nurodyti papildomus veiksmus, kurie turės būti atlikti po backup’o generavimo – čia ir ateina laikas mūsų fantazijai, kaip patogiai sugrupuoti tuos backup’us.

Asmeniškai man patogu atskirai saugoti failų ir duomenų bazių backup’us, kad esant reikalui galima būtų atskirai atstatyti jų dalis. Tarkime, kad tinklapių failų backup’us saugojame į /var/backups/web/, o duombazės backup’us į /var/backups/db/ (tokius path’us ir įrašome į reikiamus langelius backup’ų nustatymuose, taip pat nustatydami norimą kompresiją – šiame pavyzdyje naudojame GZip, tad atsarginės kopijos bus saugojami *.gz failuose). Įvykus backup’ui matome tokią failų struktūrą:

  • /var/backups/db/
    • duombaze1.sql.gz
    • duombaze2.sql.gz
    • ….
    • duombazeN.sql.gz
  • /var/backups/web/
    • failas.tar.gz

Bet jeigu tokią struktūra ir palikti, sekantis backup’as perrašys šiuos failus ir gausis taip, kad galime turėti tik vieną paskutinę atsarginę kopiją. Mes norime daugiau.

Tam tikslui reikia failus grupuoti į direktorijas, tad po backup’o reikia vykdyti tam tikrus veikmus – sukurti direktoriją (kurios pavadinimas būtų, pavyzdžiui, dabartinė data) ir tuos .gz failus perkelti į šią naujai sukurtą direktoriją. Tai padarys toks paprastas Bash skriptas:

mkdir -p $(date -I)
find -maxdepth 1 -name "*.gz" -print0 | xargs -0 -I {} mv {} $(date -I)/

BET… Jeigu saugoti visus tuos backup’us (o mes serveryje turime daug tinklapių, kurių kiekvienas backup’as užima po pavyzdžiui gigabaitą), disko vieta greitai užsipildys. Todėl norime saugoti tik paskutinių N dienų atsargines kopijas, senesnes reikia ištrinti (šiame pavyzdyje bus paliekami tik paskutinių 5-ių dienų atsarginės kopijos):

daysago=`date -d "5 days ago" +%Y%m%d`
for backup in [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
do
    backupdate=`echo "$backup" | tr -d -`

    if test "$backupdate" -lt "$daysago"
    then
        rm -rf "$backup"
        printf "Removing $backup...\n"
    fi
done

Įvykdžius šiuos skriptus gauname gražią struktūrą:

  • /var/backups/db/
    • 2013-01-08
      • duombaze1.sql.gz
      • duombaze2.sql.gz
      • ….
      • duombazeN.sql.gz
    • 2013-01-10
      • duombaze1.sql.gz
      • duombaze2.sql.gz
      • ….
      • duombazeN.sql.gz
  • /var/backups/web/
    • 2013-01-08
      • failas.tar.gz
    • 2013-01-10
      • failas.tar.gz

, kurioje bus palikti tik N dienų backup’ai. Gražu!

Šiuos skriptus, aišku, galima vykdyti tiesiogiai iš webmin’o, bet patogiau juos įdėti į vieną failą, kurį ir paleidinėti po backup’ų saugojimo.

Taigi, organizuojame backup’us

  1. Visą skriptą parsisiunčiame iš čia.
  2. Jį nukopijuojame į direktorijas /var/backups/web/ bei /var/backups/db/ (arba kur tik reikia).
  3. Suteikiame failams vykdymo teises (chmod +x organize_backups.sh), taip pat reikia įsitikinti, kad failas turi teises rašyti į šias direktorijas.
  4. Webmin nustatymuose sukuriame naujus Scheduled Backups darbus, pasirenkame kas kiek laiko norime daryti atsargines kopijas, kuriuos tiksliai duomenis archyvuoti ir pan.
  5. Backup’ų kurimo nustatymų laukeliuose Command to run after backup įvedame (parametras -d nurodo kiek paskutinių dienų backup’us saugoti):

    # prie filesystem backup'u:
    cd /var/backups/web/; ./organize_backups.sh -d 5;
    
    # prie duomenu bazes backup'u:
    cd /var/backups/db/; ./organize_backups.sh -d 10;
    

Viskas! Turime gražiai sudėtus backup’us, kuriais galime pasinaudoti bet kuriuo metu.