🎯 Cele lekcji

📥

1. Przywracanie z pliku .sql

# Pełne przywracanie bazy z pliku SQL
mysql -u root -p sklep < backup_sklep.sql

# Jeśli baza nie istnieje — najpierw utwórz
mysql -u root -p -e "CREATE DATABASE sklep CHARACTER SET utf8mb4;"
mysql -u root -p sklep < backup_sklep.sql

# Przywracanie z pliku skompresowanego
gunzip < backup_sklep.sql.gz | mysql -u root -p sklep
# lub:
zcat backup_sklep.sql.gz | mysql -u root -p sklep

# Przywracanie z podglądem postępu (pv)
pv backup_sklep.sql | mysql -u root -p sklep

# Przywracanie wewnątrz klienta mysql
mysql -u root -p
mysql> USE sklep;
mysql> SOURCE /ścieżka/do/backup_sklep.sql;
Przed przywróceniem do istniejącej bazy rozważ czy chcesz nadpisać dane (mysql baza < backup.sql) czy wpierw usunąć starą bazę (DROP DATABASE sklep; CREATE DATABASE sklep;).
🔍

2. Przywracanie pojedynczej tabeli

# Wyodrębnij definicję i dane jednej tabeli z pełnego dumpa
# Wyodrębnij CREATE TABLE dla tabeli 'produkty'
grep -A 100 "Table structure for table .produkty." backup.sql | \
  grep -B 1 -A 100 "CREATE TABLE" | \
  awk '/CREATE TABLE/,/ENGINE=/' > produkty_struktura.sql

# Wyodrębnij dane (INSERT INTO) dla tabeli 'produkty'
grep "^INSERT INTO .produkty." backup.sql > produkty_dane.sql

# Przywróć tylko tę tabelę
mysql -u root -p sklep < produkty_struktura.sql
mysql -u root -p sklep < produkty_dane.sql

# Alternatywnie: mysqldump z jedną tabelą od razu
mysqldump -u root -p sklep produkty > produkty_backup.sql
mysql -u root -p sklep < produkty_backup.sql
⏱️

3. Point-in-Time Recovery — Binary Log

Binary Log (binlog) rejestruje wszystkie zmiany danych w MySQL. Point-in-time recovery pozwala przywrócić bazę do dowolnego momentu w przeszłości (nie tylko do momentu backupu).
# Sprawdź czy binlog jest włączony
mysql> SHOW VARIABLES LIKE 'log_bin';
mysql> SHOW BINARY LOGS;
mysql> SHOW BINLOG EVENTS IN 'mysql-bin.000001' LIMIT 20;

# Krok 1: Przywróć ostatni pełny backup
mysql -u root -p sklep < backup_sklep_20240101.sql

# Krok 2: Zastosuj zmiany z binlog od momentu backupu do awarii
mysqlbinlog --start-datetime="2024-01-01 02:30:00" \
            --stop-datetime="2024-01-15 14:22:00" \
            mysql-bin.000001 mysql-bin.000002 | mysql -u root -p

# Krok 3: Sprawdź wynik
mysql -u root -p sklep -e "SELECT COUNT(*) FROM zamowienia;"
Point-in-time recovery wymaga wcześniejszego włączenia binary log w konfiguracji MySQL: log_bin = /var/log/mysql/mysql-bin.log w pliku my.cnf.
🚨

4. Scenariusze awarii i procedury odtwarzania

Scenariusz awariiMetoda odtwarzaniaCzas RTO
Przypadkowy DELETE/UPDATE bez WHEREPrzywrócenie z najnowszego backupu + binlogMinuty–godziny
Uszkodzenie tabeli (crash)REPAIR TABLE lub przywrócenie z backupuMinuty
Awaria dysku twardegoPrzywrócenie z backupu offsite na nowy serwerGodziny
Błąd migracji (ALTER TABLE)ROLLBACK lub przywrócenie z backupu z przed migracjiMinuty
DROP TABLE / DROP DATABASEPrzywrócenie z backupu + binlog (o ile DROP jest w binlogu)Godziny

Kolejność kroków przywracania bazy po awarii:

  1. Zidentyfikuj przyczynę awarii i zabezpiecz logi
  2. Zatrzymaj zapis do bazy (tryb maintenance)
  3. Przywróć ostatni sprawny backup
  4. Zastosuj binary log do momentu awarii (jeśli możliwe)
  5. Zweryfikuj integralność danych (CHECK TABLE, COUNT, sumy)
  6. Uruchom aplikację z powrotem
  7. Dokumentuj incydent i ulepsz procedury
✏️

Zadania interaktywne

Zadanie 1Quiz: point-in-time recovery

Która metoda pozwala przywrócić bazę danych do dokładnie określonego momentu w przeszłości (nie tylko do momentu backupu)?

  • mysqldump z opcją --single-transaction
  • Przywrócenie backupu przez phpMyAdmin
  • mysqlbinlog + binary log — pozwala odtworzyć wszystkie zmiany od backupu do awarii
  • ROLLBACK w transakcji
Zadanie 2Kolejność kroków przywracania

Który jest prawidłowy pierwszy krok przywracania bazy po awarii (przypadkowy DROP TABLE)?

  • Natychmiast uruchom ponownie serwer MySQL
  • Zidentyfikuj przyczynę awarii, zabezpiecz logi i zatrzymaj dalszy zapis do bazy
  • Usuń wszystkie dane z bazy i zacznij od nowa
  • Odinstaluj i zainstaluj MySQL od nowa
Zadanie 3Wskaż problem w poleceniu przywracania

Które polecenie przywracania jest BŁĘDNE?

  • mysql -u root -p sklep < backup.sql
  • gunzip < backup.sql.gz | mysql -u root -p sklep
  • mysql -u root -p sklep > backup.sql (chcemy przywrócić, nie eksportować)
  • mysql -u root -p -e "SOURCE backup.sql;" sklep

📌 Zapamiętaj