Где на самом деле живёт схема базы
В этой статье
Всё, что делает эта служба, лежит в системе контроля версий. Код — во всяком случае. База, на которой он работает, — это 32 таблицы, и у 15 из них нигде в репозитории нет описания: ни CREATE TABLE, ни файла схемы, ничего. Резервная копия восстанавливает все 32 вместе с их формой; чего в репозитории нет, так это второй, независимой записи этой формы.
Эти цифры получены сравнением работающей базы с 736 файлами и 5 671 710 знаками репозитория. Это не оценка.
Как теряется половина схемы
Это не небрежность, и именно поэтому стоит записать. Каждый отдельный шаг был разумным.
Таблицы, созданные до нынешнего кода, никогда не были записаны, потому что тогда они просто были. Таблицы, добавленные с тех пор, пришли через миграционные сценарии, и они лежат в репозитории — отсюда те 17 описаний. Столбцы, добавленные позже, приходили однострочным ALTER TABLE, набранным в командной строке, потому что набрать было быстрее, чем писать сценарий ради изменения длиной в секунду.
Хуже всего с индексами. Индекс добавляют, когда что-то медленно, в тот момент, когда медленно, и он чинит это сразу. После него не остаётся ничего: нечего просматривать, нечему упасть, если забыть. Одиннадцать из тридцати двух здешних вторичных индексов существуют ровно поэтому и нигде не записаны.
Таблица, в которой лежат сами счётчики, 166 438 строк, входит в те пятнадцать без описания в репозитории.
Что на самом деле ломается
Немногое — до одного определённого момента: когда базу восстанавливают из выгрузки.
Выгрузка несёт структуру с собой, так что прямое восстановление проходит нормально. Опасен любой путь, который создаёт таблицу заново вместо восстановления: переезд на другую машину, перенос отдельных таблиц, воссоздание из сценария. Данные возвращаются, а индексы молча нет. Ничего не падает. Запросы возвращают правильные ответы. Они просто идут дольше, и причина невидима, потому что единственная запись о том, чем был индекс, лежит на машине, у которой его больше нет.
Вот тот сбой, который стоит назвать: пропавший индекс не даёт ошибки, он даёт более медленный правильный ответ. Проверки на это нет, потому что тесты проходят.
Что мы делаем пока
Схемы в репозитории сегодня нет, и это точное описание состояния. То, что есть, уже полного исправления и покрывает случай, который действительно чего-то стоит:
Выгрузка перед всем разрушительным, хранимая вне веб-каталога. Восстановление, которое действительно однажды проделали, а не предположили. И короткий список, проверяемый после каждого восстановления, тех индексов, о которых известно, что они есть только в работающей базе — ведь машину можно спросить, какие у неё индексы, и сравнить ответ с прошлым разом.
Общая формулировка касается не только баз данных. Если часть системы существует только в работающей системе, второй её копии нет. Вопрос, который стоит задать о любом куске инфраструктуры, звучит не «есть ли резервная копия», а «что нельзя будет собрать заново из репозитория, если эта машина исчезнет». Здесь ответ — пятнадцать таблиц и одиннадцать индексов, на выяснение ушёл день, и это список, а не неизвестное.
Обновление: сентябрь 2026
Через пять дней после этой записи рабочий каталог попал в репозиторий: 26 файлов и 4058 строк, среди них одиннадцать сценариев миграции, написанных с 28 августа по 1 сентября и до того существовавших только на работающей машине. Это была лёгкая половина — код, который написали, но нигде не закрепили.
1 сентября 2026 года измерение повторили тем же способом: работающая база против всего, что знает git.
| Таблицы | 46 | 30 с CREATE TABLE в репозитории, 16 без него |
| Вторичные индексы | 43 | 32 создаются кодом из репозитория, 11 только в работающей базе |
| Сценарии миграции | 109 | под контролем версий |
Число, которое важно, не сдвинулось. 27 августа одиннадцать вторичных индексов не существовали нигде, кроме работающей базы. 1 сентября их по-прежнему одиннадцать. За это время добавились ещё одиннадцать индексов, и каждый пришёл со сценарием миграции: привычка изменилась, долг нет.
Эти одиннадцать сидят на пяти таблицах — счётчиках, языках, ссылающихся страницах, списке исключений и журнале событий. Все пять старше нынешнего кода, и именно поэтому для них никогда ничего не записывали. Написать файл сейчас значило бы восстанавливать с работающего сервера то, что годы назад набрали в командной строке.
Так что положение из августа остаётся прежним. Схемы в репозитории по-прежнему нет, и восстановление, которое строит таблицу заново вместо возврата, всё так же потеряло бы одиннадцать индексов без единого слова. Изменилось меньшее: всё, что добавилось с тех пор, оставило после себя файл.