Роль модуля записи в резервном копировании сложных хранилищ

Как и для всех важных операций в VSS, добавочные и разностные резервные копии требуют тесного сотрудничества между инициаторами запроса и авторами.

Типы резервного копирования

Инфраструктура обеспечивает специальную поддержку для пяти типов резервного копирования. Они описаны ниже.

  • Полный (VSS_BT_FULL). Резервные копии файлов будут создаваться независимо от даты их последней резервной копии. Журнал резервных копий каждого файла будет обновлен, и этот тип резервного копирования можно использовать в качестве основы для добавочной или разностной резервной копии. Если есть файлы журналов, они могут быть усечены в результате этой резервной копии.

    Для восстановления полной резервной копии требуется только один образ резервной копии.

  • Разностный (VSS_BT_DIFFERENTIAL). API VSS используется для того, чтобы гарантировать, что только файлы, которые были изменены или добавлены с момента последней полной резервной копии, должны быть скопированы на носитель хранилища; все промежуточные сведения о резервном копировании игнорируются. Это могут быть целые файлы или определенные диапазоны в файлах. Разностная резервная копия связана с полной резервной копией и обычно не может быть восстановлена до тех пор, пока не будет восстановлена полная резервная копия. Если есть файлы журналов, они обычно не усекаются в результате этой резервной копии.

    Для восстановления разностной резервной копии требуется исходный образ резервной копии и последний образ разностной резервной копии, сделанные с момента последней полной резервной копии.

  • Добавочный (VSS_BT_INCREMENTAL). API VSS используется для того, чтобы гарантировать, что только файлы, которые были изменены или добавлены с момента последней полной или добавочной резервной копии, будут скопированы на носитель хранилища. Это могут быть целые файлы или определенные диапазоны в файлах. Некоторые модули записи не позволяют смешивать добавочные резервные копии с разностными резервными копиями. Если есть файлы журналов, они могут быть усечены в результате этой резервной копии.

    Для восстановления добавочной резервной копии требуется исходный образ резервной копии и все образы добавочной резервной копии, сделанные с момента первоначального резервного копирования.

  • Резервное копирование журналов (VSS_BT_LOG). Будут создаваться только файлы журнала модуля записи (файлы, добавленные в компонент с помощью метода IVssCreateWriterMetadata::AddDataBaseLogFiles и полученные путем вызова IVssWMComponent::GetDatabaseLogFile). Этот тип резервного копирования является специфическим для VSS. Резервное копирование журналов, как правило, выполняется довольно часто. Как правило, файл журнала будет усечен в результате этой резервной копии.

  • Копирование резервной копии (VSS_BT_COPY). Как и VSS_BT_FULL тип резервной копии, резервные копии файлов будут создаваться независимо от даты последней резервной копии. Однако журнал резервных копий каждого файла не обновляется, и этот тип резервного копирования нельзя использовать в качестве основы для добавочной или разностной резервной копии. Файлы журналов никогда не должны быть усечены в результате резервной копии.

Поддержка частичных файлов

Некоторые модули записи поддерживают восстановление файлов путем перезаписи частей файлов, которыми они управляют. Инициатор запроса может быть разработан таким образом, чтобы воспользоваться этим, и если да, он указывает на это, задав сведения в IVssBackupComponents::SetBackupState.

Модули записи указывают, какие типы резервных копий поддерживаются, вызывая IVssCreateWriterMetadata::SetBackupSchema при обработке события Identify . Параметр dsSchemaMask для метода IVssCreateWriterMetadata::SetBackupSchema — это битовая маска, указывающая, какие типы резервного копирования поддерживаются. Все модули записи должны поддерживать полные резервные копии.

VSS_BS_DIFFERENTIAL

Указывает на поддержку разностных резервных копий.

VSS_BS_INCREMENTAL

Указывает на поддержку добавочных резервных копий.

VSS_BS_LOG

Указывает на поддержку резервных копий журналов.

VSS_BS_COPY

Указывает на поддержку резервных копий.

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

Указывает, что модуль записи не поддерживает смешивание добавочных резервных копий с разностными резервными копиями.

Модуль записи может определить, какой тип резервного копирования выполняется, вызвав CVssWriter::GetBackupType. Самый ранний момент, когда это может быть выполнено, — это обработка события PrepareForBackup. CVssWriter::GetBackupType возвращает член перечисления VSS_BACKUP_TYPE . Если тип резервной копии не поддерживается модулем записи, модуль записи должен рассматривать резервную копию как полную резервную копию.

Метки резервных копий

Добавочные и разностные резервные копии всегда привязаны к предыдущей резервной копии. Существует два способа связывания резервных копий. Для простых хранилищ данных инициатор запроса может отслеживать корреляцию между резервными копиями. Однако для более сложных хранилищ данных модуль записи должен поддерживать собственную метку времени с резервной копией. эта метка времени может отслеживать положение в журнале, сведения о контрольных точках и т. д. Модуль записи указывает, что ему нужны собственные метки времени, задав бит VSS_BS_TIMESTAMPED при вызове IVssCreateWriterMetadata::SetBackupSchema.

Модуль записи может хранить метку времени с каждым компонентом, для которых создается резервная копия. Модуль записи сохраняет метку времени, вызывая IVssComponent::SetBackupStamp и передавая строковое представление метки для параметра wszBackupStamp . Как правило, модуль записи вызывает этот метод при обработке события PostSnapshot . Однако для резервных копий, не связанных с теневой копией, событие PostSnapshot не будет отправлено. В этом случае при обработке события PrepareForBackup необходимо вызвать IVssComponent::SetBackupStamp.

При выполнении добавочного или разностного резервного копирования инициатор запроса указывает средству записи метку резервного копирования предыдущей резервной копии, которая служит основой для этой резервной копии. Модуль записи может получить доступ к этой предыдущей метке резервной копии при обработке события PrepareForBackup или PostSnapshot, вызвав IVssComponent::GetPreviousBackupStamp. Модуль записи может использовать возвращенную метку, чтобы определить, что необходимо создать резервную копию.

Стратегии резервного копирования

Стратегии резервного копирования файлов

Часто резервные копии определенных файлов, указанных в метаданных модуля записи, требуются только при выполнении определенных типов резервного копирования. Некоторые файлы могут потребоваться только при выполнении полного резервного копирования. Другие файлы могут потребоваться только при выполнении добавочного или разностного резервного копирования. VSS предоставляет метод для записи, который указывает эти сведения инициатору запроса. При добавлении файлов в компоненты с помощью IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles или IVssCreateWriterMetadata::AddFilesToFileGroup параметр dwBackupTypeMask указывает, для каких типов резервных копий необходимо создавать резервные копии этих файлов. Маска может содержать одно или несколько из следующих значений:

VSS_FSBT_FULL_BACKUP_REQUIRED

Требуется для полного резервного копирования.

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

Требуется для разностных резервных копий.

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

Требуется для добавочных резервных копий.

VSS_FSBT_LOG_BACKUP_REQUIRED

Требуется для резервного копирования журналов.

VSS_FSBT_ALL_BACKUP_REQUIRED

Требуется для всех типов резервного копирования; это значение по умолчанию.

Эта спецификация переопределяет спецификацию селективности компонента. Например, рассмотрим компонент, все файлы которого помечены VSS_FSBT_LOG_BACKUP_REQUIRED , но не VSS_FSBT_FULL_BACKUP_REQUIRED. Предположим, что этот компонент нельзя выбрать для резервного копирования (bSelectable было false при вызове IVssCreateWriterMetadata::AddComponent ). В случае резервной копии журнала это означает, что все файлы в этом компоненте должны всегда создаваться для резервного копирования. Однако в случае полной резервной копии ни один из файлов не требуется создавать резервную копию, несмотря на то, что избирательность компонента подразумевает, что для него необходимо создать резервную копию.

Резервное копирование по времени последнего изменения

Один из способов указать, какие файлы были изменены, — использовать механизм разных файлов. Модуль записи может указать, что некоторые файлы в компоненте должны создаваться только в том случае, если они были изменены с определенного времени. Модуль записи вызывает IVssComponent::AddDifferencedFilesByLastModifyTime со спецификацией файла и временем последнего изменения. IVssComponent::AddDifferencedFilesByLastModifyTime обычно вызывается при обработке события PostSnapshot, хотя его можно вызвать при обработке события PrepareForBackup. Затем инициатор запроса должен создать резервную копию всех файлов, соответствующих спецификации файла, которые изменились с указанного времени. Если модуль записи использует механизм метки резервного копирования, это время последнего изменения будет определяться на основе предыдущей метки резервной копии в резервном документе. Модуль записи также может передать ноль для времени последнего изменения, что указывает, что инициатор запроса отвечает за определение времени последней резервной копии и файлов, измененных с этого времени.

Частичное резервное копирование файлов

Еще один способ указать изменения в инициаторе запроса — использовать механизм частичного создания файла. Модуль записи может указывать диапазоны байтов в файлах компонентов, которые необходимо создать для резервного копирования; модуль записи может указать эти диапазоны файлов при обработке события PostSnapshot или PrepareForBackup. Модуль записи вызывает IVssComponent::AddPartialFile , чтобы добавить спецификации частичного файла в резервную копию. Частичная спецификация файла состоит из пути и имени файла, а также сведений о том, какие диапазоны в файле необходимо создать для резервного копирования.

Правила спецификации файлов

IVssComponent::AddDifferencedFilesByLastModifyTime или IVssComponent::AddPartialFile можно использовать для изменения спецификаций файлов, заданных во время события Identify, или для добавления совершенно новых файлов в спецификацию. Если модуль записи изменяет набор данных во время события Identify с помощью IVssComponent::AddDifferencedFilesByLastModifyTime, то спецификация файла должна точно соответствовать одной из спецификаций файла в текущем компоненте. Спецификация файла не должна частично перекрывать файлы в текущем компоненте и не должна совпадать с файлами в других компонентах. Однако файлы, указанные с помощью IVssComponent::AddPartialFile , могут частично перекрывать другую спецификацию файла. Сведения, заданные IVssComponent::AddDifferencedFilesByLastModifyTime или IVssComponent::AddPartialFile , переопределяют набор данных, заданный ранее, с помощью интерфейса IVssCreateWriterMetadata в ответ на событие Identify.

Общие спецификации файлов могут иметь значение альтернативного расположения (заданное параметром wszAlternateLocationобъекта IVssCreateWriterMetadata::AddFilesToFileGroup), указывающее альтернативное расположение для получения файла во время резервного копирования. Если спецификация файла, заданная с помощью механизмов различающегося файла или частичного файла, соответствует существующей спецификации файла с альтернативным расположением, приложение резервного копирования получит данные из этого альтернативного расположения.

Если спецификация файла, заданная в IVssComponent::AddDifferencedFilesByLastModifyTime или в IVssComponent::AddPartialFile , не совпадает с файлами в компоненте, для которого выполняется резервное копирование, то все соответствующие файлы добавляются в резервную копию. При этом необходимо учесть, что модуль записи добавляет только файлы, существующие на томе, который уже копируется тенью. В противном случае инициатору запроса может не удается создать резервную копию этих файлов. Если эти функции вызываются при обработке события PostSnapshot, это можно определить с помощью метода CVssWriter::IsPathAffected . При вызове при обработке события PrepareForBackup модуль записи должен сделать это определение с помощью другого метода.

Резервное копирование без теневого копирования

Некоторые типы файлов могут не нуждаться в резервном копировании из тома теневого копирования. Например, это часто относится к файлам журнала базы данных. Так как файлы журналов растут монотонно, а модуль записи может точно указать, какие части файла будут архивироваться с помощью частичных файлов, часто можно создать резервную копию исходного тома. В качестве оптимизации модуль записи может пометить, какие файлы требуют теневых копий для различных типов резервных копий, используя флаги, заданные в параметре dwBackupTypeMaskобъекта IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles или IVssCreateWriterMetadata::AddFilesToFileGroup. Поддерживаются следующие флаги:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

Теневое копирование требуется для полного резервного копирования.

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

Теневое копирование требуется для разностных резервных копий.

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

Теневое копирование требуется для добавочных резервных копий.

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

Теневое копирование, необходимое для резервного копирования журналов.

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

Требуется теневое копирование для всех типов резервных копий; это значение по умолчанию.

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

Очистка резервного копирования

Если модулю записи необходимо выполнить усечение журнала или другую очистку после резервного копирования, это следует сделать при обработке события BackupComplete . Событие BackupShutdown будет отправлено через некоторое время после BackupComplete, поэтому некоторая очистка также может быть выполнена в обработчике событий BackupShutdown.

Событие BackupShutdown всегда отправляется после завершения резервного копирования. Если инициатор запроса завершает работу ненормально при выполнении резервного копирования, BackupShutdown будет отправлен немедленно, без предварительной отправки BackupComplete. Если модулю записи необходимо очистить какое-либо состояние, это можно сделать здесь; однако усечение журнала не должно происходить в этом случае, так как резервное копирование не обязательно завершено.

Стратегии восстановления

Основные задачи записи при восстановлении — проверка того, что восстановление может произойти при обработке события PreRestore и что восстановление произошло при обработке события PostRestore. Более сложные хранилища также выполняют процесс восстановления в обработчике PostRestore. Если восстановление является частью добавочного или разностного восстановления, модуль записи обычно хочет отложить этот процесс восстановления до тех пор, пока не будут завершены все добавочные или разностные восстановления. IVssComponent::GetAdditionalRestores укажет, является ли это окончательным восстановлением этого компонента или требуется выполнить дополнительные операции восстановления. Если IVssComponent::GetAdditionalRestores возвращает значение true, модуль записи не должен выполнять процедуру восстановления для этого компонента.

Новые цели

При поддержке модуля записи инициатор запроса может восстановить файлы данных в расположении, отличном от исходного расположения времени резервного копирования. Модуль записи указывает на поддержку этого режима восстановления, задав бит VSS_BS_WRITER_SUPPORTS_NEW_TARGET в параметре dsSchemaMask при вызове IVssCreateWriterMetadata::SetBackupSchema. Модуль записи получает новые расположения для файлов компонентов во время восстановления, вызывая IVssComponent::GetNewTargetCount и IVssComponent::GetNewTarget.

Целевые объекты

В сложных сценариях восстановления средству записи может потребоваться сопоставить диапазоны файлов резервной копии с разными диапазонами того же или другого файла. Это можно сделать с помощью механизма направленных целей. Для этого модуль записи должен сначала указать, что это происходит, вызвав IVssComponent::SetRestoreTarget, передав VSS_RT_DIRECTED для целевого параметра. Затем для каждого сопоставления модуль записи вызывает IVssComponent::AddDirectedTarget. Этот метод принимает полный путь к исходному файлу в резервной копии и полный путь к целевому файлу, который будет восстановлен. Он также принимает список диапазонов для каждого из этих файлов. Модуль записи вызывает эти функции при обработке события PreRestore, а затем инициатор запроса отвечает за восстановление указанных диапазонов в исходном файле в сопоставленные диапазоны в целевом файле. Формат строки диапазонов совпадает с форматом в IVssComponent::AddPartialFile.

Метаданные частного модуля записи

Для записи часто бывает полезно поддерживать частные метаданные с резервной копией для правильного выполнения добавочного или разностного восстановления. Модуль записи может вызывать IVssComponent::SetBackupMetadata при обработке PrepareForBackup или PostSnapshot для хранения метаданных. Модуль записи может получить доступ к этим метаданным во время preRestore или PostRestore, вызвав IVssComponent::GetBackupMetadata. Метаданные также можно хранить с частичной спецификацией файла с помощью параметра wszMetadataобъекта IVssComponent::AddPartialFile; Доступ к этим метаданным осуществляется через параметр pbstrMetadataобъекта IVssComponent::GetPartialFile. Модуль записи также может передавать метаданные между CVssWriter::OnPreRestore и CVssWriter::OnPostRestore. В CVssWriter::OnPreRestore метаданные задаются путем вызова IVssComponent::SetRestoreMetadata. В CVssWriter::OnPostRestore метаданные извлекаются путем вызова IVssComponent::GetRestoreMetadata.