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

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

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

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

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

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

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

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

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