Gdzie naprawdę mieszka schemat bazy
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.
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.
| Tabele | 46 | 30 z CREATE TABLE w repozytorium, 16 bez |
| Indeksy wtórne | 43 | 32 tworzone przez kod z repozytorium, 11 tylko w działającej bazie |
| Skrypty migracyjne | 109 | pod kontrolą wersji |
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.