сеньорчикОткрыть в Telegram
← вся теориятеория к собесу · Базы и брокеры в проде

Бэкапы базы и восстановление на точку

Копии и восстановление

Снял с одной и той же базы две копии. Логическая: 316 миллисекунд, файл 3,3 мегабайта, внутри команды создания таблиц и загрузки данных. Физическая: 51,3 мегабайта, внутри - побайтовые файлы каталога базы. Но самое интересное было со временем: первая физическая копия снялась за 54 525 миллисекунд, а точно такая же с одним дополнительным ключом - за 487. Разница в 112 раз, и данные абсолютно те же.

Стержень: копии бывают двух совсем разных видов, а время их снятия определяется не размером данных, а тем, ждёте ли вы контрольную точку.

// Формулировки: «чем логическая копия отличается от физической?», «как восстановиться на момент до ошибки?», «почему бэкап снимается полчаса?»

Логическая и физическая копия

Логическая копия - это текст: команды создания таблиц и данные для загрузки. Она маленькая (у меня 3,3 мегабайта против 51,3), переносима между версиями базы и разными машинами, позволяет достать одну таблицу. Восстановление - это выполнение всех этих команд заново: у меня 200 тысяч строк восстановились за 324 миллисекунды, а на большой базе это часы, потому что заново строятся все индексы - вспомогательные структуры, по которым база быстро находит нужные строки.

Физическая копия - побайтовая копия каталога базы вместе со служебными файлами. Она больше, привязана к версии и к платформе, зато восстанавливается простым копированием обратно и годится как основа для реплики - второй базы, которая повторяет за основной все изменения. На больших базах разница в скорости восстановления решает всё.

// Отсюда обычная связка: физические копии как основной способ восстановления, логические - как страховка и способ переехать. И главное: копия, которую ни разу не восстанавливали, копией не считается. Проверка восстановления - отдельная регулярная процедура, где замеряют, сколько времени она заняла: именно это число потом обещают бизнесу.

логическая копия
текст с командами создания и данными; переносима, но восстанавливается долго
физическая копия
побайтовая копия каталога базы; быстро возвращается, но привязана к версии

Почему копия снимается полчаса

Вот та самая находка. Перед физической копией база делает контрольную точку - сбрасывает на диск все изменения, которые пока лежат только в памяти. По умолчанию она РАСТЯГИВАЕТ эту работу во времени, чтобы не мешать обычной нагрузке. Мой замер: копия с настройками по умолчанию снималась 54 525 миллисекунд, из которых почти всё - ожидание растянутой контрольной точки. Та же копия с требованием сделать контрольную точку немедленно - 487 миллисекунд.

Практический вывод: если копия снимается подозрительно долго при небольшой базе, дело почти наверняка не в объёме данных и не в диске. И выбор тут осознанный: немедленная контрольная точка даёт всплеск записи на диск, растянутая бережёт нагрузку, но заставляет ждать.

// Второй расход при копии - журнал предзаписи. Все изменения сначала попадают в него, и уже потом в файлы данных. Замерил его аппетит: вставка 300 тысяч строк в таблицу размером 13 мегабайт продвинула журнал на 41 мегабайт. Журнал растёт быстрее самих данных, и место под него планируют отдельно.

контрольная точка
сброс на диск изменений, накопленных в памяти
WAL
журнал предзаписи (write-ahead log): изменения пишутся туда раньше, чем в файлы данных

Восстановление на точку во времени

Восстановление на момент до ошибки - это PITR (point-in-time recovery), и собирается оно из двух частей: полной копии и всех записей журнала предзаписи, накопленных после неё. Порядок такой: разворачиваем копию, подкладываем архив журнала, говорим «проигрывай до такого-то момента» и запускаем. База проигрывает изменения по одному и останавливается там, где сказано.

Отсюда два числа, которые надо назвать вслух до аварии, а не после. Сколько данных допустимо потерять - это определяет, как часто архивируется журнал. И сколько времени допустимо восстанавливаться - это определяет, как часто снимать полную копию, потому что чем она старее, тем дольше проигрывать журнал.

// Три вещи, которые ломают эту схему на практике. Архив журнала лежит рядом с базой на том же диске - тогда авария диска уносит и копию, и журнал. Архивация журнала отвалилась месяц назад, и никто не заметил, потому что базу это не тормозит. И самое частое: восстановление ни разу не проверяли, поэтому реальное время неизвестно, а обещанное взято с потолка.

PITR
восстановление на точку во времени (point-in-time recovery): копия плюс журнал
архив журнала
накопленные записи журнала предзаписи; хранятся ОТДЕЛЬНО от базы

Как отвечать: «Чем логическая копия отличается от физической и что брать?»

Логическая - это текст с командами создания и данными: маленькая, переносится между версиями, позволяет достать одну таблицу, но восстанавливается медленно, потому что заново выполняет все команды и строит индексы. Физическая - побайтовая копия каталога базы: больше, привязана к версии и платформе, зато возвращается копированием обратно и годится как основа для реплики. Я мерил на одной и той же базе: логическая 3,3 мегабайта, физическая 51,3. На проде обычно берут физические как основной способ и логические как страховку и способ переехать. И отдельно назову две вещи, о которых спрашивают следом. Первая: время снятия копии определяется не размером, а контрольной точкой - у меня одна и та же копия снималась 54 секунды с настройками по умолчанию и полсекунды с требованием немедленной контрольной точки. Вторая: копия, которую ни разу не восстанавливали, копией не считается.

Ответ сравнивает по трём осям сразу и заканчивается двумя практическими вещами. Про контрольную точку и про непроверенные копии обычно молчат, а именно они и стреляют.

На чём валятся

  • Держат единственную логическую копию большой базы и обнаруживают, что восстановление занимает часы.
  • Считают, что долгая копия означает медленный диск, и не смотрят на контрольную точку.
  • Кладут архив журнала рядом с базой: авария диска уносит и копию, и журнал.
  • Не следят за архивацией журнала: она отваливается молча, база от этого не тормозит.
  • Ни разу не проверяли восстановление и называют время наугад.

Проверьте себя

Пять вопросов из банка по этой подтеме. Всего их 6, остальные разбираются в тренажёре.

  1. #dvo_db_backup1 / 5
    Чем логический дамп отличается от физической копии базы?
    A)Логический снимается на живой базе, физический требует остановки
    B)Логический хранит только схему, физический — данные
    C)Логический — команды и данные, физический — файлы
    D)Логический подходит для восстановления на точку, физический — нет
    показать ответ и разбор
    +C)Логический — команды и данные, физический — файлы

    // разбор: Логический дамп описывает содержимое: его можно развернуть в другой версии базы, перенести отдельную таблицу, прочитать глазами. Расплата — медленное восстановление большой базы: данные заливаются как обычные вставки, индексы строятся заново. Физическая копия — снимок файлов кластера, восстановление быстрое и точное, но привязано к версии и архитектуре, зато с ним работает восстановление на момент времени.

  2. #dvo_db_backup2 / 5
    Что нужно, чтобы восстановить базу на состояние за минуту до ошибочного удаления?
    A)Ежечасные логические дампы и выбор ближайшего по времени
    B)Базовая копия плюс непрерывный архив журнала предзаписи
    C)Реплика с задержкой применения изменений на сутки
    D)Снимок диска, снятый в момент инцидента
    показать ответ и разбор
    +B)Базовая копия плюс непрерывный архив журнала предзаписи

    // разбор: Восстановление на точку складывается из двух частей: физическая базовая копия и все журналы предзаписи после неё, уезжающие в архив непрерывно. При восстановлении база разворачивается из копии и проигрывает журнал до указанного момента — вплоть до секунды перед ошибкой. Отсюда требования: архив на отдельном хранилище, контроль непрерывности сегментов и регулярная проверка, что развернуть это реально получается.

  3. #dvo_db_backup3 / 5
    База выросла до двух терабайт. RTO — час. Почему схема с ночным логическим дампом больше не годится?
    A)Дамп такого размера не поместится в объектное хранилище
    B)Логический дамп снимается только с остановкой нагрузки
    C)Инструмент дампа не работает с базами больше терабайта
    D)Заливка данных и построение индексов займут часы, а не минуты
    показать ответ и разбор
    +D)Заливка данных и построение индексов займут часы, а не минуты

    // разбор: Логическое восстановление — это выполнение вставок и построение индексов заново: на терабайтах счёт идёт на часы, и никакая скорость диска этого не спасает. Под жёсткий RTO берут физическую копию с журналом (разворачивается быстрее) или держат горячий резерв, на который переключаются за минуты. Проверяют не размер копии, а замеренное время восстановления — и сравнивают его с обещанным бизнесу.

  4. #dvo_db_backup4 / 5
    Логический дамп (pg_dump) или физическая копия — по какому признаку выбирают между ними?
    A)Физический быстрее, логический дамп уже устарел
    B)Логический дамп годится для восстановления на точку во времени
    C)Разницы по сути между ними нет
    D)По задаче: перенос vs быстрый полный recovery
    показать ответ и разбор
    +D)По задаче: перенос vs быстрый полный recovery

    // разбор: Логический дамп (pg_dump) — это команды и данные: он переносим между версиями и платформами, позволяет выгрузить часть (схему, отдельные таблицы), удобен для миграций и небольших баз, но восстановление большой БД идёт медленно (перезаливка + пересборка индексов). Физическая копия (файлы кластера, pg_basebackup) восстанавливается быстрее и целиком, но привязана к версии/архитектуре и берёт весь кластер. Выбор — по задаче: перенос/выборка → логический, быстрый полный recovery большой БД → физический.

  5. #dvo_db_backup5 / 5
    База выросла, а ночная полная копия занимает слишком долго и много места. Как сократить окно и объём?
    A)Полная копия реже + инкрементальные между ними
    B)Снимать полную копию просто пореже, без инкрементов
    C)Сжимать полную копию сильнее тем же расписанием
    D)Удалять старые данные, чтобы база не росла
    показать ответ и разбор
    +A)Полная копия реже + инкрементальные между ними

    // разбор: Для больших баз переходят со схемы «каждую ночь полный бэкап» на комбинацию: периодическая полная копия + частые инкрементальные/дифференциальные между ними, которые сохраняют только изменения с предыдущей точки. Это резко сокращает окно бэкапа и объём хранения, сохраняя возможность восстановиться на нужный момент (полная + цепочка инкрементов + журнал). Инструменты вроде pgBackRest это поддерживают. Просто «реже полный» без инкрементов увеличивает потенциальную потерю данных.

дальше

Теорию прочитали. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.