Резервне копіювання живої бази SQLite: API резервного копіювання, а не копіювання файлу
Копіювання файлу SQLite, поки застосунок може до нього писати, дає зламану копію. Використовуйте власний інтерфейс резервного копіювання бази, невеликими кроками, і рахуйте місце для файлу та його журналу попереднього запису. Файл, що не змінювався днями, усе одно може отримати запис посеред копіювання.
🎯 Для Розробник або оператор, який тримає стан застосунку у файлах SQLite
- Чому просте копіювання файлу живої бази небезпечне
- Як працює онлайн-резервне копіювання сторінками
- Які помилки з місцем і ротацією заповнюють диск
📁 Багато невеликих баз
Наша система тримає свій стан в окремих файлах SQLite, по одному на модуль: трасування, журнал операцій, кеші, черги. 3 листопада 2026, 21:53 UTC у теці з даними лежало 128 файлів баз загальним розміром 12,0 GB. Це звичайний і приємний спосіб будувати невеликі сервіси, і саме через нього резервне копіювання — робота, яку треба зробити правильно багато разів.
⚠️ Чому копія — не резервна копія
База SQLite — це один файл плюс, у режимі попереднього запису, другий файл журналу. Процес, що пише, може саме бути посеред транзакції, коли ви копіюєте. Скопіюйте основний файл і журнал у різні моменти — і ви матимете дві половини різних часів. У результаті копія може відкритися і навіть виглядати нормально, але міститиме відсутні або неузгоджені рядки.
Одне зауваження рецензента в жовтні 2026 зробило це наочним. Файл, який «давно не змінювався», не безпечно копіювати: той, хто пише, може почати транзакцію, поки триває копіювання. Вік файлу — не блокування.
✅ Безпечний шлях
SQLite постачає інтерфейс онлайн-резервного копіювання. Він копіює базу сторінка за сторінкою у файл призначення і зберігає результат узгодженим, навіть якщо в джерело пишуть під час копіювання. Наш скрипт резервного копіювання використовує його з невеликою кількістю сторінок на крок і короткою паузою між кроками, тож велика база не блокує тих, хто пише, надовго. Ми запускаємо копіювання одне за одним, не паралельно, щоб тримати диск і навантаження спокійними.
Два правила обліку постали з інциденту 14 вересня 2026, коли диск сягнув дев'яноста семи відсотків через те, що резервні копії не ротувалися. Перше: рахуйте місце для файлу плюс його журнал у тому самому проході, що робить копію. Друге: коментар самого сторожового обмежувача називає відсутність ротації причиною, тож ротуйте старі копії в тому самому завданні, що створює нові, і тоді завдання не зростатиме без межі.
🛠️ Практика: зберіть завдання резервного копіювання
- Перелічіть свої файли баз і позначте, які з них живі. Включайте у розмір файли журналу попереднього запису.
- Напишіть скрипт резервного копіювання, який відкриває кожне джерело, відкриває файл призначення і запускає інтерфейс резервного копіювання кроками по кілька сотень сторінок з короткою паузою.
- Запускайте бази одну за одною. Записуйте в журнал розмір кожної копії та час, який вона зайняла.
- Після кожної копії відкрийте призначення і запустіть перевірку цілісності. Зафіксуйте результат.
- Тримайте фіксовану кількість останніх копій і видаляйте старіші в тому самому запуску.
- Обгорніть завдання обгорткою скидання навантаження, щоб воно не стартувало на зайнятому хості.
- Раз на місяць відновлюйте одну копію в окрему теку й читайте кілька рядків.
✅ Перевірте себе
- Запустіть процес, що пише, який у циклі вставляє рядки. Зробіть резервну копію, поки він працює. Копія проходить перевірку цілісності.
- Порахуйте місце на диску, яке ваші резервні копії займають сьогодні й наступного місяця. Воно не зростає без межі.
- Відновіть останню копію в окрему теку. Застосунок відкриває її й читає свіжі дані.
- Журнал завдання каже, скільки часу зайняла кожна база і чи пройшла перевірка.
🚧 Коли це не працює
- Дуже великі бази. Покрокове копіювання сотень гігабайтів триває годинами. Плануйте вікно і диск.
- Важке навантаження на запис. Зайнятий процес, що пише, може змусити резервне копіювання перезапускати сторінки багато разів. Робіть копію в тиху годину.
- Той самий диск. Резервна копія на диску, який ви захищаєте, не переживе втрати диска. Копіюйте її з машини.
- Немає тесту відновлення. Неперевірена резервна копія — це сподівання. Тестуйте відновлення за розкладом.
- Інші сховища. Файли поза SQLite, як-от завантаження, потребують власного резервного копіювання.
📊 Докази
| Що ми вимірювали | Кількість і загальний розмір файлів баз у нашій теці з даними, а також використання інтерфейсу резервного копіювання в наших скриптах |
| Коли | 3 листопада 2026, 21:53 UTC |
| Артефакт | Тека з даними нашого приватного розгортання (128 файлів, 12,0 GB) і скрипт послідовного резервного копіювання |
| Обмеження | Розмір показує, скільки є чого захищати, а не те, що кожну копію перевірено відновленням. Інцидент 14 вересня походить з наших нотаток |
➡️ Далі
Сплануйте відновлення в Відновлення після невдалого, завислого чи невизначеного запуску, і не дайте завданню заморити продуктивне середовище голодом за допомогою скидання навантаження для планових завдань.
Джерела
- Відновлення після невдалого, завислого чи невизначеного запуску: відновлення.
- Дозволи та потік даних: що де зберігається.
- План дій в інциденті зі штучним інтелектом для малої команди: кроки під час інциденту.
- Квитанції завдань агента: що вони доводять: записи про запуски.
🔗 Зв'язки статті
Відкрити повний граф знань ↗Зв’язки опублікованих статей. Виберіть вузол, щоб відкрити статтю біля заголовка.
Зв’язки статей · клавіатура / текст
Та сама тема
- Векторна база — це мапа, а не джерело: що ми з'ясували про пошук
- Коли невідомо, скільки коштував виклик моделі: заморожування, потім звіряння
- Розбиття великого завдання для дешевої моделі: урок про 24 000 байтів
- Навички, інструменти MCP і правила: три способи дати агенту можливості
- Вісім помилок з shell і git, яких припускалися наші агенти, і правило для кожної
- Кілька агентів, один репозиторій: правила володіння з реальних інцидентів
Наступні кроки
Пов'язані матеріали
Векторна база — це мапа, а не джерело: що ми з'ясували про пошук
Векторна база знаходить уривки, близькі за змістом до вашого запиту. Вона не знає, які з них правдиві чи актуальні. Сприймайте кожен результат як вказівник: відкрийте названий файл, перевірте хеш і беріть числа з артефакту, а не зі знайденого абзацу.
AI agents and MCP explainedКоли невідомо, скільки коштував виклик моделі: заморожування, потім звіряння
Іноді виклик моделі перевищує час очікування, і ви не знаєте, чи провайдер списав кошти. Ніколи не записуйте це як нуль. Позначте витрату як непевну, зупиніть нові платні виклики й доручте названій людині звірити її з випискою провайдера. Виняток — відмови, що сталися до генерації.
AI agents and MCP explainedРозбиття великого завдання для дешевої моделі: урок про 24 000 байтів
Дешева модель добре дає раду з однією невеликою чітко окресленою роботою, але погано з великим нагромадженням. Ми обмежуємо завдання 24 000 байтами і відмовляємо більшим ще до виклику моделі. Діліть на одиниці — один файл або одна країна на завдання — і перевіряйте розмір до початку.
AI agents and MCP explainedНавички, інструменти MCP і правила: три способи дати агенту можливості
Агенти отримують можливості по-різному. Правило обмежує те, що вони роблять, навичка підказує, як виконати роботу, а інструмент MCP дозволяє викликати функцію. Кожен із трьох має власний ризик, тож фіксуйте всі три в реєстрі й перевіряйте тестом, що нічого не існує поза ним.
💬 Коментарі