Kde ve skutečnosti žije schéma databáze
Vše, co tato služba dělá, je ve správě verzí. Tedy aspoň kód. Databáze, na které běží, má 32 tabulek a 15 z nich nemá v repozitáři nikde definici — žádný CREATE TABLE, žádný soubor se schématem, nic. Dump obnoví všech 32 i s neporušenou strukturou; co repozitář nemá, je druhá, nezávislá kopie té struktury.
Tato čísla pocházejí z porovnání živé databáze se 736 soubory a 5 671 710 znaky repozitáře. Nejsou to odhady.
Jak se ztratí půlka schématu
Není to nedbalost, a právě proto stojí za to to sepsat. Každý jednotlivý krok byl rozumný.
Tabulky vytvořené dřív, než existoval současný kód, nebyly nikdy zapsány, protože tehdy prostě byly. Tabulky přidané od té doby přišly přes migrační skripty a ty skripty jsou v repozitáři — odtud pochází těch 17 definic. Sloupce přidané později vznikly jednořádkovým ALTER TABLE napsaným do příkazového řádku, protože napsat ho bylo rychlejší než psát skript pro změnu, která trvala sekundu.
Nejhorší případ jsou indexy. Index se přidá, když je něco pomalé, v okamžiku, kdy je to pomalé, a problém okamžitě vyřeší. Nezůstane po něm žádný artefakt, nic ke kontrole, nic, co by selhalo, když se na něj zapomene. Jedenáct z dvaatřiceti sekundárních indexů tu existuje přesně z tohoto důvodu a nikde nejsou zaznamenány.
Tabulka se samotnými počítadly, 166 438 řádků, patří mezi těch patnáct bez definice v repozitáři.
Co se skutečně rozbije
Nic moc, až do jednoho konkrétního okamžiku: když se databáze obnovuje z dumpu.
Dump nese strukturu, takže přímá obnova je v pořádku. Nebezpečná je každá cesta, která tabulku znovu sestaví, místo aby ji obnovila — přesun na jiný stroj, import vybraných tabulek, znovuvytvoření tabulky ze skriptu. Data se vrátí a indexy potichu ne. Nic neselže. Dotazy vracejí správné odpovědi. Jen jim to trvá déle a příčina je neviditelná, protože jediným záznamem o tom, jaký index to byl, je stroj, který ho už nemá.
To je způsob selhání, který stojí za to pojmenovat: chybějící index nevyvolá chybu, vyvolá pomalejší správnou odpověď. Neexistuje na to test, protože testy projdou.
Co s tím mezitím děláme
Schéma dnes v repozitáři není a to je přesný popis stavu. To, co je zavedeno, je užší než úplná oprava a pokrývá případ, který skutečně něco stojí:
Dump před čímkoli destruktivním, uložený mimo webový kořen. Obnova, která byla aspoň jednou skutečně provedena, místo aby se předpokládala. A krátký seznam indexů, o nichž je známo, že existují jen v běžící databázi, kontrolovaný po každé obnově — protože stroje se lze zeptat, jaké indexy má, a odpověď porovnat s tou z minulého dotazu.
Obecná verze platí nejen pro databáze. Pokud část systému existuje jen v běžícím systému, neexistuje z ní druhá kopie. Otázka, kterou stojí za to položit u každého kusu infrastruktury, nezní, zda je zálohovaný, ale co by nešlo znovu sestavit z repozitáře, kdyby stroj zmizel. Tady je odpovědí patnáct tabulek a jedenáct indexů, zjistit to trvalo jedno odpoledne a je to seznam, ne neznámá.
Aktualizace – září 2026
Pět dní po zveřejnění tohoto článku byl pracovní adresář commitnut: 26 souborů a 4 058 řádků, mezi nimi jedenáct migračních skriptů napsaných mezi 28. srpnem a 1. zářím, které do té doby existovaly jen na běžícím stroji. To byla ta snadná polovina — kód, který byl napsán, ale nikdy zaznamenán.
Měření bylo 1. září 2026 zopakováno stejným způsobem: živá databáze proti všemu, co sleduje git.
| Tabulky | 46 | 30 s CREATE TABLE v repozitáři, 16 bez něj |
| Sekundární indexy | 43 | 32 vytváří kód v repozitáři, 11 jen v běžící databázi |
| Migrační skripty | 109 | ve správě verzí |
Číslo, na kterém záleží, se nepohnulo. Dne 27. srpna existovalo jedenáct sekundárních indexů jen v běžící databázi. K 1. září jich je stále jedenáct. Mezitím přibylo dalších jedenáct indexů a každý z nich přišel s migračním skriptem: zvyk se změnil, dluh ne.
Těch jedenáct sedí na pěti tabulkách — počítadla, jazyky, odkazující stránky, seznam vyloučení a protokol událostí. Všech pět je starších než současný kód, a právě proto se k nim nikdy nic nezapsalo. Napsat soubor teď by znamenalo rekonstruovat z běžícího serveru to, co bylo před lety napsáno do příkazového řádku.
Stav ze srpna tedy platí. Schéma v repozitáři stále není a obnova, která tabulku znovu sestaví, místo aby ji obnovila, by stále bez jediného slova zahodila jedenáct indexů. Změnilo se něco užšího: vše, co přibylo od té doby, za sebou nechalo soubor.