Схема, що живе лише в робочій базі
Усе, що робить ця служба, лежить у системі контролю версій. Код — принаймні. База, на якій він працює, — це 32 таблиці, і в 15 із них ніде в репозиторії немає опису: ані CREATE TABLE, ані файлу схеми, нічого. Якби сервер зник, код повернувся б точно, а форму даних довелося б відновлювати з того, що код випадково питає.
Ці цифри отримано порівнянням робочої бази з 736 файлами і 5 671 710 знаками репозиторію. Це не оцінка.
Як губиться половина схеми
Це не недбалість, і саме тому варто записати. Кожен окремий крок був розумним.
Таблиці, створені до нинішнього коду, ніколи не були записані, бо тоді вони просто були. Таблиці, додані відтоді, прийшли через міграційні сценарії, і ті лежать у репозиторії — звідти ті 17 описів. Стовпці, додані пізніше, приходили однорядковим ALTER TABLE, набраним у командному рядку, бо набрати було швидше, ніж писати сценарій заради зміни довжиною в секунду.
Найгірше з індексами. Індекс додають, коли щось повільне, у ту мить, коли воно повільне, і він лагодить це відразу. Після нього не лишається нічого: нема чого переглядати, нема чому впасти, якщо забути. Одинадцять із тридцяти двох тутешніх вторинних індексів існують саме тому і ніде не записані.
Таблиця, у якій лежать самі лічильники, 166 438 рядків, входить до тих п'ятнадцяти без опису в репозиторії.
Що насправді ламається
Небагато — до однієї певної миті: коли базу відновлюють із вивантаження.
Вивантаження несе структуру із собою, тож пряме відновлення проходить нормально. Небезпечний будь-який шлях, що створює таблицю наново замість відновлення: переїзд на іншу машину, перенесення окремих таблиць, відтворення зі сценарію. Дані повертаються, а індекси мовчки ні. Ніщо не падає. Запити повертають правильні відповіді. Вони просто йдуть довше, і причина невидима, бо єдиний запис про те, чим був індекс, лежить на машині, яка його вже не має.
Ось той збій, який варто назвати: зниклий індекс не дає помилки, він дає повільнішу правильну відповідь. Перевірки на це немає, бо тести проходять.
Що ми робимо поки що
Чесна позиція така: це не виправлено. Схеми в репозиторії сьогодні немає. Те, що є, менше за виправлення і краще, ніж нічого:
Вивантаження перед усім руйнівним, збережене поза веб-каталогом. Відновлення, яке справді один раз провели, а не припустили. І короткий список, перевірюваний після кожного відновлення, тих індексів, про які відомо, що вони є лише в робочій базі — бо машину можна спитати, які в неї індекси, і порівняти відповідь із минулим разом.
Загальне формулювання стосується не лише баз даних. Якщо частина системи є тільки в робочій системі, у вас не копія, у вас заручник. Питання, яке варто поставити про будь-який шматок інфраструктури, звучить не «чи є резервна копія», а «якщо ця машина зникне, чого не вдасться зібрати наново з репозиторію». Тут відповідь — п'ятнадцять таблиць і одинадцять індексів, і на з'ясування пішов день.