Varmuuskopiointi mielletään usein hankalana asiana, vaikka todellisuudessa hankalaksi se tulee vain koska siitä tehdään hankalaa. Oraclen Solaris-käyttöjärjestelmän käyttämässä ZFS-tiedostojärjestelmässä on useita erinomaisia ominaisuuksia ja yksi niistä on snapshotit, joita voidaan käyttää varmuuskopiointiin. Linuxin käyttämällä LVM:llä, eli loogisilla volyymeillä voidaan hoitaa myös varmuuskopiointi helposti.
Tuotantoympäristöissä usein ongelmaksi muodostuu tilanne jossa useat prosessit käyttävät tiedostoja ja samaan aikaan niistä yritetään ottaa varmuuskopiota. Tämä johtaa siihen että tiedostosta otettu varmuuskopio joko on puutteellinen tai siitä ei voida palauttaa toimivaa versiota, tätä varten on kuitenkin keinot jolla tiedostoista pystytään ottamaan varmuuskopio joka on ehyt.
Ehyt varmuuskopio käyttäen luku-tilaa
Tiedostojärjestelmästä voidaan ottaa ehyt ja toimiva varmuuskopio, kunhan se ensin muutetaan luku-tilaan, joka estää kirjoitukset, ja näin kaikki muutokset jotka saattaisivat sotkea varmusukopion ottamista.
jpj@x1:~$ sudo umount /home jpj@x1:~$ sudo mount -o ro /home jpj@x1:~$ sudo tar -cvf /dev/st0 /home jpj@x1:~$ sudo umount /home jpj@x1:~$ sudo mount -o rw /home
Tämä aiheuttaa kuitenkin ongelmia. Koska tiedostojärjestelmään ei voida kirjoittaa, aiheuttaa se usein katkon palveluille jotka käyttävät tietoa tiedostojärjestelmästä. Jos esimerkiksi haluat ottaa varmuuskopion tietokantapalvelimesta, on tietokantapalvelut suljettavat varmuuskopion ajaksi (Tämä ei tietysti koske työkaluja joilla voidaan ottaa suoraan tietokannasta lennossa varmuuskopio. Tässä tarkoitetaan yleisesti varmuuskopion ottamista, ei pelkästään tietokantoja).
Linuxin loogiset volyymit apuna varmuuskopioinnissa
Linuxin LVM tarjoaa erinomaiset työkalut varmuuskopiointiin, mutta näiden edellytyksenä on luonnollisesti se että tiedostojärjestelmä on tehty käyttäen LVM:ää, tosin nykyisin valtaosa Linux-distribuutioista ottaa asennuksessa lvm:n käyttöön. Käytämme tässä ratkaisussa hyväksemme LVM:n volyymiä jonka tyyppi on snapshot. Tämän erikoislaatuisen volyymin sisältö on täysin sama kuin volyymin sisältö sen ottoajankohtana, ts. kun snapshot-volyymi luodaan sen sisällöstä tulee täysin identtinen. Tämän tarjoama hyöty on siinä, että kun snapshot on otettu voidaan siitä ottaa varmuuskopio ilman pelkoa tiedostojen sisällön muuttumisesta varmuuskopioinnin aikana. Jos tätä tekniikkaa käytetään esimerkiksi tietokanta-volyymin varmuuskopioinnissa tietokannan ei tarvitse olla suljettuna itse varmuuskopioinnin aikana.
Ensin luodaan snapshot-volyymi ja sille määritellään riittävän iso koko:
jpj@x1:~$ sudo lvcreate -L1G -s -n dbbackup /dev/datavg/datalv Logical volume "dbbackup" created
Tämän jälkeen itse snapshot-volyymi otetaan käyttöön ja ajetaan itse varmuuskopiointi:
jpj@x1:~$ sudo mkdir /mnt/dbbackup jpj@x1:~$ sudo mount /dev/datavg/dbbackup /mnt/dbbackup jpj@x1:~$ sudo tar -cf /dev/st0 /mnt/dbbackup
Lopuksi kun itse varmuuskopiointi on saatu tehtyä poistetaan snapshot käytöstä:
jpj@x1:~$ sudo umount /mnt/dbbackup jpj@x1:~$ sudo lvremove /dev/datavg/databases Do you really want to remove active logical volume dbbackup? [y/n]: y Logical volume "dbbackup" successfully removed
LVM:n snapshottien käyttäminen MySQL-tietokannan varmuuskopiointiin
Aluksi itse tietokanta laitetaan snapshotin oton ajaksi luku-tilaan:
jpj@x1:~$ sudo mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 610 Server version: 5.1.41-3ubuntu12.8 (Ubuntu) Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> flush tables with read lock; mysql> flush logs; mysql> quit
Kun tietokanta on asetettu luku-tilaan otetaan itse snapshot ja vapautetaan tietokanta lukutilasta, tärkeää on luoda riittävän iso snapshot-volyymi (koko rippuu itse tietokantavolyymin koosta, esimerkissä käytän 5G:n volyymia). Koska Linux ottaa LVM:stä snapshotin varsin nopeasti on itse katko varsin lyhyt.
jpj@x1:~$ sudo lvcreate -L5G -s -n backup /dev/dbvg/dblv Logical volume "backup" created jpj@x1:~$ sudo mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 610 Server version: 5.1.41-3ubuntu12.8 (Ubuntu) Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> unlock tables; mysql> quit
Lopuksi otetaan varmuuskopio ja poistetaan snapshot käytöstä.
jpj@x1:~$ sudo mount -o ro /dev/dbvg/backup /mnt/mysqlbackup jpj@x1:~$ sudo tar czvf mysql.$(date +"%m-%d%-%Y).tar.gz /mnt/mysqlbackup/* jpj@x1:~$ sudo umount /mnt/tmp jpj@x1:~$ sudo lvremove -f /dev/dbvg/backup