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.
#!/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