🎯 Cele lekcji

🗂️

1. Strategia backupu — typy kopii

TypOpisZaletyWady
Pełny (full)Kompletna kopia całej bazyProste przywracanieDuży rozmiar, długi czas
Przyrostowy (incremental)Tylko zmiany od ostatniego backupu (dowolnego)Mały rozmiar, szybkiPrzywracanie wymaga wszystkich backupów po kolei
Różnicowy (differential)Zmiany od ostatniego pełnego backupuKompromis: mniejszy niż full, łatwiejsze przywracanie niż incrementalRośnie z czasem
Retencja backupu to czas przechowywania kopii. Typowa strategia 3-2-1: 3 kopie, na 2 różnych mediach, 1 kopia poza siedzibą (offsite/cloud).
⚙️

2. mysqldump — opcje zaawansowane

# Backup z opcjami dla InnoDB (produkcyjny)
mysqldump -u root -p \
  --single-transaction \    # spójny snapshot bez blokady tabel (InnoDB)
  --routines \              # dołącz procedury i funkcje
  --triggers \              # dołącz wyzwalacze
  --events \                # dołącz zaplanowane zdarzenia
  --hex-blob \              # dane binarne jako HEX (bezpieczniejsze)
  sklep > backup_$(date +%Y%m%d_%H%M%S).sql

# Backup z kompresją gzip
mysqldump -u root -p --single-transaction sklep | \
  gzip > backup_sklep_$(date +%Y%m%d).sql.gz

# Backup zdalnego serwera
mysqldump -u root -p -h 192.168.1.100 sklep > backup_remote.sql

# Weryfikacja pliku backup (sprawdź rozmiar i pierwsze linie)
ls -lh backup_sklep.sql
head -20 backup_sklep.sql
--single-transaction jest kluczowe dla tabel InnoDB — umożliwia spójny backup bez blokowania tabel (transakcja READ UNCOMMITTED nie jest potrzebna). Bez tej opcji mysqldump blokuje tabele podczas exportu.

3. Automatyzacja backupu (cron)

# Skrypt backup_db.sh
#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="sklep"
DB_USER="backup_user"
DB_PASS="HasloBackup123"

mkdir -p "$BACKUP_DIR"

mysqldump -u "$DB_USER" -p"$DB_PASS" \
  --single-transaction \
  --routines \
  --triggers \
  "$DB_NAME" | gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"

# Usuń backupy starsze niż 30 dni
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +30 -delete

echo "Backup zakończony: ${DB_NAME}_${DATE}.sql.gz"

# Wpis w crontab (crontab -e):
# Codziennie o 2:00 w nocy
0 2 * * * /scripts/backup_db.sh >> /var/log/backup.log 2>&1

# Co tydzień (niedziela 3:00) pełny backup z innymi opcjami
0 3 * * 0 /scripts/full_backup.sh >> /var/log/backup.log 2>&1
Format cron: minuta godzina dzień-miesiąca miesiąc dzień-tygodnia polecenie. Gwiazdka * oznacza "każdy/a". 0 2 * * * = codziennie o 2:00.

4. Weryfikacja kopii zapasowych

# Sprawdź plik backup
ls -lh backup_sklep.sql.gz           # rozmiar > 0
gunzip -t backup_sklep.sql.gz        # test integralności
zcat backup_sklep.sql.gz | tail -5   # końcowe linie (powinny zawierać "Dump completed")

# Test przywrócenia na serwerze testowym
mysql -u root -p -e "CREATE DATABASE sklep_test;"
mysql -u root -p sklep_test < backup_sklep.sql
mysql -u root -p sklep_test -e "SELECT COUNT(*) FROM klienci;"

# Porównaj liczbę tabel
mysql -u root -p sklep -e "SHOW TABLES;" | wc -l
mysql -u root -p sklep_test -e "SHOW TABLES;" | wc -l
Backup bez testowania = brak backupu! Regularnie testuj przywracanie kopii na serwerze testowym. Odkrycie, że backup jest uszkodzony, właśnie wtedy gdy go potrzebujesz, to katastrofa.
✏️

Zadania interaktywne

Zadanie 1Quiz: --single-transaction w mysqldump

Co oznacza opcja --single-transaction w poleceniu mysqldump?

  • Exportuje tylko jedną tabelę z bazy
  • Blokuje wszystkie tabele na czas backupu, żeby żaden użytkownik nie mógł pisać
  • Zapewnia spójny snapshot tabel InnoDB bez blokowania — używa transakcji zamiast blokad tabel
  • Eksportuje bazę jako jedną linię SQL (bez podziałów linii)
Zadanie 2Dopasuj typ backupu do scenariusza
Codziennie rano — szybki backup tylko zmian z ostatniej doby
Co tydzień w niedzielę — kompletna kopia wszystkich danych
Codziennie — backup zmian od ostatniego pełnego backupu (łatwiejsze przywracanie niż incremental)
Zadanie 3Uzupełnij wpis cron dla backupu o 3:00

Uzupełnij brakujące pola w wpisie cron dla backupu codziennie o godzinie 3:00:

___ ___ * * * /scripts/backup_db.sh
  • 3 0 (minuta=3, godzina=0 → o 00:03)
  • 0 3 (minuta=0, godzina=3 → o 03:00)
  • 3 * (minuta=3, godzina=każda → co godzinę o :03)
  • * 3 (minuta=każda, godzina=3 → przez całą 3. godzinę)

📌 Zapamiętaj