Резервная копия живой базы SQLite: через backup API, а не копированием файла
Копирование файла SQLite, пока приложение может в него писать, способно дать сломанную копию. Используйте собственный интерфейс резервного копирования базы, небольшими шагами, и считайте место и для файла, и для его журнала предзаписи. Файл, не менявшийся несколько дней, всё равно может получить запись в середине копирования.
🎯 Для Разработчик или оператор, который хранит состояние приложения в файлах SQLite
- Почему простая копия живого файла базы небезопасна
- Как работает онлайн-копирование по страницам
- Какие ошибки места и ротации заполняют диск
📁 Много небольших баз
Состояние нашей системы лежит в отдельных файлах SQLite, по одному на модуль: трассы, леджер, кэши, очереди. На 3 ноября 2026, 21:53 UTC в папке данных было 128 файлов баз общим объёмом 12,0 ГБ. Это нормальный и приятный способ строить небольшие сервисы, и он означает, что резервное копирование надо делать правильно много раз подряд.
⚠️ Почему копия — это не резервная копия
База SQLite — это один файл плюс, в режиме журнала предзаписи, второй файл журнала. Писатель может быть посреди транзакции, пока вы копируете. Скопируйте основной файл, а затем журнал в разные моменты, и у вас на руках две половины разных времён. Результат может открыться и даже выглядеть нормально, но содержать пропавшие или несогласованные строки.
Возражение одного ревьюера в октябре 2026 сделало это конкретным. Файл, который «давно не менялся», копировать небезопасно: писатель может начать транзакцию прямо во время копирования. Возраст файла — не блокировка.
✅ Безопасный способ
В SQLite есть интерфейс онлайн-копирования. Он копирует базу страница за страницей в файл назначения и сохраняет результат согласованным, даже если в источник пишут во время копирования. Наш скрипт использует его с небольшим числом страниц за шаг и короткой паузой между шагами, чтобы большая база не блокировала писателей надолго. Копии мы делаем одну за другой, а не параллельно, чтобы диск и нагрузка оставались спокойными.
Из инцидента 14 сентября 2026, когда диск дошёл до девяноста семи процентов из-за бэкапов без ротации, вышли два правила учёта. Первое: считать место для файла плюс его журнала в том же проходе, который делает копию. Второе: сторожевой комментарий самого скрипта называет отсутствие ротации причиной, поэтому ротируйте старые копии в том же задании, которое делает новые, и оно не сможет расти без предела.
🛠️ Практика: постройте задание резервного копирования
- Перечислите файлы баз и отметьте, какие живые. Включите в размер файлы журнала предзаписи.
- Напишите скрипт: открывает каждый источник, открывает файл назначения и запускает интерфейс копирования шагами по несколько сотен страниц с короткой паузой.
- Обрабатывайте базы по одной. Логируйте размер каждой копии и время.
- После каждой копии откройте результат и запустите проверку целостности. Запишите итог.
- Храните фиксированное число свежих копий и удаляйте более старые в том же запуске.
- Оберните задание обёрткой сброса нагрузки, чтобы оно не стартовало на занятом хосте.
- Раз в месяц восстановите одну копию в пробную папку и прочитайте несколько строк.
✅ Проверьте себя
- Запустите писатель, который в цикле вставляет строки. Сделайте копию, пока он работает. Копия проходит проверку целостности.
- Посчитайте место, занятое копиями сегодня и через месяц. Оно не растёт без предела.
- Восстановите последнюю копию в пробную папку. Приложение открывает её и читает свежие данные.
- Лог задания говорит, сколько заняла каждая база и прошла ли проверка.
🚧 Когда это не работает
- Очень большие базы. Пошаговая копия сотен гигабайт занимает часы. Планируйте окно и диск.
- Высокая нагрузка записи. Занятой писатель заставляет копирование перезапускать страницы много раз. Копируйте в тихий час.
- Тот же диск. Копия на диске, который вы защищаете, не переживёт его потерю. Копируйте за пределы машины.
- Нет проверки восстановления. Непроверенная копия — надежда. Проверяйте восстановление по расписанию.
- Другие хранилища. Файлы вне SQLite, например загрузки, требуют своей копии.
📊 Доказательства
| Что измерено | Число и общий размер файлов баз в нашей папке данных и использование интерфейса копирования в наших скриптах |
| Когда | 3 ноября 2026, 21:53 UTC |
| Артефакт | Папка данных нашего закрытого развёртывания (128 файлов, 12,0 ГБ) и скрипт последовательного резервного копирования |
| Ограничение | Размер показывает, сколько нужно защищать, а не что каждая копия проверена восстановлением. Инцидент 14 сентября взят из наших заметок |
➡️ Дальше
Спланируйте восстановление по материалу Восстановление после сбойного, зависшего или неопределённого запуска и не давайте заданию душить прод с помощью сброса нагрузки для плановых заданий.
Источники
- Восстановление после сбойного, зависшего или неопределённого запуска: восстановление.
- Права и потоки данных: что где хранится.
- План реагирования для небольшой команды: шаги при инциденте.
- Квитанции задач агента: что они доказывают: записи о запусках.
🔗 Связи статьи
Открыть полный граф знаний ↗Связи опубликованных статей. Выберите узел, чтобы открыть статью у заголовка.
Связи статей · клавиатура / текст
Та же тема
- Векторная база — это карта, а не источник: чему нас научил поиск
- Когда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
- Как разбить большую задачу для дешёвой модели: урок 24 000 байт
- Навыки, MCP-инструменты и правила: три способа дать агенту возможности
- Восемь ошибок наших агентов в shell и git и правило на каждую
- Несколько агентов, один репозиторий: правила владения из реальных инцидентов
Следующие шаги
Связанные материалы
Векторная база — это карта, а не источник: чему нас научил поиск
Векторная база находит фрагменты, близкие по смыслу к вашему вопросу. Она не знает, какие из них верны или актуальны. Считайте каждое попадание указателем: откройте названный файл, сверьте хэш, а числа берите из артефакта, а не из найденного абзаца.
ИИ-агенты и MCP простыми словамиКогда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
Иногда вызов модели обрывается по таймауту, и вы не знаете, списал ли провайдер деньги. Никогда не записывайте это как ноль. Пометьте как неопределённое, остановите новые платные вызовы и пусть названный человек сверит это с выпиской провайдера. Отказы до генерации — исключение.
ИИ-агенты и MCP простыми словамиКак разбить большую задачу для дешёвой модели: урок 24 000 байт
Дешёвая модель хорошо справляется с одной небольшой чёткой задачей и плохо — с большой кучей. Мы ограничиваем задачу 24 000 байт и отклоняем большие до вызова любой модели. Режьте по единицам — один файл или одна страна на задачу — и проверяйте размер до запуска.
ИИ-агенты и MCP простыми словамиНавыки, MCP-инструменты и правила: три способа дать агенту возможности
Агенты получают способности по-разному. Правило ограничивает, что они делают, навык говорит, как делать работу, а MCP-инструмент позволяет вызывать функцию. У каждого свой риск, поэтому объявляйте все три в реестре и проверяйте тестом, что ничего не существует вне списка.
💬 Комментарии