Diagnozowanie i naprawa bazy danych (logi, narzędzia naprawcze)

Optymalizacja, naprawa indeksów, logi błędów — INF.03

Teoria Diagnoza błędów i naprawa bazy danych

Logi serwera bazy danych zapisują informacje o pracy serwera: start, błędy, ostrzeżenia oraz wolne zapytania. Administrator korzysta z nich, gdy aplikacja przestaje działać poprawnie lub wyniki są podejrzane.

  • Error log – zawiera błędy krytyczne (np. uszkodzoną tabelę, błędy silnika, problemy z kluczami obcymi).
  • Slow query log – zapisuje zapytania przekraczające zadany czas, pomaga znaleźć fragmenty aplikacji wymagające indeksów lub zmian zapytań.
  • General query log – może zapisywać wszystkie zapytania, jest przydatny podczas debugowania, ale zwykle wyłączony w produkcji.

Uszkodzone tabele i indeksy wpływają na stabilność bazy. Mogą powodować błędy odczytu, losowe „wywalanie się” zapytań albo bardzo wolne działanie raportów. Najczęstsze przyczyny to awarie zasilania, błędy dysku lub nagłe zatrzymanie serwera.

Narzędzia naprawcze w MySQL:

  • CHECK TABLE – kontrola spójności tabeli.
  • REPAIR TABLE – próba naprawy uszkodzonej tabeli.
  • OPTIMIZE TABLE – porządkuje dane, przebudowuje indeksy, zwalnia nieużywane miejsce.
  • mysqlcheck – narzędzie konsolowe do wykonania tych operacji na wielu tabelach lub bazach naraz.

Indeksy i ich optymalizacja:

  • Indeks przyspiesza wyszukiwanie (jak spis treści), ale wymaga dodatkowego miejsca i aktualizacji przy modyfikacji danych.
  • Najwięcej zyskują kolumny często używane w WHERE, JOIN i ORDER BY.
  • Zbyt wiele indeksów spowalnia INSERT/UPDATE/DELETE, dlatego trzeba szukać kompromisu między szybkością odczytu i zapisu.

Kompaktowanie w Access:

  • Access przechowuje dane w jednym pliku – po wielu operacjach plik puchnie, a część miejsca staje się nieużywana.
  • „Kompaktuj i napraw bazę danych” porządkuje plik, usuwa niepotrzebne dane i często zmniejsza rozmiar bazy.
  • Przed kompaktowaniem warto wykonać kopię bezpieczeństwa pliku bazy.

Ćwiczenie 1 Analiza logów błędów bazy danych

Teoria: Error log to dziennik, w którym serwer zapisuje błędy krytyczne i ostrzeżenia. Widzisz tam m.in. informacje o uszkodzonych tabelach, błędach uruchamiania serwera lub problemach z kluczami obcymi. Gdy aplikacja „milczy”, to właśnie log błędów często jako pierwszy podpowiada, co się stało.

Krok po kroku:
  1. Znajdź plik error.log lub „Dziennik zdarzeń” Access.
  2. Sprawdź komunikaty o błędach przy uruchamianiu serwera lub wykonywaniu zapytań.
  3. Odszukaj powtarzające się problemy oraz daty/godziny ich występowania, aby porównać je z działaniem aplikacji.
2025-11-03T08:13:21Z [ERROR] Table 'szkola.uczniowie' is marked as crashed and should be repaired
2025-11-03T08:13:21Z [Warning] Checking table:   'szkola.uczniowie'
2025-11-03T09:45:54Z [ERROR] Cannot add foreign key constraint (missing matching index)

Ćwiczenie 2 Identyfikacja wolnych zapytań (slow query log)

Teoria: Slow query log zapisuje zapytania, które działają dłużej niż określony próg (np. 2 sekundy). Dzięki temu administrator widzi, które SELECT‑y, JOIN‑y lub podzapytania są za wolne i wymagają indeksów lub zmiany konstrukcji zapytania. Czasem jedno wolne zapytanie potrafi „przydusić” całą aplikację.

Zadanie: Odczytaj wpis z logu „slow query” i wskaż, które zapytanie wymaga optymalizacji.
# Time: 2025-11-05T10:22:31
# User@Host: nauczyciel[nauczyciel] @ localhost []
# Query_time: 4.215  Lock_time: 0.000  Rows_sent: 1500  Rows_examined: 250000
SELECT * FROM oceny WHERE nazwisko = 'Kowalski';

To zapytanie prawdopodobnie wymaga indeksu na kolumnie nazwisko, bo bez indeksu serwer musi przeskanować dużą liczbę wierszy (Rows_examined).

Ćwiczenie 3 Naprawa uszkodzonej tabeli i indeksów (MySQL)

Teoria: Polecenia CHECK TABLE, REPAIR TABLE i OPTIMIZE TABLE służą do „sprzątania” tabel. CHECK sprawdza spójność, REPAIR próbuje naprawić uszkodzoną strukturę danych, a OPTIMIZE przebudowuje indeksy i usuwa „dziury” po usuniętych rekordach. Takie działania najlepiej wykonywać poza godzinami największego obciążenia.

Zadanie: W MySQL napraw uszkodzoną tabelę „uczniowie”, a następnie zoptymalizuj indeksy.
CHECK TABLE uczniowie;
REPAIR TABLE uczniowie;

/* Optymalizacja indeksów po naprawie: */
OPTIMIZE TABLE uczniowie;

Ćwiczenie 4 Naprawa i kompaktowanie bazy w Access

Teoria: Baza Access jest zapisywana w jednym pliku. Częste dodawanie i usuwanie rekordów powoduje „fragmentację” – plik rośnie, a część miejsca staje się nieużywana. Opcja „Kompaktuj i napraw bazę danych” porządkuje strukturę, usuwa nieużywane miejsce i próbuje naprawić proste uszkodzenia. Zawsze warto mieć kopię bazy przed kompaktowaniem.

Opis: W MS Access zastosuj opcję „Kompaktuj i napraw bazę danych”, aby usunąć uszkodzenia i odzyskać miejsce.
Plik → Informacje → Kompaktuj i napraw bazę danych
(Access tworzy skompaktowaną kopię i zastępuje nią pierwotny plik).

Alternatywnie:
Narzędzia bazy danych → Kompaktuj i napraw bazę danych.

Ćwiczenie 5 Przebudowa i optymalizacja indeksów

Teoria: Indeks działa jak spis treści – przyspiesza odczyt, ale spowalnia modyfikacje, bo trzeba aktualizować dodatkowe struktury. Przy bardzo częstych INSERT/UPDATE indeksy mogą się „fragmentować”. Okresowa przebudowa (OPTIMIZE lub kompaktowanie) porządkuje dane, skraca czas wyszukiwania i zmniejsza rozmiar pliku bazy.

Zadanie: W MySQL i Access przebuduj indeksy dla tabeli „oceny”.
-- MySQL:
OPTIMIZE TABLE oceny;

-- Access:
Narzędzia bazy danych → Kompaktuj i napraw bazę danych
(lub osobne narzędzia przebudowy indeksów w nowszych wersjach).

Ćwiczenie 6 Narzędzie konsolowe mysqlcheck

Teoria: mysqlcheck to program konsolowy do konserwacji tabel. Pozwala jednym poleceniem sprawdzić wiele tabel, naprawić je oraz wykonać OPTIMIZE. Dzięki temu administrator nie musi pisać osobno CHECK TABLE dla każdej tabeli – narzędzie „przeleci” po całej bazie lub nawet po wszystkich bazach na serwerze.

Zadanie: Załóż, że baza nazywa się szkola. Jak jednym poleceniem sprawdzić, naprawić i zoptymalizować wszystkie tabele?
# Sprawdzenie, naprawa i optymalizacja wszystkich tabel w bazie "szkola":
mysqlcheck --auto-repair -o szkola -u root -p

# Wszystkie bazy danych:
mysqlcheck --auto-repair -o --all-databases -u root -p

--auto-repair naprawia uszkodzone tabele, a -o wykonuje OPTIMIZE TABLE na każdej z nich.

Quiz Sprawdź wiedzę!

  1. Jak zdiagnozować problem z tabelą lub wolnym zapytaniem?
  2. Jak naprawić błędną lub uszkodzoną tabelę w MySQL (SQL i konsola)?
  3. Jak przebudować i zoptymalizować indeksy w MySQL i Access?
  4. Dlaczego warto korzystać z „slow query log” i „Kompaktuj i napraw”?
  • Sprawdzić log błędów i slow query log, przeanalizować komunikaty i czas wykonania zapytań.
  • Użyć CHECK TABLE, REPAIR TABLE, OPTIMIZE TABLE lub narzędzia mysqlcheck --auto-repair -o.
  • MySQL: OPTIMIZE TABLE; Access: „Kompaktuj i napraw bazę danych”.
  • Bo logi pozwalają znaleźć wąskie gardła, a kompaktowanie i optymalizacja poprawiają wydajność i zmniejszają ryzyko uszkodzeń.

Skróty komend MySQL i Access

Cel MySQL (SQL / konsola) Access
Sprawdzenie tabeli CHECK TABLE uczniowie; Brak bezpośredniego odpowiednika – użyj „Kompaktuj i napraw bazę danych”.
Naprawa tabeli REPAIR TABLE uczniowie;
mysqlcheck --repair szkola
„Kompaktuj i napraw bazę danych” dla całej bazy.
Optymalizacja/indeksy OPTIMIZE TABLE oceny;
mysqlcheck --auto-repair -o szkola
Kompaktowanie pliku bazy porządkuje dane i strukturę indeksów.
Analiza wolnych zapytań slow query log + analiza zapytań wymagających indeksów. Brak slow query log – analizujemy głównie raporty i czas działania formularzy.

Checklista Sprawdź umiejętności

  • Diagnozuję błędy przez logi i komunikaty systemowe (error log, slow query log).
  • Naprawiam i przebudowuję uszkodzone tabele przy użyciu poleceń SQL i narzędzi (mysqlcheck, Access).
  • Optymalizuję indeksy dla wydajności i bezpieczeństwa danych w MySQL i Access.
  • Stosuję narzędzia naprawcze zarówno w środowisku serwera, jak i aplikacji klienckiej (Access).
Materiały: INF.03 — Diagnostyka i naprawa bazy · Autor: Tomasz Puchała © 2025