Kontakt z pomocą

Odpowiadamy e-mailem, zwykle w ciągu dwóch dni.

Google reCAPTCHA sprawdza to zgłoszenie pod kątem nadużyć; dane trafiają do Google. Skrypt ładuje się dopiero po otwarciu formularza.

← Wszystkie wpisy

Gdzie naprawdę mieszka schemat bazy

O treści i jej weryfikacji

W tym artykule

Wszystko, co robi ta usługa, jest w kontroli wersji. Kod owszem. Baza, na której działa, to 32 tabele, a 15 z nich nie ma nigdzie w repozytorium definicji — żadnego CREATE TABLE, żadnego pliku schematu, niczego. Kopia odtwarza wszystkie 32 wraz z kształtem; w repozytorium brakuje drugiego, niezależnego zapisu tego kształtu.

17 tabel zdefiniowanych 15 nigdzie nie zdefiniowanych 21 indeksów tworzy kod 11 tylko w bazie 32 tabele, 32 indeksy wtórne, 0 plików schematu

Te liczby pochodzą z porównania działającej bazy z 736 plikami i 5 671 710 znakami repozytorium. Nie są szacunkiem.

Jak ginie połowa schematu

To nie jest niechlujstwo i właśnie dlatego warto to zapisać. Każdy pojedynczy krok był rozsądny.

Tabele powstałe przed obecnym kodem nigdy nie zostały spisane, bo wtedy po prostu były. Tabele dodane później przyszły przez skrypty migracyjne, a te są w repozytorium — stąd owe 17 definicji. Kolumny dokładane jeszcze później przychodziły jednolinijkowym ALTER TABLE wpisanym w wierszu poleceń, bo wpisanie było szybsze niż napisanie skryptu do zmiany trwającej sekundę.

Najgorzej jest z indeksami. Indeks zakłada się, gdy coś jest wolne, w chwili gdy jest wolne, i naprawia to natychmiast. Nie zostaje po tym żaden wytwór, nic do przejrzenia, nic, co zawiedzie, jeśli się zapomni. Jedenaście z trzydziestu dwóch tutejszych indeksów wtórnych istnieje dokładnie z tego powodu i nigdzie nie jest zapisane.

Tabela, w której siedzą same liczniki, 166 438 wierszy, należy do tych piętnastu bez definicji w repozytorium.

Co naprawdę się psuje

Niewiele, aż do jednej określonej chwili: gdy bazę odtwarza się ze zrzutu.

Zrzut niesie strukturę, więc proste odtworzenie jest w porządku. Niebezpieczna jest każda droga, która buduje tabelę na nowo zamiast ją odtwarzać — przeprowadzka na inną maszynę, wgranie wybranych tabel, odtworzenie ze skryptu. Dane wracają, indeksy po cichu nie. Nic nie zawodzi. Zapytania zwracają właściwe odpowiedzi. Po prostu trwają dłużej, a przyczyna jest niewidoczna, bo jedyny zapis tego, czym był indeks, leży na maszynie, która już go nie ma.

To ten błąd, który warto nazwać: brakujący indeks nie daje błędu, daje wolniejszą poprawną odpowiedź. Nie ma na to testu, bo testy przechodzą.

Co robimy w międzyczasie

Schematu dziś w repozytorium nie ma, i to jest dokładny opis stanu. To, co jest, jest węższe niż pełna naprawa i pokrywa ten przypadek, który naprawdę coś kosztuje:

Zrzut przed każdą rzeczą niszczącą, trzymany poza katalogiem sieciowym. Odtworzenie, które naprawdę raz przeprowadzono, a nie założono. I krótka lista, sprawdzana po każdym odtworzeniu, indeksów, o których wiadomo, że istnieją tylko w działającej bazie — bo maszynę można zapytać, jakie ma indeksy, a odpowiedź porównać z poprzednim razem.

Wersja ogólna dotyczy więcej niż baz danych. Jeśli część systemu istnieje tylko w działającym systemie, drugiej kopii nie ma. Pytanie warte zadania o każdy kawałek infrastruktury brzmi nie „czy jest kopia zapasowa”, lecz „czego nie dałoby się odbudować z repozytorium, gdyby ta maszyna zniknęła”. Tutaj odpowiedź to piętnaście tabel i jedenaście indeksów, ustalenie zajęło popołudnie, a wynik jest listą, a nie niewiadomą.

Aktualizacja: wrzesień 2026

Pięć dni po tym wpisie katalog roboczy trafił do repozytorium: 26 plików i 4058 wierszy, w tym jedenaście skryptów migracyjnych z okresu od 28 sierpnia do 1 września, które do tej pory istniały wyłącznie na działającej maszynie. To była łatwiejsza połowa — kod, który powstał, ale nigdy nie został zapisany.

1 września 2026 pomiar powtórzono tą samą metodą: działająca baza wobec wszystkiego, co zna git.

Tabele4630 z CREATE TABLE w repozytorium, 16 bez
Indeksy wtórne4332 tworzone przez kod z repozytorium, 11 tylko w działającej bazie
Skrypty migracyjne109pod kontrolą wersji
30 tabel zdefiniowanych 16 nigdzie 32 indeksy z plikiem 11 tylko w bazie 46 tabel, 43 indeksy wtórne, 0 plików schematu

Liczba, o którą chodzi, nie drgnęła. 27 sierpnia jedenaście indeksów wtórnych nie istniało nigdzie poza działającą bazą. 1 września nadal jest ich jedenaście. W międzyczasie doszło jedenaście kolejnych indeksów i każdy z nich przyszedł ze skryptem migracyjnym: nawyk się zmienił, dług nie.

Te jedenaście siedzi na pięciu tabelach — licznikach, językach, odsyłaczach, liście wykluczeń i dzienniku zdarzeń. Wszystkie pięć są starsze niż dzisiejszy kod i właśnie dlatego nigdy nic dla nich nie spisano. Napisanie pliku teraz oznaczałoby odtwarzanie z działającego serwera tego, co lata temu wpisano w wierszu poleceń.

Stanowisko z sierpnia pozostaje więc w mocy. Schematu wciąż nie ma w repozytorium, a odtworzenie, które buduje tabelę na nowo zamiast ją przywrócić, nadal zgubiłoby jedenaście indeksów bez słowa. Zmieniło się mniej: wszystko, co doszło od tamtej pory, zostawiło po sobie plik.

Reklama