Realizarea periodică a copiilor de siguranță (backup) pentru bazele de date reprezintă o măsură de securitate fundamentală pentru orice administrator de sistem sau dezvoltator web. Dacă beneficiezi de acces SSH pe serverul tău, poți automatiza complet acest proces printr-un script de tip Bash care extrage conținutul fiecărei baze de date cu ajutorul utilitarului mysqldump și îl arhivează într-un format comprimat de înaltă eficiență.
Script Bash pentru backup automatizat și arhivare TBZ
Formatul de arhivă comprimată .tbz (sau .tar.bz2, care utilizează algoritmul bzip2) oferă o rată excelentă de compresie pentru datele de tip text generat de bazele de date relaționale. În practică, un export SQL necomprimat de 1,5 GB poate fi redus frecvent la aproximativ 150 MB, economisind spațiu critic pe disc și reducând timpul de transfer.
Iată scriptul optimizat pentru efectuarea copiilor de siguranță pe mai multe domenii și baze de date:
#!/bin/bash
#####
# Configurare parametri de lucru
#####
# Listă cu numele domeniilor (utilizate ca subdirectoare de ieșire)
domains=(domeniu1 domeniu2 domeniu3)
# Listă corespondentă cu numele bazelor de date din MySQL
sqldbs=(baza1 baza2 baza3)
# Directorul rădăcină unde se vor salva arhivele de backup
opath="/backup/mysql/"
# Gazda serverului MySQL (de regulă localhost)
mysqlhost="localhost"
# Utilizatorul MySQL cu drepturi de citire pe bazele de date
username="root"
# Parola asociată utilizatorului MySQL
password="parola_ta_aici"
#####
# Sfârșitul parametrilor configurabili
#####
# Șablonul de dată atașat fișierului arhivat (LL-ZZ-AAAA)
suffix=$(date +%m-%d-%Y)
# Parcurgerea fiecărei baze de date din listă
for (( i = 0 ; i < ${#sqldbs[@]} ; i++ )); do
# Determinarea căii directorului destinație
cpath="${opath}${domains[$i]}"
# Verificarea și crearea directorului dacă nu există
if [ ! -d "$cpath" ]; then
echo "Creare director de destinație: $cpath"
mkdir -p "$cpath"
fi
# Realizarea exportului SQL prin mysqldump
echo "Exportare bază de date: ${sqldbs[$i]}..."
mysqldump -c -h "$mysqlhost" --user="$username" --password="$password" "${sqldbs[$i]}" > "${cpath}/${sqldbs[$i]}_${suffix}.sql"
# Arhivarea și compresia fișierului prin bzip2
echo "Compresie în format .tbz..."
tar -cjvf "${cpath}/${sqldbs[$i]}_${suffix}.tbz" -C "$cpath" "${sqldbs[$i]}_${suffix}.sql"
# Eliminarea fișierului brut .sql pentru eliberarea spațiului pe disc
rm "${cpath}/${sqldbs[$i]}_${suffix}.sql"
done
echo "Toate copiile de siguranță au fost generate cu succes."
Explicația parametrilor și cerințe de sistem
- Drepturi de acces: Utilizatorul de MySQL specificat în variabila
usernametrebuie să dețină privilegii suficiente pe toate bazele de date incluse în matriceasqldbs(în special drepturi de tipSELECT,LOCK TABLESșiSHOW VIEW). - Opțiunea
-cîn mysqldump: Forțează generarea comenzilorINSERTcomplete, specificând explicit numele coloanelor pentru fiecare înregistrare, ceea ce crește compatibilitatea la restaurare chiar dacă schema tabelelor a suferit modificări ulterioare. - Compresia
tar -cjvf: Fanionul-jindică utilizarea utilitarului bzip2 pentru a obține o rată superioară de compresie față de formatul gzip convențional.
Automatizarea procesului prin Cron
Pentru ca backup-ul să se ruleze automat în fiecare noapte fără intervenție manuală, poți adăuga o intrare în tabela de planificare crontab a serverului:
# Deschiderea editorului crontab
crontab -e
# Executarea scriptului în fiecare noapte la ora 02:30
30 2 * * * /bin/bash /cale/catre/backup_mysql.sh > /var/log/backup_mysql.log 2>&1
Bune practici de securitate
Pentru a evita afișarea parolei în lista proceselor active de sistem (prin comanda ps), este recomandat să configurezi fișierul protejat ~/.my.cnf cu permisiuni restrictive (chmod 600 ~/.my.cnf), permițând utilitarului mysqldump să citească datele de autentificare fără a le expune în linia de comandă a scriptului.
foarte util, si le arunca pe toate intr-un singur fisier?
nu! asta era si ideea! face pentru fiecare baza de date cate un fisier.
daca se buseste doar o baza de date? Le repui pe toate?
da, asa e. nu m-am mai uitat sa analizez codul…