Rolle "Writer" beim Sichern komplexer Speicher

Wie bei allen wichtigen Vorgängen unter VSS erfordern inkrementelle und differenzielle Sicherungen eine enge Zusammenarbeit zwischen Anforderern und Autoren.

Sicherungstypen

Die Infrastruktur bietet besondere Unterstützung für fünf Sicherungstypen. Die Schritte lassen sich wie folgt beschreiben:

  • Vollständig (VSS_BT_FULL). Dateien werden unabhängig vom letzten Sicherungsdatum gesichert. Der Sicherungsverlauf jeder Datei wird aktualisiert, und diese Art der Sicherung kann als Grundlage für eine inkrementelle oder differenzielle Sicherung verwendet werden. Wenn Protokolldateien vorhanden sind, können diese als Ergebnis dieser Sicherung abgeschnitten werden.

    Für die Wiederherstellung einer vollständigen Sicherung ist nur ein einzelnes Sicherungsimage erforderlich.

  • Differenzial (VSS_BT_DIFFERENTIAL). Die VSS-API wird verwendet, um sicherzustellen, dass nur Dateien, die seit der letzten vollständigen Sicherung geändert oder hinzugefügt wurden, auf ein Speichermedium kopiert werden. Alle zwischengeschalteten Sicherungsinformationen werden ignoriert. Dies kann ganze Dateien oder bestimmte Bereiche innerhalb von Dateien umfassen. Eine differenzielle Sicherung ist einer vollständigen Sicherung zugeordnet und kann in der Regel erst wiederhergestellt werden, wenn die vollständige Sicherung wiederhergestellt wurde. Wenn Protokolldateien vorhanden sind, werden diese in der Regel nicht als Ergebnis dieser Sicherung abgeschnitten.

    Das Wiederherstellen einer differenziellen Sicherung erfordert das ursprüngliche Sicherungsimage und das neueste differenzielle Sicherungsimage, das seit der letzten vollständigen Sicherung erstellt wurde.

  • Inkrementell (VSS_BT_INCREMENTAL). Die VSS-API wird verwendet, um sicherzustellen, dass nur Dateien, die seit der letzten vollständigen oder inkrementellen Sicherung geändert oder hinzugefügt wurden, auf ein Speichermedium kopiert werden sollen. Dies kann ganze Dateien oder bestimmte Bereiche innerhalb von Dateien umfassen. Einige Autoren lassen nicht zu, dass inkrementelle Sicherungen mit differenziellen Sicherungen gemischt werden. Wenn Protokolldateien vorhanden sind, können diese als Ergebnis dieser Sicherung abgeschnitten werden.

    Das Wiederherstellen einer inkrementellen Sicherung erfordert das ursprüngliche Sicherungsimage und alle seit der ersten Sicherung vorgenommenen inkrementellen Sicherungsimages.

  • Protokollsicherung (VSS_BT_LOG). Es werden nur die Protokolldateien eines Writers (Dateien, die einer Komponente mit der IVssCreateWriterMetadata::AddDataBaseLogFiles-Methode hinzugefügt und durch einen Aufruf von IVssWMComponent::GetDatabaseLogFile abgerufen werden) gesichert. Dieser Sicherungstyp ist spezifisch für VSS. Protokollsicherungen werden häufig erstellt. In der Regel wird die Protokolldatei als Ergebnis dieser Sicherung abgeschnitten.

  • Sicherung kopieren (VSS_BT_COPY). Wie der VSS_BT_FULL Sicherungstyps werden Dateien unabhängig vom letzten Sicherungsdatum gesichert. Der Sicherungsverlauf jeder Datei wird jedoch nicht aktualisiert, und diese Art der Sicherung kann nicht als Grundlage für eine inkrementelle oder differenzielle Sicherung verwendet werden. Protokolldateien sollten niemals als Ergebnis einer Kopiersicherung abgeschnitten werden.

Teilweise Dateiunterstützung

Einige Autoren unterstützen die Dateiwiederherstellung durch das Überschreiben von Teilen der von ihnen verwalteten Dateien. Ein Anforderer kann so konzipiert sein, dass er dies nutzt, und wenn dies der Fall ist, wird dies durch Festlegen der Informationen in IVssBackupComponents::SetBackupState angegeben.

Die Writer geben an, welche Art von Sicherungen unterstützt werden, indem sie IVssCreateWriterMetadata::SetBackupSchema während der Verarbeitung des Identify-Ereignisses aufrufen. Der dsSchemaMask-Parameter für die IVssCreateWriterMetadata::SetBackupSchema-Methode ist eine Bitmaske, die angibt, welche Sicherungstypen unterstützt werden. Alle Autoren müssen vollständige Sicherungen unterstützen.

VSS_BS_DIFFERENTIAL

Gibt die Unterstützung für differenzielle Sicherungen an.

VSS_BS_INCREMENTAL

Gibt die Unterstützung für inkrementelle Sicherungen an.

VSS_BS_LOG

Gibt die Unterstützung für Protokollsicherungen an.

VSS_BS_COPY

Gibt die Unterstützung für Kopiersicherungen an.

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

Gibt an, dass ein Writer das Mischen inkrementeller Sicherungen mit differenziellen Sicherungen nicht unterstützt.

Der Writer kann bestimmen, welcher Sicherungstyp ausgeführt wird, indem er CVssWriter::GetBackupType aufruft. Der früheste Zeitpunkt, an dem dies ausgeführt werden kann, ist die Verarbeitung des PrepareForBackup-Ereignisses. CVssWriter::GetBackupType gibt ein Element der VSS_BACKUP_TYPE-Enumeration zurück. Wenn der Sicherungstyp vom Writer nicht unterstützt wird, sollte der Writer die Sicherung als vollständige Sicherung behandeln.

Sicherungsstempel

Inkrementelle und differenzielle Sicherungen sind immer an eine vorherige Sicherung gebunden. Es gibt zwei Möglichkeiten, Sicherungen zu binden. Bei einfachen Datenspeichern kann der Anforderer die Korrelation zwischen Sicherungen nachverfolgen. Bei komplexeren Datenspeichern muss der Writer jedoch seinen eigenen Zeitstempel mit der Sicherung beibehalten. Dieser Zeitstempel kann die Protokollposition, Prüfpunktinformationen usw. nachverfolgen. Ein Writer gibt an, dass er eigene Zeitstempel benötigt, indem er das VSS_BS_TIMESTAMPED Bit festlegt, wenn er IVssCreateWriterMetadata::SetBackupSchema aufruft.

Ein Writer kann einen Zeitstempel mit jeder Komponente speichern, die gesichert wird. Der Writer speichert den Zeitstempel, indem er IVssComponent::SetBackupStamp aufruft und eine Zeichenfolgendarstellung des Stempels für den wszBackupStamp-Parameter übergibt . Im Allgemeinen ruft ein Writer diese Methode auf, während das PostSnapshot-Ereignis verarbeitet wird. Bei Sicherungen ohne Schattenkopie wird das PostSnapshot-Ereignis jedoch nicht gesendet. In diesem Fall muss IVssComponent::SetBackupStamp beim Verarbeiten des PrepareForBackup-Ereignisses aufgerufen werden.

Wenn eine inkrementelle oder differenzielle Sicherung ausgeführt wird, gibt der Anforderer dem Writer den Sicherungsstempel der vorherigen Sicherung an, der als Basis für diese Sicherung dient. Der Writer kann auf diesen vorherigen Sicherungsstempel zugreifen, während er entweder das PrepareForBackup- oder PostSnapshot-Ereignis verarbeitet, indem er IVssComponent::GetPreviousBackupStamp aufruft. Der Writer kann den zurückgegebenen Stempel verwenden, um zu bestimmen, was gesichert werden muss.

Sicherungsstrategien

Strategien für Dateisicherungsdateien

Häufig müssen bestimmte Dateien, die in den Writer-Metadaten gemeldet werden, nur gesichert werden, wenn bestimmte Sicherungstypen ausgeführt werden. Einige Dateien sind möglicherweise nur beim Ausführen einer vollständigen Sicherung erforderlich. Andere Dateien sind möglicherweise nur beim Ausführen einer inkrementellen oder differenziellen Sicherung erforderlich. VSS stellt eine Methode bereit, mit der die Autoren diese Informationen an den Anforderer angeben können. Beim Hinzufügen von Dateien zu Komponenten mithilfe von IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles oder IVssCreateWriterMetadata::AddFilesToFileGroup gibt der dwBackupTypeMask-Parameter an, für welche Sicherungstypen diese Dateien gesichert werden müssen. Die Maske kann mindestens einen der folgenden Werte enthalten:

VSS_FSBT_FULL_BACKUP_REQUIRED

Erforderlich für vollständige Sicherungen.

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

Erforderlich für differenzielle Sicherungen.

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

Erforderlich für inkrementelle Sicherungen.

VSS_FSBT_LOG_BACKUP_REQUIRED

Erforderlich für Protokollsicherungen.

VSS_FSBT_ALL_BACKUP_REQUIRED

Erforderlich für alle Sicherungstypen; Dies ist der Standardwert.

Diese Spezifikation setzt die Selektivitätsspezifikation der Komponente außer Kraft. Betrachten Sie beispielsweise eine Komponente, deren Dateien alle mit VSS_FSBT_LOG_BACKUP_REQUIRED , aber nicht mit VSS_FSBT_FULL_BACKUP_REQUIRED gekennzeichnet sind. Angenommen, diese Komponente kann nicht für die Sicherung ausgewählt werden (bSelectable war false, als IVssCreateWriterMetadata::AddComponent aufgerufen wurde). Bei einer Protokollsicherung bedeutet dies, dass alle Dateien in dieser Komponente immer gesichert werden müssen. Im Falle einer vollständigen Sicherung muss jedoch keine der Dateien gesichert werden, obwohl die Selektivität der Komponente impliziert, dass sie gesichert werden sollte.

Sicherung nach Dem Zeitpunkt der letzten Änderung

Eine Möglichkeit für einen Writer, anzugeben, welche Dateien geändert wurden, ist die Verwendung des differenzierten Dateimechanismus. Ein Writer kann angeben, dass bestimmte Dateien in einer Komponente nur gesichert werden sollen, wenn sie seit einer bestimmten Zeit geändert wurden. Der Writer ruft IVssComponent::AddDifferencedFilesByLastModifyTime mit einer Dateispezifikation und einem Zeitpunkt der letzten Änderung auf. IVssComponent::AddDifferencedFilesByLastModifyTime wird in der Regel beim Verarbeiten des PostSnapshot-Ereignisses aufgerufen, obwohl es beim Verarbeiten des PrepareForBackup-Ereignisses aufgerufen werden kann. Der Anforderer muss dann alle Dateien sichern, die der Dateispezifikation entsprechen, die sich seit der angegebenen Zeit geändert haben. Wenn der Writer den Sicherungsstempelmechanismus verwendet, wird dieser Zeitpunkt der letzten Änderung basierend auf dem vorherigen Sicherungsstempel im Sicherungsdokument bestimmt. Der Writer kann auch für die letzte Änderungszeit null übergeben, was angibt, dass der Anforderer für die Bestimmung des Zeitpunkts der letzten Sicherung und der seit diesem Zeitpunkt geänderten Dateien verantwortlich ist.

Partielle Dateisicherung

Eine weitere Möglichkeit für einen Writer, Änderungen am Anforderer anzugeben, ist die Verwendung des Mechanismus für partielle Dateien. Ein Writer kann Bytebereiche in Komponentendateien angeben, die gesichert werden müssen. Der Writer kann diese Dateibereiche angeben, während er entweder das PostSnapshot- oder PrepareForBackup-Ereignis verarbeitet. Der Writer ruft IVssComponent::AddPartialFile auf, um der Sicherung partielle Dateispezifikationen hinzuzufügen. Eine partielle Dateispezifikation besteht aus einem Pfad und Dateinamen zusammen mit Informationen darüber, welche Bereiche in der Datei gesichert werden müssen.

Dateispezifikationsregeln

IVssComponent::AddDifferencedFilesByLastModifyTime oder IVssComponent::AddPartialFile können sowohl verwendet werden, um dateispezifikationen zu ändern, die während des Identify-Ereignisses angegeben wurden, oder um der Spezifikation völlig neue Dateien hinzuzufügen. Wenn der Writer die während des Identify-Ereignisses mit IVssComponent::AddDifferencedFilesByLastModifyTime festgelegten Informationen ändert, muss die Dateispezifikation genau mit einer der Dateispezifikationen in der aktuellen Komponente übereinstimmen. Die Dateispezifikation darf Dateien in der aktuellen Komponente nicht teilweise überlappen, und sie darf nicht mit Dateien in anderen Komponenten übereinstimmen. Dateien, die mit IVssComponent::AddPartialFile angegeben werden, können sich jedoch teilweise über eine andere Dateispezifikation überschneiden. Die von IVssComponent::AddDifferencedFilesByLastModifyTime oder IVssComponent::AddPartialFile festgelegten Informationen werden überschrieben, die zuvor über die IVssCreateWriterMetadata-Schnittstelle als Reaktion auf das Identify-Ereignis festgelegt wurden.

Allgemeine Dateispezifikationen können einen Wert für alternativen Speicherort aufweisen (festgelegt durch den wszAlternateLocation-Parameter von IVssCreateWriterMetadata::AddFilesToFileGroup), der einen alternativen Speicherort angibt, aus dem die Datei zur Sicherungszeit abgerufen werden soll. Wenn die Dateispezifikation, die über die Mechanismen für differenzierte Dateien oder Partielle Dateien festgelegt wird, einer vorhandenen Dateispezifikation mit einem alternativen Speicherort entspricht, ruft die Sicherungsanwendung die Daten von diesem alternativen Speicherort ab.

Wenn die in IVssComponent::AddDifferencedFilesByLastModifyTime oder in IVssComponent::AddPartialFile festgelegte Dateispezifikation nicht mit den Dateien in der Komponente übereinstimmt, die gesichert werden, werden jetzt alle übereinstimmenden Dateien der Sicherung hinzugefügt. Es muss darauf geachtet werden, dass der Writer nur Dateien hinzufügt, die auf einem Volume vorhanden sind, das bereits schattenkopiert wird. Andernfalls kann der Anforderer diese Dateien möglicherweise nicht sichern. Wenn diese Funktionen während der Verarbeitung des PostSnapshot-Ereignisses aufgerufen werden, kann dies mithilfe der CVssWriter::IsPathAffected-Methode bestimmt werden. Wenn beim Behandeln des PrepareForBackup-Ereignisses aufgerufen wird, muss der Writer diese Bestimmung mithilfe einer anderen Methode vornehmen.

Sicherung ohne Schattenkopie

Bestimmte Dateitypen müssen möglicherweise nicht von einem Schattenkopievolume gesichert werden. Dies gilt beispielsweise häufig für Datenbankprotokolldateien. Da Protokolldateien monoton wachsen und ein Writer genau angeben kann, welche Teile der Datei mithilfe von Teildateien gesichert werden sollen, ist es häufig möglich, das Protokoll vom ursprünglichen Volume zu sichern. Als Optimierung kann ein Writer markieren, welche Dateien Schattenkopien für verschiedene Sicherungstypen erfordern, indem er die Flags verwendet, die im dwBackupTypeMask-Parameter von IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles oder IVssCreateWriterMetadata::AddFilesToFileGroup festgelegt sind. Folgende Flags werden unterstützt:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

Schattenkopie für vollständige Sicherungen erforderlich.

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

Schattenkopie für differenzielle Sicherungen erforderlich.

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

Schattenkopie für inkrementelle Sicherungen erforderlich.

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

Schattenkopie für Protokollsicherungen erforderlich.

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

Schattenkopie für alle Sicherungstypen erforderlich; Dies ist der Standardwert.

Wenn ein bestimmtes Volume nur Komponenten enthält, die keine Schattenkopie für diese Sicherung erfordern, kann der Anforderer den Schritt zum Erstellen einer Schattenkopie für dieses Volume überspringen. Alle Daten auf diesem Volume können direkt vom ursprünglichen Volume auf die Sicherungsmedien kopiert werden.

Sicherungsbereinigung

Wenn der Writer Protokollabkürzungen oder andere Bereinigungen nach der Sicherung durchführen muss, ist dies der richtige Ort für die Verarbeitung des BackupComplete-Ereignisses . Das BackupShutdown-Ereignis wird einige Zeit nach BackupComplete gesendet, sodass einige Bereinigungen auch im BackupShutdown-Ereignishandler durchgeführt werden können.

Das BackupShutdown-Ereignis wird immer nach beendigung einer Sicherung gesendet. Wenn der Anforderer beim Ausführen einer Sicherung abnormal beendet wird, wird BackupShutdown sofort gesendet, ohne zuerst BackupComplete zu senden. Wenn der Writer einen Zustand sauber muss, kann dies hier erfolgen. In diesem Fall sollte die Protokollabkürzung jedoch nicht erfolgen, da die Sicherung nicht notwendigerweise abgeschlossen wurde.

Wiederherstellungsstrategien

Die grundlegenden Aufgaben von Writern bei der Wiederherstellung bestehen darin, zu überprüfen, ob die Wiederherstellung bei der Behandlung des PreRestore-Ereignisses erfolgen kann und ob die Wiederherstellung bei der Behandlung des PostRestore-Ereignisses erfolgt ist. Komplexere Speicher führen auch einen Wiederherstellungsprozess im PostRestore-Handler durch. Wenn die Wiederherstellung Teil einer inkrementellen oder differenziellen Wiederherstellung ist, möchte der Writer diesen Wiederherstellungsprozess in der Regel verzögern, bis alle inkrementellen oder differenziellen Wiederherstellungen abgeschlossen sind. IVssComponent::GetAdditionalRestores gibt an, ob dies die endgültige Wiederherstellung dieser Komponente ist oder ob weitere Wiederherstellungen anstehen. Wenn IVssComponent::GetAdditionalRestorestrue zurückgibt, sollte der Writer seine Wiederherstellungsprozedur für diese Komponente nicht ausführen.

Neue Ziele

Wenn dies vom Writer unterstützt wird, kann der Anforderer Datendateien an einem anderen Speicherort als dem ursprünglichen Speicherort der Sicherungszeit wiederherstellen. Ein Writer gibt die Unterstützung für diesen Wiederherstellungsmodus an, indem das VSS_BS_WRITER_SUPPORTS_NEW_TARGET Bit im dsSchemaMask-Parameter festgelegt wird, wenn IVssCreateWriterMetadata::SetBackupSchema aufgerufen wird. Ein Writer ruft die neuen Speicherorte für Komponentendateien zur Wiederherstellungszeit ab, indem er IVssComponent::GetNewTargetCount und IVssComponent::GetNewTarget aufruft.

Zielgerichtete Ziele

Bei komplizierten Wiederherstellungsszenarien möchte ein Writer möglicherweise Bereiche einer gesicherten Datei verschiedenen Bereichen derselben oder einer anderen Datei zuordnen. Dies kann mithilfe des Mechanismus für das gerichtete Ziel erfolgen. Hierzu muss ein Writer zuerst angeben, dass dies geschieht, indem er IVssComponent::SetRestoreTarget aufruft und VSS_RT_DIRECTED für den Zielparameter übergibt. Anschließend ruft der Writer für jede Zuordnung IVssComponent::AddDirectedTarget auf. Diese Methode verwendet einen vollständigen Pfad zu einer Quelldatei in der Sicherung und einen vollständigen Pfad zu einer Zieldatei, in der wiederhergestellt wird. Außerdem wird für jede dieser Dateien eine Bereichsliste benötigt. Der Writer ruft diese Funktionen beim Behandeln des PreRestore-Ereignisses auf, und der Anforderer ist dann für die Wiederherstellung der angegebenen Bereiche in der Quelldatei in den zugeordneten Bereichen in der Zieldatei verantwortlich. Das Format der Bereichszeichenfolge ist identisch mit dem in IVssComponent::AddPartialFile

Private Writer-Metadaten

Für einen Writer ist es häufig nützlich, private Metadaten mit einer Sicherung zu verwalten, um eine inkrementelle oder differenzielle Wiederherstellung ordnungsgemäß durchzuführen. Ein Writer kann IVssComponent::SetBackupMetadata aufrufen, während er entweder PrepareForBackup oder PostSnapshot verarbeitet, um Metadaten zu speichern. Auf diese Metadaten kann der Writer entweder während PreRestore oder PostRestore zugreifen, indem IVssComponent::GetBackupMetadata aufgerufen wird. Metadaten können auch mit partieller Dateispezifikation gespeichert werden, indem sie den wszMetadata-Parameter von IVssComponent::AddPartialFile verwenden. Auf diese Metadaten wird über den pbstrMetadata-Parametervon IVssComponent::GetPartialFile zugegriffen. Der Writer kann auch Metadaten an sich selbst zwischen CVssWriter::OnPreRestore und CVssWriter::OnPostRestore übergeben. In CVssWriter::OnPreRestore werden die Metadaten durch Aufrufen von IVssComponent::SetRestoreMetadata festgelegt. In CVssWriter::OnPostRestore werden die Metadaten durch Aufrufen von IVssComponent::GetRestoreMetadata abgerufen.