Звернутися до підтримки

Відповідаємо електронною поштою, зазвичай протягом двох днів.

Google reCAPTCHA перевіряє це звернення на зловживання; дані передаються до Google. Скрипт завантажується лише під час відкриття цієї форми.

← Усі записи

Де насправді живе схема бази

Про матеріали та їх перевірку

У цій статті

Усе, що робить ця служба, лежить у системі контролю версій. Код — принаймні. База, на якій він працює, — це 32 таблиці, і в 15 із них ніде в репозиторії немає опису: ані CREATE TABLE, ані файлу схеми, нічого. Резервна копія відновлює всі 32 разом із їхньою формою; чого в репозиторії немає, то це другого, незалежного запису цієї форми.

17 таблиць описано 15 не описано ніде 21 індекс створює код 11 лише в базі 32 таблиці, 32 вторинні індекси, 0 файлів схеми

Ці цифри отримано порівнянням робочої бази з 736 файлами і 5 671 710 знаками репозиторію. Це не оцінка.

Як губиться половина схеми

Це не недбалість, і саме тому варто записати. Кожен окремий крок був розумним.

Таблиці, створені до нинішнього коду, ніколи не були записані, бо тоді вони просто були. Таблиці, додані відтоді, прийшли через міграційні сценарії, і ті лежать у репозиторії — звідти ті 17 описів. Стовпці, додані пізніше, приходили однорядковим ALTER TABLE, набраним у командному рядку, бо набрати було швидше, ніж писати сценарій заради зміни довжиною в секунду.

Найгірше з індексами. Індекс додають, коли щось повільне, у ту мить, коли воно повільне, і він лагодить це відразу. Після нього не лишається нічого: нема чого переглядати, нема чому впасти, якщо забути. Одинадцять із тридцяти двох тутешніх вторинних індексів існують саме тому і ніде не записані.

Таблиця, у якій лежать самі лічильники, 166 438 рядків, входить до тих п'ятнадцяти без опису в репозиторії.

Що насправді ламається

Небагато — до однієї певної миті: коли базу відновлюють із вивантаження.

Вивантаження несе структуру із собою, тож пряме відновлення проходить нормально. Небезпечний будь-який шлях, що створює таблицю наново замість відновлення: переїзд на іншу машину, перенесення окремих таблиць, відтворення зі сценарію. Дані повертаються, а індекси мовчки ні. Ніщо не падає. Запити повертають правильні відповіді. Вони просто йдуть довше, і причина невидима, бо єдиний запис про те, чим був індекс, лежить на машині, яка його вже не має.

Ось той збій, який варто назвати: зниклий індекс не дає помилки, він дає повільнішу правильну відповідь. Перевірки на це немає, бо тести проходять.

Що ми робимо поки що

Схеми в репозиторії сьогодні немає, і це точний опис стану. Те, що є, вужче за повне виправлення і покриває випадок, який справді чогось коштує:

Вивантаження перед усім руйнівним, збережене поза веб-каталогом. Відновлення, яке справді один раз провели, а не припустили. І короткий список, перевірюваний після кожного відновлення, тих індексів, про які відомо, що вони є лише в робочій базі — бо машину можна спитати, які в неї індекси, і порівняти відповідь із минулим разом.

Загальне формулювання стосується не лише баз даних. Якщо частина системи існує тільки в робочій системі, другої її копії немає. Питання, яке варто поставити про будь-який шматок інфраструктури, звучить не «чи є резервна копія», а «чого не вдасться зібрати наново з репозиторію, якщо ця машина зникне». Тут відповідь — п’ятнадцять таблиць і одинадцять індексів, на з’ясування пішов день, і це список, а не невідоме.

Оновлення: вересень 2026

Через п’ять днів після цього допису робочий каталог потрапив до репозиторію: 26 файлів і 4058 рядків, серед них одинадцять сценаріїв міграції, написаних з 28 серпня до 1 вересня, які доти існували лише на працюючій машині. Це була легка половина — код, який написали, але ніде не закріпили.

1 вересня 2026 року вимір повторили тим самим способом: працююча база проти всього, що знає git.

Таблиці4630 з CREATE TABLE у репозиторії, 16 без нього
Вторинні індекси4332 створює код із репозиторію, 11 лише в працюючій базі
Сценарії міграції109під контролем версій
30 таблиць описано 16 ніде 32 індекси з файлом 11 лише в базі 46 таблиць, 43 вторинні індекси, 0 файлів схеми

Число, яке важить, не зрушило. 27 серпня одинадцять вторинних індексів не існували ніде, крім працюючої бази. 1 вересня їх так само одинадцять. За цей час додалося ще одинадцять індексів, і кожен прийшов зі сценарієм міграції: звичка змінилася, борг ні.

Ці одинадцять сидять на п’яти таблицях — лічильниках, мовах, сторінках-джерелах, списку винятків і журналі подій. Усі п’ять старші за нинішній код, і саме тому для них ніколи нічого не записували. Написати файл тепер означало б відновлювати з працюючого сервера те, що роки тому набрали в командному рядку.

Тож становище з серпня лишається тим самим. Схеми в репозиторії й далі немає, а відновлення, яке будує таблицю наново замість повернути її, так само втратило б одинадцять індексів без жодного слова. Змінилося менше: усе, що додалося відтоді, лишило по собі файл.

Реклама