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