Hogyan helyezzük át az adatbázisainkat tároló fájlokat egy másik partícióra vagy merevlemezre

botond küldte be 2019. 04. 30., k – 17:36 időpontban

Tartalom

 

Bevezető

Weboldalak üzemeltetése során előfordulhat hogy az adatbázisok mérete eléri a partíción lévő szabad keretünket, vagy csak teljesítmény optimalizálási célokból szeretnénk átköltöztetni az adatbázisainkat például egy SSD meghajtóra. Bármi okunk is legyen erre a műveletre, ebből a leírásból megtudhatjuk, hogyan költöztethetjük át az adatbázisokat tartalmazó bináris adatfájlokat egy másik partícióra vagy másik meghajtóra.

 

 

Adatbázismotorok és verzióik a Debian rendszereken

A Debian 8 (Jessie) rendszeren az alapértelmezett adatbázismotor a MySQL 5.5, de ezen kívül elérhető még a MariaDB 10.0-ás verziója is. A Debian 9 (Stretch) rendszerre pedig már a MariaDB 10.1 verziója telepíthető alapból. Persze Debian 9-re is telepíthető a MySQL, de mivel itt már nem ez az alapértelmezett adatbázismotor, így a telepítése eltér a hagyományos csomagtelepítéstől, amire egy másik leírásban térünk ki. 

Bármelyik is legyen a szerverünkön, az itt következő rövid útmutató mindkét adatbázismotorra kiterjed.

 

A MySQL/MariaDB alapbeállításai

MySQL

A MySQL fő konfigurációs fájlja a /etc/mysql/my.cnf. Ha belenézünk például a nano-val,

nano /etc/mysql/my.cnf

akkor láthatunk benne sok beállítást, de ami most minket érdekel az a "datadir" értéke, ami alapból így van beállítva:

[...]
datadir    = /var/lib/mysql
[...]

Ez lenne tehát a MySQL bináris adatfájlokat tartalmazó könyvtár beállítása, amit később módosítunk.

MariaDB

A MariaDB teljes értékű helyettesítője a MySQL-nek. A kompatibilitás megőrzése végett létezik egy szimbolikus link ugyanezen az elérésen, ám ebben csak hivatkozások vannak további konfigurációs fájlokat tartalmazó könyvtárakra, amiknek a tartalmát be kell töltenie a MariaDB-nek az indulásakor:

[..]
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

Ha ezek közül követjük az alsót, akkor eljutunk a konkrét beállításokat tartalmazó fájlhoz is, amibe először csak belenézünk:

nano /etc/mysql/mariadb.conf.d/50-server.cnf
A fájlnévben az "50-" -es előtag a konfigurációs fájl betöltésének a prioritását szabályozza, amit növekvő sorrendben tölt be a könyvtárból. Így létrehozhatók például felülíró beállítások is magasabb sorszámú fájlnevekkel.

Ebben a fájlban is ugyanúgy megtaláljuk a datadir beállítását:

[...]
datadir    = /var/lib/mysql
[...]

Ezek tehát a két adatbázismotor beállításait tartalmazó konfigurációs fájlok, amikre majd visszatérünk a megfelelő időben.

 

Adatbázisfájlok költöztetése

Datadir

A konfigurációban a datadir-nek beállított könyvtár tárolja az adatbázisok tábláit, indexeit, stb tároló bináris fájlokat. Először lépjünk be a könyvtárba, és mérjük fel a terepet:

cd /var/lib/mysql
du -ch .

Ekkor megtudjuk a pontos méretet, hogy mekkora helyre lesz minimálisan szükségünk az új partíción, stb.

Az alábbi paranccsal pedig ellenőrizhetjük, hogy melyik meghajtón és partíción van a jelenlegi tároló könyvtár:

df -h .

Illetve az összes csatolási pont:

df -h

Ezek alapján az igényeinknek megfelelő helyet tudunk keresni az adatbázisfájloknak (nagyobb partíció, SSD partíció, stb.).

Fájlok másolása/szinkronizálása

Szinkronizálás fejlesztői vagy tesztkörnyezeten

Ha a szerver egy fejlesztői vagy tesztkörnyezet, akkor nincs sok jelentősége a ténykedésünk gyorsaságának és az állás időnek, ilyenkor nem kell bonyolítani, hanem néhány lépésből meg lehet oldani az egészet:

Adatbázis szerver leállítása a systemctl paranccsal:

systemctl stop mysqld.service

Ezután másoljuk át az általunk kiválasztott cél helyre a teljes /var/lib/mysql könyvtár alatti tartalmat. Erre a célra tökéletes a Midnight Commander is, amivel kényelmesen rekurzívan átmásolhatunk mindent. Nagy adatmennyiség esetén érdemes a háttérben futtatni ezt a műveletet, addig végrehajthatjuk a következő lépést pl. egy másik terminál ablakban.

Ezután a rendszerünkre érvényes, fentebb már megismert valamelyik konfigurációs fájlban módosítsuk a datadir útvonalát a megfelelőre, majd mentsük le a fájlt.

Végül indítsuk újra az adatbázis szervert:

systemctl start mysqld.service

És készen is vagyunk, immár az új könyvtárból használja az adatbázismotorunk a fájlokat.

 

 

Szinkronizálás éles szerveren

Egy éles szerveren, ahol nagy forgalmú weboldalak is vannak és kritikus szempont a magas rendelkezésreállás, nem megengedhető a pár perces leállás sem. A műveletet lehetőleg éjjel végezzük, amikor a legalacsonyabb a forgalom a weboldalakon.

Ilyen esetekben a másoláskor én az rsync parancsot szoktam használni, ami a leghatékonyabb szinkronizációs megoldás, és kiváló alternatívája a másolásnak is. A parancs használatával minimalizálhatjuk az állásidőt, így az üzemeltetett weboldalak látogatói sem fogják elhagyni az oldalakat.
Ennek a műveletsornak a lényege, hogy még az adatbázisszerver leállítása előtt végrehajtjuk az első másolást, és a MySQL állásidejében már csak a fájlstruktúrában a leállítás által bekövetkezett eltéréseket szinkronizáljuk át, amivel töredéke idő alatt elvégezhetjük a műveletet. Az rsync program nagy előnye, hogy egy adott fájlon belül is képes érzékelni a módosulást, így a fájloknak csak a megváltozott szeletét továbbítja a cél helyükre. Ezzel is rengeteg időt spórolva. Minél több és nagyobb adatbázisunk van, az rsync hatékonysága annál nagyobb.

Mindez lépésről lépésre a következőképpen néz ki:

Először másoljuk vagy szinkronizáljuk át az adatbázis fájlstruktúrát. Célszerű már most az rsync-et használni, hogy beállítgassuk a kapcsolókat, ellenőrizhessük a másolás eredményét, hogy az állás időben már csak újra kelljen futtatni a működő parancsunkat:

rsync -av /var/lib/mysql/ /<kiválasztott célkönyvtár útvonala>/

Kapcsolók:

  • a: Archív mód, különböző további kapcsolók gyűjteménye. Általános esetekben használatos.
  • v: Bőbeszédű mód, így látjuk, hogy éppen hol tart a másolás.
Az útvonalak megadásánál ügyeljünk, hogy mind a forrás, mind a cél útvonal / jellel végződjön! Ellenkező esetben az rsync az alkönyvtárral együtt másolja át annak tartalmát.

Ezután módosítsuk a MySQL vagy MariaDB konfigurációs fájlban a datadir értékét. Tehát MySQL esetén:

nano /etc/mysql/my.cnf

MariaDB esetén pedig:

nano /etc/mysql/mariadb.conf.d/50-server.cnf
[...]
datadir    = /<kiválasztott adatkönyvtár útvonala>
[...]

Itt nem kell a végére / jel. Mentsük le. Ekkor még nem lép érvénybe, és nem az állásidőt növeljük ennek az átírásával.

Ezután jöhet az adatbázisszerver leállítása:

systemctl stop mysqld.service

Miután leállt, ismételjük meg az rsync-es parancsunkat, ami ekkor már jóval hamarabb másolja át a könyvtárstruktúrában létrejött eltéréseket.

Majd indítsuk el az adatbázist:

systemctl start mysqld.service

És ezzel készen vagyunk. Lényegében ugyanaz volt a menet itt is, csak töredéke ideig hagytuk állni az adatbázis szervert.

 

Konklúzió

Bár egy kicsit hosszabbra nyúlt ez a leírás, de alapvetően egy egyszerű műveletről van szó, amely működik MySQL és MariaDB adatbázis motorokkal egyaránt. Így tehát ha szükségessé válik az adatbázisokat tároló bináris fájlok áthelyezése egy másik könyvtárba, akkor könnyedén megoldhatjuk a feladatot.

 

Kapcsolódó tartalom, hasznos linkek: