Де насправді живе схема бази
У цій статті
Усе, що робить ця служба, лежить у системі контролю версій. Код — принаймні. База, на якій він працює, — це 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 вересня їх так само одинадцять. За цей час додалося ще одинадцять індексів, і кожен прийшов зі сценарієм міграції: звичка змінилася, борг ні.
Ці одинадцять сидять на п’яти таблицях — лічильниках, мовах, сторінках-джерелах, списку винятків і журналі подій. Усі п’ять старші за нинішній код, і саме тому для них ніколи нічого не записували. Написати файл тепер означало б відновлювати з працюючого сервера те, що роки тому набрали в командному рядку.
Тож становище з серпня лишається тим самим. Схеми в репозиторії й далі немає, а відновлення, яке будує таблицю наново замість повернути її, так само втратило б одинадцять індексів без жодного слова. Змінилося менше: усе, що додалося відтоді, лишило по собі файл.