Резервное копирование и восстановление баз данных виртуализованного Microsoft SQL Server

  • Tutorial
В версии 8.0 Veeam Backup & Replication реализован широкий спектр возможностей для резервного копирования и восстановления виртуализованных SQL серверов и баз данных, включая популярные методы полного восстановления виртуальной машины, гранулярного восстановления на уровне файлов и восстановления баз с помощью инструмента Veeam Explorer для Microsoft SQL Server. О последнем из перечисленных и будет мой сегодняшний рассказ.



Разумеется, начинать надо «от печки» — то есть от понимания того, как возможности восстановления связаны с настройками резервного копирования и самого виртуализованного SQL Server.

Все знают, что Veeam создает резервную копию виртуальной машины на уровне образа – то есть в случае SQL Server будет сделан бэкап всего сервера целиком, включая все инстансы и базы на них. Для того чтобы бэкап получился непротиворечивым относительно транзакций (transactionally-consistent), при его создании следует задействовать обработку образа с учетом работы приложений (application-aware image processing). Более того, можно подготовить резервную копию сервера к тому, что впоследствии из нее будут восстанавливать конкретные базы данных на состояние в любой момент времени или даже на выбранную транзакцию.

Планируем ресурсы


Вот несколько факторов, которые нужно учитывать при планировании резервного копирования SQL Server для последующего восстановления баз данных:
  1. Ресурсы инфраструктуры и требования политик резервного копирования и восстановления, а именно:
    • Какие SQL серверы надлежит бэкапить?
      Veeam работает с Microsoft SQL Server 2005 SP4 и выше; поддерживаются все редакции. Для Microsoft SQL Server 2012 и выше поддерживаются AlwaysOn Availability Groups.
    • Каковы требуемые показатели RTO и RPO для баз данных?
      Периодичность бэкапов будет зависеть в том числе и от этих значений. Как правило, чем чаще делаются бэкапы, тем меньше времени потребуется на восстановление.
    • Насколько интенсивно приложения обращаются к базе?
      Наряду с показателем RTO, этот фактор нужно учитывать при настройке окна резервного копирования, расписания заданий бэкапа и расчете места для хранения бэкапов журналов транзакций (при необходимости их использования).
    • Достаточного ли размера репозиторий резервного копирования?
      Места должно хватать для резервных копий самого сервера и журналов транзакций. Полезно оценить, сколько места примерно потребуется для них. Это можно сделать, например, с помощью калькулятора, или использовать отчет VM Change Rate Estimation из пачки Infrastructure Assessment Reports (если у вас установлен Veeam ONE).

  2. Модель восстановления (logging and recovery model) для требуемой базы данных. От нее зависит, какие опции обработки журналов транзакций можно будет использовать, и какие сценарии восстановления можно будет применять в дальнейшем:
    • Если для базы указана модель Simple, то восстановить базу можно будет только на то состояние, в котором она пребывала в момент создания конкретной точки восстановления (бэкапа или реплики). В этом сценарии SQL Server будет автоматически выполнять транкейт логов.
    • Если модель иная (Full или Bulk-logged), то автоматический транкейт не будет происходить, и можно настроить нужные опции обработки логов.

  3. Какой инструмент будет использоваться для резервного копирования и восстановления?
    • Если для бэкапов виртуальной машины с SQL Server и журналов транзакций соответствующих баз будет задействован Veeam, то в настройках задания резервного копирования машинки нужно будет выбрать опцию Process transaction logs with this job:



      После этого станут доступны настройки процессинга журналов транзакций (об этом чуть позже).
      Примечание: Если эту опцию выбрать при настройке задания бэкапа машины с другим приложением (не SQL, а, скажем, Exchange Server), то она включит автоматический транкейт журналов транзакций для этого приложения. Подробнее о работе для Exchange см. статью на Хабре.
    • Если же вы планируете использовать Veeam только для создания бэкапа всей виртуальной машины, а журналы транзакций собираетесь передавать для обработки, скажем, стороннему приложению, то вам нужно оповестить об этом Veeam Backup & Replication – то есть указать, что цепочка бэкапов будет создаваться другим инструментом, а Veeam должен создавать свой бэкап с флагом COPY_ONLY (только в этом случае цепочка останется неизмененной). Это делается с помощью выбора опции Perform copy only (lets another application use logs):

      image

      После этого настройки процессинга журналов транзакций будут «спрятаны» за ненадобностью; Veeam будет бэкапить данный SQL Server с использованием метода VSS_BS_COPY для создания снапшота; журналы транзакций трогаться не будут, так что администратору баз данных надо будет самому позаботиться о их дальнейшей судьбе.


Немного теории: разбираемся, как идут процессы


Для того, чтобы обеспечить возможность восстановления базы данных на любой момент времени или на выбранную транзакцию, нам понадобится создать:
  1. Резервную копию виртуальной машины с учетом работы приложения (то есть SQL Server)
  2. Резервную копию журнала транзакций, который потом будет «накатываться» на имеющийся бэкап, чтобы привести базу к нужному состоянию

Посмотрим, как с этими задачами управляется Veeam Backup & Replication.

Итак, если нам нужно бэкапить логи (что даст нам возможность наиболее «прицельного» восстановления базы), то задание резервного копирования нашего SQL Server будет, по сути, включать в себя 2 взаимосвязанных задания:
  1. Бэкап виртуальной машины с SQL Server – выполняется на уровне образа машины, фигурирует здесь и далее как «родитель», носит название, которые вы задали ему в UI (например, Test Job). Создается пользователем в консоли, запускается по расписанию либо вручную.
  2. Бэкап журналов транзакций – фигурирует здесь и далее как «ребенок», носит имя «родителя» и суффикс SQL Backup (в нашем примере получится Test Job SQL Backup). Создается без участия пользователя, автоматически, компонентом Job Manager при выполнении обоих условий:
    • существует хотя бы один «родитель», который будет запускаться по расписанию и создавать бэкап с учетом работы приложения (в настройках «родителя» выбрано Enable application-aware image processing)
    • включена опция бэкапа логов (также в настройках «родителя»)


Эта «связка» заданий работает так:

image

Шаги 1 и 2


Согласно расписанию, Job Manager, работающий на сервере Veeam backup, запускает «родителя», который создает бэкап виртуальной машины с SQL Server и кладёт его в репозиторий.

Шаг 3


Стартует сессия «ребенка»: с ее началом Veeam Backup & Replication устанавливает внутрь гостевой ОС нашего SQL сервера свой компонент под названием Veeam Log Shipper Service. Этот сервис будет работать в течение всей «детской» сессии и отвечать за обработку логов. Он, в частности, собирает информацию о том, журналы каких баз надлежит забэкапить в ходе сессии, и как именно можно передать данные в репозиторий (напрямую либо через log shipping server — назовем его «журнальный прокси»). По окончании «детской» сессии данный компонент останавливается и сносится с гостевой ОС; с началом новой сессии все повторяется (установка, сбор данных, остановка, деинсталляция).

Резервная копия журнала транзакций на гостевой ОС создается средствами самого SQL Server; он также выполняет транкейт логов на гесте. Получившиеся копии сохраняются в виде файлов .BAK во временной папке на гостевой файловой системе (по умолчанию это %allusersprofile%\Veeam\Backup).

Шаг 4


Каждые 15 минут (периодичность по умолчанию) Job Manager выявляет, какие базы имеются на данном SQL Server, и соотносит получившийся перечень с данными о содержимом бэкапа виртуальной машины (берутся из базы Veeam Backup & Replication). Таким образом выясняется, для каких же баз есть журналы, которые должны быть «отвезены» в репозиторий и положены рядом с соответствующим бэкапом SQL сервера в ходе данного 15-минутного интервала.

Примечание: Если остались еще копии журналов, которые по какой-то причине не были «увезены» в репозиторий в ходе предыдущих интервалов, Veeam выявит их путем энумерации .BAK файлов во временной папке и пометит как «подлежащие перевозке».

Шаг 5


Файлы .BAK передаются с геста на репозиторий (напрямую либо через «журнальный прокси»); сервис Veeam transport на стороне источника перед этим еще выполняет их компрессию согласно своим настройкам по умолчанию. На стороне репозитория компрессия выполняется согласно настройкам «родительского» задания (подробнее можно прочитать здесь – на русском языке).

После «перевозки» данных на репозиторий они удаляются из временной папки на виртуальной машине. Если что-то не удалось «перевезти» за время отведенного интервала, то эти файлы удалены не будут, а во время следующей 15-минутки Veeam повторит попытку.

Операции, которые выполняются в течение 15-минутного интервала (т.н. log backup interval), показаны на рисунке:

image

Совокупность таких интервалов (их продолжительность, кстати, можно менять) между двумя последовательными запусками «родительского» задания и представляет собой «детскую» сессию.
  • Начальная сессия стартует в момент, когда в настройках «родителя» было указано «Активировать расписание».
  • Задание «ребенок» продолжает работу в фоновом режиме между запусками «родителя», выполняя описанные выше операции. С запуском «родителя» текущая «детская» сессия завершается, и тут же стартует новая, вместе с «родителем» они проходят по шагам 1-5 (см. выше).
  • Завершается «детская» сессия непосредственно перед стартом «родителя», либо когда «родитель» деактивирован (через команду меню либо через деактивацию расписания).

Если рисовать картинку, то это будет выглядеть вот так:

image

Пример


Поясню картинку словами. Допустим, задание «родитель» настроено на ежедневный запуск в 11 часов вечера, начиная с 5 мая. Тогда будет иметь место такая последовательность:
  1. Самая первая «детская» сессия стартует в тот момент, когда для «родителя» было активировано расписание автоматического запуска (сам бэкап виртуальной машины еще не создан) – эта настройка была сделана в 7 часов вечера 5 мая. Задание-«ребенок» находится в состоянии Idle, ожидая, пока будет создан бэкап машины.
  2. В 11 вечера 5 мая запускается «родитель» и создает бэкап SQL сервера.
  3. Задание-«ребенок» переходит в состояние Working, и начинается последовательность 15-минутных интервалов. Если все бэкапы журналов были успешно «перевезены» в репозиторий до того, как подойдет время начала новой сессии, «ребенок» перейдет снова в состояние Idle и будет ожидать, пока время сессии не истечет.
  4. В 11 вечера 6 мая снова запускается «родитель», и стартует новая «детская» сессия.


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

Что сохраняется в репозиторий?


В репозиторий (рядом с бэкапом соответствующего сервера) сохраняются резервные копии журналов транзакций в виде файлов .VLB; по умолчанию путь к папке C:\backup\<SQL_server_VM_backup_job_name>. Туда же кладутся и метаданные цепочки резервных копий в виде файлов .VBM.

По умолчанию политика хранения файлов .VLB настроена на соответствие с политикой хранения бэкапов SQL сервера, чтобы всегда имелись логи, которые можно было бы «накатить» на выбранную точку восстановления сервера и получить нужное состояние базы. Естественно, что с удалением точки восстановления по истечении срока хранения соответствующие бэкапы логов также будут удалены.

Есть еще одна опция – хранить бэкапы .VLB указанное количество дней; она может пригодиться в том случае, если вы хотите сэкономить место и планируете хранить только самые свежие данные для восстановления на недавнее состояние. Однако следует убедиться, что политики хранения для бэкапа сервера и файлов .VLB настроены так, что точка восстановления сервера не будет удаляться раньше, чем соответствующий .VLB – иначе «накатить» логи будет не на что.

Хватит теории, давайте уже практику! Настраиваем задание резервного копирования


Выбор объектов для задания


На шаге выбора объектов для включения в «родительское» задание надо учесть следующее:
  • Базы данных, находящиеся на одном инстансе, будут обрабатываться последовательно.
  • Если вы хотите создавать бэкапы журналов транзакций для всех баз, за исключением одной или нескольких определенных, то для этих баз-исключений нужно указать модель восстановления simple.
  • Для SQL Server 2012 и выше Veeam поддерживает AlwaysOn Availability Groups (проверяем, что инстансы SQL находятся на нодах WSFC).


Настройка процессинга виртуальной машины с учетом работающего приложения (SQL сервера)


На шаге Guest Processing при настройке процессинга гостевой ОС выбираем вот такие опции:
  1. Зачекиваем галку Enable application-aware processing, чтобы процессинг виртуальной машины шёл с учетом работы приложений.

    image

  2. Идём в секцию Guest OS credentials и указываем учетную запись, под которой хотим выполнять действия на гостевой ОС (в т.ч. это бэкап логов с гостевой ОС на репозиторий и транкейт логов). Для этой учетной записи понадобятся следующие права:
    • Для бэкапа – фиксированная серверная роль sysadmin на обрабатываемом SQL Server.
    • Для транкейта – если у вас SQL Server 2012 или SQL Server 2014, то минимум роль db_backupoperator для нужной базы, либо опять-таки серверная роль sysadmin.

    Важное примечание: Начиная с Veeam Backup & Replication 8.0 Update 2 (билд 8.0.0.2021), в случае неудачной попытки транкейта под указанной учетной записью будет выполнена еще одна попытка, под учетной записью NT AUTHORITY\SYSTEM.

    Поэтому для SQL Server 2012 или SQL Server 2014 следует убедиться, что у этой учетной записи достаточно прав (подробнее см. http://www.veeam.com/kb1746).
    Что же до SQL Server 2005, 2008 и 2008 R2, то для них настройки по умолчанию обеспечивают для local SYSTEM нужные права (однако всегда есть вероятность, что кто-то мог их поменять – на такой случай рекомендуем всё еще разок перепроверить).
  3. Затем жмём кнопку Application, в представленном списке выбираем нужный нам SQL Server и нажимаем кнопку Edit, после чего откроется диалог с настройками процессинга гостевой ОС.
  4. Идём на вкладку General, находим там секцию Applications и выбираем опцию Require successful processing (recommended) – при такой настройке Veeam прекратит процесс бэкапа при любой ошибке, полученной от VSS в ходе «заморозки» нашего приложения. Таким образом мы нацеливаемся на создание резервной копии, непротиворечивой относительно транзакций (transactionally-consistent backup).

    image

  5. Далее идем в секцию Transaction logs и выбираем там опцию Process transaction logs with this job — как рассказывалось выше, это означает, что и бэкап виртуальной машины, и бэкап логов будут выполняться с помощью Veeam.
  6. После этого станет доступен таб SQL, где нужно выбрать, что вы хотите делать с логами (то бишь журналами транзакций). Доступны вот такие варианты:
    • Truncate logs (prevent logs from growing forever) – хотим транкейтить логи. Не забываем, что у учетной записи, которая будет использована для работы с гостевой ОС, должны быть соответствующие права. В таком варианте Veeam дождется окончания бэкапа виртуальной машины и затем даст сигнал к транкейту логов (который выполнится с помощью VSS). Данная опция позволит вам восстановить базу только на выбранную точку восстановления (более «прицельное» восстановление будет невозможно).
    • Do not truncate logs (requires simple recovery model) – хотим оставить логи на SQL сервере как есть, т.е. чтобы Veeam ничего с ними не делал (ни бэкап, ни транкейт). В таком варианте что-то делать с ними придется вашему администратору баз данных (иначе логи могут разрастись и занять кучу места, вот почему тут написано – «используйте модель simple в случае выбора этой опции»). Данная опция также позволит вам восстановиться только на выбранную точку.
    • Backup logs periodically – хотим сохранять бэкапы логов в репозиторий рядом с бэкапом самого SQL сервера. Данная опция позволяет использовать любой сценарий восстановления.

      Выбираем, с какой периодичностью хотим «перевозить» логи на репозиторий (по умолчанию это те самые каждые 15 минут); устанавливаем политику хранения (рекомендуется According to the corresponding image-level backup). Ну и в завершение указываем «журнальный прокси», через который данные «поедут» в репозиторий.

      image

  7. Для переноса файлов в репозиторий с гостевой ОС поддерживаются 2 типа транспорта:
    • Непосредственно с гостевой ОС на репозиторий – это оптимальный метод, поскольку не требует дополнительных ресурсов и по минимуму нагружает гостевую систему.
    • Если непосредственное соединение установить невозможно, то используем log shipping server, или «журнальный прокси» — это может быть любой Windows-сервер, добавленный в консоль Veeam Backup & Replication.

    Можно указать, что выбор «журнального прокси» должен происходить автоматически, или самим выбрать подходящие серверы из списка. Veeam будет автоматически назначать на роль прокси один из серверов, ориентируясь на 2 критерия – возможные способы передачи данных и доступность по сети. Разумно также иметь более одного прокси для этой цели (на случай сбоя). Подробнее о «журнальных прокси» см. здесь.
  8. Что касается расписания, то «родительское» задание рекомендуется запускать в часы минимальной загрузки продакшена. Задание-«ребенок» (т.е. бэкап логов) по умолчанию будет пытаться «перевезти» логи на репозиторий каждые 15 минут — этот интервал можно поменять. Разумеется, при этом надо брать в расчет реальное время, за которое осуществляется передача файлов на репозиторий (т.е. не надо ставить интервал в 5 минут, если на самом деле процесс занимает все 15).

Вот, в общем-то, и всё. Нажимаем ОК, чтобы сохранить настройки, закрываем диалог, возвращаемся к мастеру задания и проходим его до финиша. При этом помним, что на шаге Schedule нашего «родительского» задания надо ОБЯЗАТЕЛЬНО выбрать галку Run the job automatically, иначе задание-«ребенок» не будет активировано.

А что дальше?


В следующей части я расскажу о том, как можно реализовать выбранный сценарий восстановления и на какие моменты следует обратить внимание при подготовке и планировании этого процесса. А пока что можно почитать дополнительно:
  • +8
  • 23,2k
  • 8
Veeam Software
127,85
Продукты для резервного копирования информации
Поделиться публикацией

Комментарии 8

    0
    выполнена еще одна попытка, под учетной записю NT AUTHORITY\SYSTEM

    А как это работает? У VMware ведь нет публичного API для выполнения команд без авторизации в гостевой ОС.
      +1
      Так VMware тут не при чём. Вызовом vss и транкейта занимается временный сервис устанавливаемый на госте во время бекапа.
      Стартует сессия «ребенка»: с ее началом Veeam Backup & Replication устанавливает внутрь гостевой ОС нашего SQL сервера свой компонент под названием Veeam Log Shipper Service. Этот сервис будет работать в течение всей «детской» сессии и отвечать за обработку логов.

      Для этого в настройках задания и надо указывать учётную запись с администраторскими правами.
        0
        Я уж подумал, что фейлбек работает при отказе того пароля через секретные команды в VMware Tools.
      0
      Скажите, это баг или фича: при смене имени базы в Veeam Explorer, он всё равно предлагает восстановить файлы БД с оригинальными именами (перезаписав имеющиеся)?
        0
        В случае, если на целевом сервере (инстансе) есть база с таким именем, которое вы указали — это фича, т.е. ожидаемое поведение: база на целевом сервере будет заменена. Если базы с таким именем нет, а Veeam Explorer все равно предлагает восстановить с оригинальным именем, то надо уточнить детали.
          0
          На сервере есть старая база MyDB для которой параллельно разворачивается копия из бекапа. Базы с новым именем MyDB-New (которое я ввёл на первом экране) там нет, но визард всё равно предлагает восстановить файлы с оригинальными именами MyDB.MDF и MyDB.LDF.

          Понятно, что эти имена хранятся в самой БД (Path и File Name) и Explorer берёт их оттуда, повторяя логику работы встроенного восстановления, но это добавляет лишний ручной шаг без которого процесс завершится с ошибкой или даже перезапишет текующую копию БД.
            0
            Насколько я знаю, было решено оставить редактирование имен файлов на откуп пользователю, в частности, и для того, чтобы избежать автоматической перезаписи. То есть шаг с ручным редактированием — это как бы дополнительная подстраховка.
              0
              Понял, спасибо! Мастер просто не дают нажать Restore при наличии файлов.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое