Роль Writer в создании резервных копий сложных хранилищ данных

Как и во всех важных операциях в 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 не будет отправлено. В этом случае IVssComponent::SetBackupStamp необходимо вызвать при обработке события PrepareForBackup.

При выполнении инкрементного или дифференциального резервного копирования запрашивающий указывает метку предыдущей резервной копии, которая служит основой для этой резервной копии. Модуль записи может получить доступ к этой предыдущей метке резервного копирования при обработке события 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 могут быть использованы как для изменения спецификаций файлов, заданных во время события идентификации, так и для добавления в спецификацию совершенно новых файлов. Если модуль записи изменяет набор данных во время события Идентификации с помощью IVssComponent::AddDifferencedFilesByLastModifyTime, спецификация файла должна точно соответствовать одной из спецификаций файлов в текущем компоненте. Спецификация файла не должна частично перекрываться в текущем компоненте, и она не должна соответствовать файлам в других компонентах. Файлы, указанные с помощью IVssComponent::AddPartialFile, могут частично перекрывать другую спецификацию файла. Сведения, заданные с помощью IVssComponent::AddDifferencedFilesByLastModifyTime или IVssComponent::AddPartialFile, переопределяют ранее заданную информацию через интерфейс IVssCreateWriterMetadata в ответ на событие определяющее.

Общие спецификации файлов могут иметь значение альтернативного расположения (задается параметром wszAlternateLocationIVssCreateWriterMetadata::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; доступ к этим метаданным осуществляется через параметр pbstrMetadataIVssComponent::GetPartialFile. Записыватель также может передавать метаданные самому себе между CVssWriter::OnPreRestore и CVssWriter::OnPostRestore. В CVssWriter::OnPreRestoreметаданные задаются путем вызова IVssComponent::SetRestoreMetadata. В CVssWriter::OnPostRestoreметаданные извлекаются путем вызова IVssComponent::GetRestoreMetadata.