MySQL adatbázisok mentése és visszaállítása

A MySQL az egyik legnépszerűbb nyílt forráskódú adatbázis-kezelő rendszer az interaktív weboldalak fejlesztéséhez. Ha webhelye az érzékeny adatokat MySQL adatbázisban tárolja, akkor egészen biztosan menteni akarja az információkat annak érdekében, hogy vissza lehessen azokat állítani, ha bármilyen katasztrófa történik (mindannyiunkkal történt már ilyen).

MySQL

Számos módja van a MySQL adatok mentésének. Ebből a cikkből megismerheti, hogyan lehet különböző módszerekkel biztonsági másolatot készíteni az adatbázisokról, valamint azt is megtudhatja, hogyan lehet egy automatikus mentési megoldással könnyebbé tenni a folyamatokat.

Mentési és visszaállítási típusok

A mentésnek két alapvető típusa létezik: a fizikai (raw) és logikai mentés. A fizikai mentések azon fájlok és könyvtárak nyers (raw) másolataiból állnak, amelyekben az adatbázis tartalmai vannak tárolva. Ez a fajta mentés a nagy, fontos adatbázisok mentéséhez megfelelő, amiket probléma esetén gyorsan kell visszaállítani.

A logikai mentések az információt logikai adatbázis struktúra és tartalom formájában ábrázolva tárolják. Ez a fajta mentés inkább a kisebb mennyiségű adatokhoz megfelelő, ahol lehetőség van az adatok értékeinek és a táblák struktúrájának szerkesztésére, vagy az adatok visszaállíthatók egy másik fajta számítógép architektúrán.

A mentési és visszaállítási típusokról részletesebben a MySQL referencia kézikönyvében olvashat.

Adatbázis mentési módszerek

Mentések készítése a mysqldump vagy a mysqlhotcopy segítségével

A mysqldump program és a mysqlhotcopy script képes mentéseket készíteni. A mysqldump sokkal általánosabb, mivel képes mindenféle táblák mentésére. A mysqlhotcopy azonban csak néhány fajta tároló motorral működik.

Mentések készítése a tábla fájlok másolásával

Azon tároló motoroknál, ahol minden egyes táblához egy saját külön fájl tartozik, a táblákat ezen fájlok másolásával lehet másolni. Például a MyISAM táblák fájlonként vannak tárolva, így nagyon egyszerűen lehet a fájlok másolásával végrehajtani a mentést. Konzisztens mentéshez le kell állítani az adatbázist vagy zárolni és üríteni kell az érintett táblákat.

Növekményes mentés készítése a bináris naplózás engedélyezésével

A MySQL támogatja a növekményes mentéseket. Ehhez a kiszolgálót a bináris naplózás engedélyezésével kell elindítani. A bináris naplófájlok szolgáltatják a szükséges információt ahhoz, hogy megismételhesse az adatbázisban azokat változtatásokat, amelyek azon időpontot követően lettek megtéve, miután végrehajtott egy biztonsági mentést.

Az adatbázis mentési módszerekről részletesebben a MySQL referencia kézikönyvében olvashat.

Mentési irányelvek létrehozása

A mentésnek csak akkor van haszna, ha az rendszeresen ütemezve van. A teljes mentés (az adatok pillanatfelvétele egy adott időpontban) végrehajtható a MySQL eszközeivel. A következő esetekben a mysqldump programot használjuk.

Adatbázisok mentése egy közös SQL fájlba

Ezt a fajta mentést akkor javasolt alkalmazni, amikor alacsony a kiszolgáló terhelése.  Eredményeként egy darab sql fájl fog létrejönni, amely tartalmazza az összes adatbázist. A folyamat során a táblák zárolva lesznek írásra, így garantálva a konzisztenciát.

# mysqldump -u#u# -p#p# --single-transaction --all-databases > all-databases.sql
  • a #u# és #p# helyére egy teljes jogosultsággal rendelkező felhasználó nevét és jelszavát kell medani (pl. root)
  • a –single-transaction kapcsoló elhagyható, ha csak MyISAM táblák találhatók az adatbázisokban
  • az –all-databases kapcsoló hatására a performance_schema és information_schema adatbázisok ki lesznek hagyva, valamint bekerülnek a CREATA DATABASE parancsok az sql fájlba

A teljes mentések szükségszerűek, de nem mindig kényelmes a létrehozásuk. Igen nagy mentési fájlokat eredményeznek és túl sok időt vesz igénybe a generálásuk. Optimálisnak sem nevezhetők, mivel minden egymást követő teljes mentés tartalmazza az összes adatot, még azokat is, amelyek esetleg nem változtak az korábbi teljes mentés óta. Sokkal hatékonyabb megoldás egy kiindulási teljes mentést készíteni, és utána már csak növekményes mentéseket. A növekményes mentések kisebbek és kevesebb időt igényel a létrehozásuk. A kompromisszum az, hogy a helyreállításkor, nem lehet visszaállítani az adatokat csak a teljes biztonsági mentés visszaolvasásával. Fel kell dolgozni a növekményes biztonsági mentéseket, hogy vissza legyenek állítva a növekményes változások is.

A bináris naplófájlok (ezek jelentik a növekményes mentéseket) használata esetén ügyelni kell arra, hogy a teljes mentés készítésekor a napló ürítve (flush) legyenek, hogy az ezután készült naplófájlok már csak a mentés után végrehajtott változtatásokat tartalmazzák. Ehhez módosítani kell a fenti parancssort.

# mysqldump -u#u# -p#p# --single-transaction --flush-logs --master-data=2 \
   --all-databases > all-databases.sql
  • a parancs végrehajtás után az adatkönyvtár egy új naplófájlt fog tartalmazni, mivel a –flush-logs kapcsoló a kiszolgálót a naplók ürítésére fogja utasítani
  • a –master-data kapcsoló hatására a mysqldump bináris napló információkat ír ki a kimenetbe, amiből megtudható, melyik naplófájltól kezdve kezdődnek a mentést követő változások.

A MySQL bináris naplófájlok igen sok helyet képesek elfoglalni. A hely felszabadítása érdekében ajánlott ezeket időről időre törölni. Ennek egyik módja azon bináris naplófájlok törlése, melyekre már nincs szükség, például amikor egy teljes mentés készítése történik.

# mysqldump -u#u# -p#p# --single-transaction --flush-logs --master-data=2 \
 --all-databases --delete-master-logs > all-databases.sql

Adatbázisok mentése külön SQL fájlokba

A teljes mentés alternatívája, amikor az adatbázisok nem egy nagy közös sql fájlba lesznek mentve, hanem adatbázisonként külön fájlba. A következő script erre mutat egy példát.

#!/bin/sh

MYSQLDUMP="/usr/local/bin/mysqldump"
MYSQL="/usr/local/bin/mysql"
GZIP="/usr/bin/gzip"

USER="user"
PASSWORD="password"

PATH="/BACKUP/"
PREFIX="MySQL.DB.BACKUP"

DATE=`date +%Y%m%d.%H%M%S`

ALLDB=`$MYSQL --user=$USER --password=$PASSWORD -e 'show databases' -s --skip-column-names`

DATABASES=`echo "$ALLDB" | grep -Ev "(mysql|performance_schema|information_schema)"`

$MYSQLDUMP --user=$USER --password=$PASSWORD --events --force --opt --single-transaction --databases mysql | $GZIP > "$PATH$PREFIX.mysql.$DATE.sql.gz";

for I in $DATABASES;
 do $MYSQLDUMP --user=$USER --password=$PASSWORD --force --opt --single-transaction --databases $I | $GZIP > "$PATH$PREFIX.$I.$DATE.sql.gz";
done

Az 3-5. sorok tartalmazzák a szükséges programok elérési útvonalait. A 7. és 8.  sorokban kell megadni a felhasználó nevét és jelszavát (pl. root). A 10. sorban kell megadni a mentési útvonalat. A 11. sorban lehet megadni egy előtagot a fájlnevek elejére. A 13. sorban jön létre az időbélyeg, amely szintén része lesz a fájlnévnek.

A 15. sorban történik az adatbázisok neveinek lekérdezése, ahol

  • az –s kapcsoló azt jelenti, hogy ne legyenek grafikus karakterekkel keretezve a kimenet
  • az -e ‘show databases’ parancs lesz végrehajtva
  • a –skip-column-names  kapcsoló azt jelenti, hogy ne jelenjen meg az oszlopok feléce, jelen esetben a ‘Databases’ szöveg

A 17. sorban található grep -Ev parancs eltávolítja a mysql, performance_schema és information_schema adatbázisokat a listából. A mysql adatbázist menteni kell, de különböző kapcsolókat kell megadni hozzá.

A 19. sorban történik az előbb említett mysql adatbázis mentése. Ezt az –events kapcsoló miatt kell külön kezelni, mert a 5.5.30 verziótól kezdve hibaüzenet jelenik meg, ha ezt nem így tesszük.

A 21-23. sorok egyesével végrehajtják az adatbázisok mentését, ahol

  • a –force kapcsoló azt jelenti, hogy a hiba esetén ne álljon  le a folyamat
  • az –opt valójában nem szükséges, mert alapértelmezésben be van kapcsolva
  • a –databases kapcsoló azért kell, hogy létrehozza az adatbázis létrehozás parancsot (CREATE DATABASE)
  • a –single-transaction kapcsoló elhagyható, ha csak MyISAM táblák találhatók az adatbázisokban
Megjegyzés: Az adatbázisok külön fájlokba való mentése nagyon fontos, amikor bináris (in-place) áttérést hajt végre az egyes MySQL kiadási verziók között. Ilyenkor ugyanis előfordulhat, hogy a mysql_upgrade nem képes megbirkózni a táblák frissítésével és ebben az esetben csak az adott tábla vagy adatbázis visszaállítása lehet a megoldás.

Adatbázisok visszaállítása

Az adatbázisok visszaállításának legkényelmesebb módja, amikor egy frissen telepített MySQL kiszolgálóra kell egy teljes mentést visszaolvasni. Ezt a következő paranccsal lehet végrehajtani:

# mysql -u#u# -p#p# < all-databases.sql

Egy külön fájlba mentett adatbázis visszaállításakor a következőképpen fest a parancs:

# mysql -u#u# -p#p# db_name < db_name.sql

Amennyiben az adatbázis mentés sql fájljában nem szerepel a CREATE DATABASE parancs, akkor az adatbázist előbb manuálisan létre kell hozni, pl. a következő paranccsal:

mysql> CREATE DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Megjegyzés: Figyeljen arra, hogy a nagy index táblákat tartalmazó adatbázisok visszaolvasás előtt, legyen elegendő szabad helye  tmpdir változóban beállított útvonalon.