MySQL adatbázisok mentése

Nemtudom ki hogy van vele, én általában az egész adatbázist, annak minden adatbázisával és táblájával együtt szoktam  menteni.
Persze visszaállításkor valahogy meg kell oldani, hogy csak az a bizonyos adatbázis, esetleg csak egy táblája legyen visszaállítva.
Már azzal megkönnyítem a helyzetem, ha az adatbázisszerverről külön- külön mentem az adatbázisokat, hiszenen így visszaállításkor nem kell a másikakkal foglalkozni, egyszerűbb a helyzet.

Régebben mindig úgy állítottam be a MySQL mentését, hogy létrehoztam egy felhasználót, akinek csak select és lock table jogosultsága volt minden adatbázisra és csak localhoston jelentkezhet be.
Ez körülményes, viszont talán a legbiztonságosabb megoldás.

Ennél egy sokkal kényelmesebb és jól beállított fájl jogosultság után biztonságos  megoldást mutatok. Arra figyelni kell, hogy annak akinek feltétlenül nem szükséges, ne módosíthassa a szkriptet, mert a debian-sys-maint felhasználó teljes jogosultsággal bír az adatbázisban,

A szkript működése szavakban:

  • Minden adatbázisról visszamenőleg az előző 14 nap mentését tartja meg.
  • Első körben lekérdezi a helyi kiszolgálón az adatbázisokat (show databases;) majd  a mysqldump paranccsal mentést készít róluk . Természetesen tömöríti  a mentést.
  • Mint látható minden adatbázist lement, kivéve egyet, az information_schema nevűt. Ez ugyanis nem tartalmaz olyan adatot, ami máshol ne lenne elérhető, MySQL metaadatokat tartalmaz.
  • A mysql adatbázist sem mentjük, mivel onnan csak a felhasználói adatokra és jogosultságokra van szükség, azt pedig  külön mentjük.
  • A korábbi mentések törlése find-del történik, így ha kimarad egy mentés, akkor sem maradnak régi fájlok.
  • Az adatbázisok struktúrájáról külön készítünk mentést. Ebben a táblák, view táblák, tárolt eljárások és függvények is bent vannak.
  • Adatbázisonként és adattáblánként külön fájlba mennek az adatok. Ez visszatöltéskor könnyíti meg az ember életét, ha csak egy-egy tábla kell.
  • A MySQL felhasználók és jogosultságok mentése is ezzel a szkripttel történik. Így könnyű visszaállítani szükség esetén.
Az alábbi egy, már sokszor változtatott MySQL adatbázis mentő szkript sokadik verziója:

#!/bin/bash
# Ennyi ideig őrizzük a mentést:
BACKUPTIME=14
# Ide mentünk:
DIRECTORY=/backup/MySQL

#------------------------------------- Az alábbiakat ne módosítsd!
TODAY=`date +"%Y-%m-%d"`
MYCONFIG=" --defaults-file=/etc/mysql/debian.cnf  --skip-column-names "
MYCONFIG_BACKUP=" --defaults-file=/etc/mysql/debian.cnf --opt -Q --routines --triggers -e --skip-add-locks "

for DBNAME in `mysql $MYCONFIG -e "show databases" | grep -v -E 'information_schema|mysql' `
do
        mkdir -p $DIRECTORY/$TODAY/$DBNAME
        mysqldump $MYCONFIG_BACKUP $DBNAME  --no-data  | bzip2 > $DIRECTORY/$TODAY/$DBNAME/mysql_dump.$DBNAME.structure.bz2
        for DBTABLE in `mysql $MYCONFIG $DBNAME -e "show tables"`
        do
                mysqldump $MYCONFIG_BACKUP $DBNAME $DBTABLE  | bzip2 > $DIRECTORY/$TODAY/$DBNAME/mysql_dump.$DBNAME.$DBTABLE.bz2
        done
done

# SQL jogosultságok mentése:

mysql $MYCONFIG --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql $MYCONFIG --skip-column-names -A | sed 's/$/;/g' | bzip2 > $DIRECTORY/$TODAY/grants.bz2

# Régi mentések törlése
find  $DIRECTORY -maxdepth 1 -mtime +$BACKUPTIME -type d -exec rm -rf {} \;


Várom a véleményeket


Kulcsszavak: Linux, MySQL, mentés, backup, script, Cron
msandor2012-07-30 14:13:57
Szia! Tetszett, de ha módosítod ezt a sort: for DBTABLE in `mysql $MYCONFIG -e "show databases" | tail -n +2 | grep -v information_schema` akkor elhagyható az első if-then
Kiss Péter2012-07-30 18:14:19
Igazad van, Köszi
tom2016-11-01 20:28:39
Szia, régi ám hasznos cikk számomra is, viszont OpenSuse alatt nincs /etc/mysql/debian.cnf fájl. Milyen formában tudom helyettesíteni a szkriptben az onnan bekért paramétereket? Köszönöm.
Kiss Péter2016-11-01 21:25:42
Hello Ez Debian / Ubuntu specifikus. Suse esetén nincs debian-sys-maint user, aminek a jogosultságaival a mentést el lehet végezni. Külön felhasználót hoznék létre és akár mehet a /root/.my.cnf alá kb így: [client] host = localhost user = user password = pass
tom2016-11-02 20:16:39
Szia, köszi a gyors választ. Kipróbáltam, létrehoztam a fájlt, rootként jelszóval és új mysql felhasználóval jelszó nélkül is, chmod 777-el a socket fájlra-ra is, de sajnos "Cant'connect to local mysql server through socket" hibával megszakad.

Új hozzászólás: