Ghid de Backup și Disaster Recovery: mysqldump, Binary Logs și Point-in-Time Recovery în MySQL

Strategii de protecție a datelor în producție: backup logic cu mysqldump fără blocarea tabelelor, gestionarea fișierelor Binary Log și restaurarea datelor până la o secundă specifică (Point-in-Time Recovery - PITR).

Sintaxă
mysqldump --single-transaction --source-data=2 ... | mysqlbinlog --start-datetime=... binlog.000001

Un plan robust de salvare și recuperare în caz de dezastru (Disaster Recovery) este piatra de temelie a oricărei infrastructuri de producție. Pierderile de date pot apărea dintr-o pană hardware, un ransomware sau o simplă eroare umană (DROP TABLE sau DELETE fără clauza WHERE). Acest ghid explică cum să implementați o strategie completă compusă din backup-uri complete consistente și jurnale binare (Binary Logs) pentru a recupera datele până la milisecunda dinaintea incidentului.

1. Comanda standard de aur pentru mysqldump în producție
# Executarea unui backup complet InnoDB fără a bloca traficul web (fără downtime!)
mysqldump \
    --user=dexter_admin \
    --password \
    --single-transaction \
    --quick \
    --routines \
    --triggers \
    --events \
    --source-data=2 \
    --hex-blob \
    numebd | gzip > /backups/mysql_numebd_$(date +%F_%H%M%S).sql.gz

De ce sunt esențiale aceste flag-uri:

Opțiune mysqldump Rol & Importanță Critică
--single-transaction Pornește o tranzacție cu nivelul REPEATABLE READ. Permite salvarea unei stări perfect consistente a tuturor tabelelor InnoDB fără a emite LOCK TABLES! Aplicația web poate continua să scrie și să citească liber în timpul dump-ului.
--quick Forțează mysqldump să citească rândurile pe măsură ce sosesc din server, în loc să încarce tot tabelul în memoria RAM a clientului. Previne blocarea memoriei pe tabele de zeci de gigaocteți.
--source-data=2
(anterior --master-data=2)
Scrie în header-ul fișierului de dump poziția exactă a fișierului binar log în momentul tranzacției (ex: -- CHANGE REPLICATION SOURCE TO SOURCE_LOG_FILE='binlog.000045', SOURCE_LOG_POS=789123;) sub formă de comentariu. Acest rând este esențial pentru PITR!
--routines --triggers --events Include procedurile stocate, funcțiile, trigger-ele și joburile programate în backup.
--hex-blob Descarcă coloanele binare (BLOB, VARBINARY, imagini) în format hexazecimal, prevenind coruperea de caractere speciale la restaurare.

Ce sunt Binary Logs și de ce sunt obligatorii?

Fișierele Binary Log (binlog) înregistrează toate evenimentele care modifică starea bazei de date (instrucțiuni DDL precum CREATE TABLE și instrucțiuni DML precum INSERT, UPDATE, DELETE). Fără binlog activat, un backup realizat la ora 02:00 noaptea înseamnă că dacă serverul pică la 15:00, ați pierdut ireversibil 13 ore de activitate!

Pentru activare, asigurați-vă că aveți în /etc/my.cnf sau mysql.cnf:

[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
binlog_expire_logs_seconds = 604800  # Păstrează logurile timp de 7 zile
sync_binlog = 1                      # Scriere sincronă pe disc la fiecare commit (fiabilitate maximă)

Scenariu Real: Restaurare Point-in-Time Recovery (PITR)

Imaginați-vă următorul incident: la ora 14:35:22, un dezvoltator a rulat din greșeală pe producție DELETE FROM clienti;. Ultimul backup complet automat a fost generat noaptea trecută la ora 02:00:00.

Pașii de restaurare la milisecundă
# Pasul 1: Izolăm baza de date și restaurăm ultimul backup complet nocturn
gunzip < /backups/mysql_numebd_2026-10-24_020000.sql.gz | mysql -u root -p numebd

# Pasul 2: Citim poziția de pornire din dump-ul nocturn
grep "CHANGE REPLICATION SOURCE" /backups/mysql_numebd_2026-10-24_020000.sql
# Output: SOURCE_LOG_FILE='binlog.000012', SOURCE_LOG_POS=415;

# Pasul 3: Extragem toate modificările din binlog începând de la poziția respectivă
# și ne oprim EXACT cu o secundă înainte de comanda dezastruoasă (ora 14:35:21)
mysqlbinlog \
    --start-position=415 \
    --stop-datetime="2026-10-24 14:35:21" \
    --database=numebd \
    /var/log/mysql/binlog.000012 /var/log/mysql/binlog.000013 > /tmp/recuperare_tranzactii.sql

# Pasul 4: Aplicăm tranzacțiile salvate
mysql -u root -p numebd < /tmp/recuperare_tranzactii.sql

# Datele au fost recuperate complet fără comanda distructivă de DELETE!

Verificarea și Automatizarea Backup-urilor

Un backup care nu este testat periodic nu oferă nicio garanție. Implementați un script automat (de exemplu un cron săptămânal) care descarcă cel mai recent fișier de dump, îl restaurează pe o instanță de test/staging izolată, execută interogări de integritate (CHECK TABLE) și raportează succesul pe Slack/Email.