Rol de escritor en la copia de seguridad de almacenes complejos

Al igual que con todas las operaciones importantes en VSS, las copias de seguridad incrementales y diferenciales requieren una estrecha cooperación entre los solicitantes y los escritores.

Tipos de copia de seguridad

La infraestructura proporciona compatibilidad especial con cinco tipos de copia de seguridad. A continuación se detalla la descripción de estos pasos:

  • Completo (VSS_BT_FULL). Se realizará una copia de seguridad de los archivos independientemente de su última fecha de copia de seguridad. El historial de copia de seguridad de cada archivo se actualizará y este tipo de copia de seguridad se puede usar como base de una copia de seguridad incremental o diferencial. Si hay archivos de registro, se pueden truncar como resultado de esta copia de seguridad.

    La restauración de una copia de seguridad completa solo requiere una sola imagen de copia de seguridad.

  • Diferencial (VSS_BT_DIFFERENTIAL). La API de VSS se usa para asegurarse de que solo se van a copiar los archivos que se han cambiado o agregado desde la última copia de seguridad completa a un medio de almacenamiento; se omite toda la información de copia de seguridad intermedia. Esto puede incluir archivos completos o intervalos específicos dentro de los archivos. Una copia de seguridad diferencial está asociada a una copia de seguridad completa y, por lo general, no se puede restaurar hasta que se haya restaurado la copia de seguridad completa. Si hay archivos de registro, normalmente no se truncarán como resultado de esta copia de seguridad.

    La restauración de una copia de seguridad diferencial requiere la imagen de copia de seguridad original y la imagen de copia de seguridad diferencial más reciente realizada desde la última copia de seguridad completa.

  • Incremental (VSS_BT_INCREMENTAL). La API de VSS se usa para asegurarse de que solo se copiarán los archivos que se han cambiado o agregado desde la última copia de seguridad completa o incremental en un medio de almacenamiento. Esto puede incluir archivos completos o intervalos específicos dentro de los archivos. Algunos escritores no permiten que las copias de seguridad incrementales se mezclen con copias de seguridad diferenciales. Si hay archivos de registro, se pueden truncar como resultado de esta copia de seguridad.

    La restauración de una copia de seguridad incremental requiere la imagen de copia de seguridad original y todas las imágenes de copia de seguridad incrementales realizadas desde la copia de seguridad inicial.

  • Copia de seguridad de registros (VSS_BT_LOG). Solo se realizará una copia de seguridad de los archivos de registro de un escritor (archivos agregados a un componente con el método IVssCreateWriterMetadata::AddDataBaseLogFiles y recuperado por una llamada a IVssWMComponent::GetDatabaseLogFile). Este tipo de copia de seguridad es específico de VSS. Las copias de seguridad de registros suelen realizarse con mucha frecuencia. Normalmente, el archivo de registro se truncará como resultado de esta copia de seguridad.

  • Copia de seguridad (VSS_BT_COPY). Al igual que el tipo de copia de seguridad VSS_BT_FULL, se realizará una copia de seguridad de los archivos independientemente de su última fecha de copia de seguridad. Sin embargo, el historial de copia de seguridad de cada archivo no se actualizará y este tipo de copia de seguridad no se puede usar como base de una copia de seguridad incremental o diferencial. Los archivos de registro nunca se deben truncar como resultado de una copia de seguridad de copia.

Compatibilidad parcial con archivos

Algunos escritores admiten la restauración de archivos a través de la sobrescritura de partes de los archivos que administran. Un solicitante se puede diseñar para aprovechar esto y, si es así, indica esto estableciendo la información en IVssBackupComponents::SetBackupState.

Los escritores indican qué tipo de copias de seguridad se admiten llamando a IVssCreateWriterMetadata::SetBackupSchema mientras se procesa el evento Identify . El parámetro dsSchemaMask para el método IVssCreateWriterMetadata::SetBackupSchema es una máscara de bits que indica qué tipos de copia de seguridad se admiten. Todos los escritores deben admitir copias de seguridad completas.

VSS_BS_DIFFERENTIAL

Indica la compatibilidad con copias de seguridad diferenciales.

VSS_BS_INCREMENTAL

Indica la compatibilidad con las copias de seguridad incrementales.

VSS_BS_LOG

Indica la compatibilidad con las copias de seguridad de registros.

VSS_BS_COPY

Indica la compatibilidad con las copias de seguridad de copia.

VSS_BS_EXCLUSIVE_INCREMENTAL_DIFFERENTIAL

Indica que un escritor no admite la combinación de copias de seguridad incrementales con copias de seguridad diferenciales.

El escritor puede determinar qué tipo de copia de seguridad se está realizando llamando a CVssWriter::GetBackupType. El punto más antiguo en el que se puede realizar es mientras se procesa el evento PrepareForBackup. CVssWriter::GetBackupType devolverá un miembro de la enumeración VSS_BACKUP_TYPE . Si el escritor no admite el tipo de copia de seguridad, el escritor debe tratar la copia de seguridad como una copia de seguridad completa.

Stamps de copia de seguridad

Las copias de seguridad incrementales y diferenciales siempre están vinculadas a una copia de seguridad anterior. Hay dos maneras de vincular copias de seguridad. En el caso de almacenes de datos simples, el solicitante puede realizar un seguimiento de la correlación entre las copias de seguridad. Sin embargo, para almacenes de datos más complejos, el escritor deberá mantener su propia marca de tiempo con la copia de seguridad; esta marca de tiempo puede realizar un seguimiento de la posición del registro, la información del punto de control, etc. Un escritor indica que necesita sus propias marcas de tiempo estableciendo el bit de VSS_BS_TIMESTAMPED cuando llama a IVssCreateWriterMetadata::SetBackupSchema.

Un escritor puede almacenar una marca de tiempo con cada componente del que se realiza una copia de seguridad. El escritor almacena la marca de tiempo llamando a IVssComponent::SetBackupStamp y pasando una representación de cadena del sello para el parámetro wszBackupStamp . Por lo general, un escritor llamará a este método mientras procesa el evento PostSnapshot . Sin embargo, para las copias de seguridad que no implican una instantánea, no se enviará el evento PostSnapshot. En este caso, se debe llamar a IVssComponent::SetBackupStamp mientras se procesa el evento PrepareForBackup .

Cuando se realiza una copia de seguridad incremental o diferencial, el solicitante indicará al escritor la marca de copia de seguridad de la copia de seguridad anterior que actúa como base para esta copia de seguridad. El escritor puede acceder a esta marca de copia de seguridad anterior mientras procesa el evento PrepareForBackup o PostSnapshot mediante una llamada a IVssComponent::GetPreviousBackupStamp. El escritor puede usar la marca devuelta para determinar de qué se debe hacer una copia de seguridad.

Estrategias de copia de seguridad

Estrategias de archivos de copia de seguridad de archivos

A menudo, determinados archivos notificados en los metadatos del escritor solo se necesitan realizar copias de seguridad al realizar determinados tipos de copia de seguridad. Es posible que algunos archivos solo sean necesarios al realizar una copia de seguridad completa. Es posible que otros archivos solo sean necesarios al realizar una copia de seguridad incremental o diferencial. VSS proporciona un método para que los escritores indiquen esta información al solicitante. Al agregar archivos a componentes mediante IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles o IVssCreateWriterMetadata::AddFilesToFileGroup, el parámetro dwBackupTypeMask indica para qué tipos de copia de seguridad se debe realizar una copia de seguridad de estos archivos. La máscara puede contener uno o varios de los valores siguientes:

VSS_FSBT_FULL_BACKUP_REQUIRED

Necesario para copias de seguridad completas.

VSS_FSBT_DIFFERENTIAL_BACKUP_REQUIRED

Necesario para copias de seguridad diferenciales.

VSS_FSBT_INCREMENTAL_BACKUP_REQUIRED

Necesario para copias de seguridad incrementales.

VSS_FSBT_LOG_BACKUP_REQUIRED

Se requiere para las copias de seguridad de registros.

VSS_FSBT_ALL_BACKUP_REQUIRED

Necesario para todos los tipos de copia de seguridad; este es el valor predeterminado.

Esta especificación invalida la especificación de selectividad del componente. Por ejemplo, considere un componente cuyos archivos están marcados con VSS_FSBT_LOG_BACKUP_REQUIRED pero no con VSS_FSBT_FULL_BACKUP_REQUIRED. Supongamos que este componente no se puede seleccionar para la copia de seguridad (bSelectable era false cuando se llamó a IVssCreateWriterMetadata::AddComponent ). En el caso de una copia de seguridad de registros, esto significa que siempre se debe realizar una copia de seguridad de todos los archivos de este componente. Sin embargo, en el caso de una copia de seguridad completa, no es necesario realizar una copia de seguridad de ninguno de los archivos, a pesar de que la selectividad del componente implica que se debe realizar una copia de seguridad.

Copia de seguridad por hora de última modificación

Una manera de que un escritor indique qué archivos han cambiado es mediante el mecanismo de archivo diferente. Un escritor puede especificar que solo se debe realizar una copia de seguridad de determinados archivos de un componente si se han modificado desde un momento determinado. El escritor llama a IVssComponent::AddDifferencedFilesByLastModifyTime con una especificación de archivo y una hora de última modificación. Se suele llamar a IVssComponent::AddDifferencedFilesByLastModifyTime mientras se procesa el evento PostSnapshot, aunque se puede llamar al procesar el evento PrepareForBackup. A continuación, el solicitante debe hacer una copia de seguridad de todos los archivos que coincidan con la especificación de archivo que han cambiado desde la hora especificada. Si el escritor usa el mecanismo de marca de copia de seguridad, esta última hora de modificación se determinará en función de la marca de copia de seguridad anterior en el documento de copia de seguridad. El escritor también puede pasar cero para la hora de última modificación, lo que indica que el solicitante es responsable de determinar la hora de la última copia de seguridad y los archivos han cambiado desde ese momento.

Copia de seguridad parcial de archivos

Otra manera de que un escritor indique los cambios en el solicitante es mediante el mecanismo de archivo parcial. Un escritor puede especificar intervalos de bytes dentro de los archivos de componentes de los que es necesario realizar una copia de seguridad; el escritor puede especificar estos intervalos de archivos mientras se procesa el evento PostSnapshot o PrepareForBackup. El escritor llama a IVssComponent::AddPartialFile para agregar especificaciones de archivo parciales a la copia de seguridad. Una especificación de archivo parcial consta de una ruta de acceso y un nombre de archivo junto con información sobre los intervalos de los archivos de los que se debe realizar una copia de seguridad.

Reglas de especificación de archivo

IVssComponent::AddDifferencedFilesByLastModifyTime o IVssComponent::AddPartialFile se pueden usar para modificar las especificaciones de archivo dadas durante el evento Identify o para agregar archivos completamente nuevos a la especificación. Si el escritor está modificando la información establecida durante el evento Identify mediante IVssComponent::AddDifferencedFilesByLastModifyTime, la especificación del archivo debe coincidir exactamente con una de las especificaciones de archivo del componente actual. La especificación de archivo no debe superponerse parcialmente a los archivos del componente actual y no debe coincidir con los archivos de ningún otro componente. Los archivos especificados mediante IVssComponent::AddPartialFile pueden superponerse parcialmente a otra especificación de archivo. La información establecida por IVssComponent::AddDifferencedFilesByLastModifyTime o IVssComponent::AddPartialFile invalida la información establecida anteriormente mediante la interfaz IVssCreateWriterMetadata en respuesta al evento Identify.

Las especificaciones generales de archivo pueden tener un valor de ubicación alternativa (establecido por el parámetro wszAlternateLocation de IVssCreateWriterMetadata::AddFilesToFileGroup) que indica una ubicación alternativa para obtener el archivo en el momento de la copia de seguridad. Si la especificación de archivo establecida a través de los mecanismos de archivo parcial o de archivo diferencial coincide con una especificación de archivo existente que tiene una ubicación alternativa, la aplicación de copia de seguridad obtendrá los datos de esta ubicación alternativa.

Si la especificación de archivo establecida en IVssComponent::AddDifferencedFilesByLastModifyTime o en IVssComponent::AddPartialFile no coincide y los archivos del componente del que se realiza una copia de seguridad, todos los archivos coincidentes ahora se agregan a la copia de seguridad. Se debe tener cuidado de que el escritor solo agrega archivos que existen en un volumen que ya se está sombreando mientras lo hace; de lo contrario, es posible que el solicitante no realice una copia de seguridad de estos archivos. Si se llama a estas funciones al procesar el evento PostSnapshot, esto se puede determinar mediante el método CVssWriter::IsPathAffected . Si se llama al control del evento PrepareForBackup, el escritor debe realizar esta determinación mediante otro método.

Copia de seguridad sin instantánea

Es posible que no sea necesario realizar una copia de seguridad de determinados tipos de archivos de un volumen de instantáneas. Por ejemplo, esto suele ser cierto en los archivos de registro de base de datos. Dado que los archivos de registro crecen de forma monotónica y un escritor puede especificar exactamente qué partes del archivo se van a realizar copias de seguridad mediante archivos parciales, a menudo será posible realizar una copia de seguridad del registro del volumen original. Como optimización, un escritor puede marcar qué archivos requieren instantáneas para diferentes tipos de copia de seguridad mediante las marcas establecidas en el parámetro dwBackupTypeMask de IVssCreateWriterMetadata::AddDatabaseFiles, IVssCreateWriterMetadata::AddDatabaseLogFiles o IVssCreateWriterMetadata::AddFilesToFileGroup. Entre las marcas admitidas se incluyen las siguientes:

VSS_FSBT_FULL_SNAPSHOT_REQUIRED

Instantánea necesaria para copias de seguridad completas.

VSS_FSBT_DIFFERENTIAL_SNAPSHOT_REQUIRED

Instantánea necesaria para copias de seguridad diferenciales.

VSS_FSBT_INCREMENTAL_SNAPSHOT_REQUIRED

Instantánea necesaria para las copias de seguridad incrementales.

VSS_FSBT_LOG_SNAPSHOT_REQUIRED

Instantánea necesaria para las copias de seguridad de registros.

VSS_FSBT_ALL_SNAPSHOT_REQUIRED

Instantánea necesaria para todos los tipos de copia de seguridad; este es el valor predeterminado.

Si un volumen específico contiene solo componentes que no requieren una instantánea para esta copia de seguridad, el solicitante puede omitir el paso de creación de una instantánea para este volumen. Todos los datos de este volumen se pueden copiar en los medios de copia de seguridad directamente desde el volumen original.

Limpieza de copia de seguridad

Si el escritor necesita realizar el truncamiento del registro u otra limpieza posterior a la copia de seguridad, el lugar adecuado para hacerlo es mientras se procesa el evento BackupComplete . El evento BackupShutdown se enviará algún tiempo después de BackupComplete, por lo que es posible que también se realice alguna limpieza en el controlador de eventos BackupShutdown.

El evento BackupShutdown siempre se envía después de la finalización de una copia de seguridad. Si el solicitante finaliza de forma anómala mientras se realiza una copia de seguridad, BackupShutdown se enviará inmediatamente, sin enviar primero BackupComplete. Si el escritor necesita limpiar cualquier estado, que se puede hacer aquí; sin embargo, el truncamiento del registro no debe producirse en este evento porque la copia de seguridad no se completó necesariamente.

Estrategias de restauración

Las tareas básicas de los escritores en la restauración son comprobar que la restauración puede producirse al controlar el evento PreRestore y que la restauración se ha producido al controlar el evento PostRestore. Los almacenes más complejos también realizarán un proceso de recuperación en el controlador PostRestore. Si la restauración forma parte de una restauración incremental o diferencial, el escritor normalmente querrá retrasar este proceso de recuperación hasta que se hayan completado todas las restauraciones incrementales o diferenciales. IVssComponent::GetAdditionalRestores indicará si se trata de la restauración final de este componente o si hay más restauraciones. Si IVssComponent::GetAdditionalRestores devuelve true, el escritor no debe realizar su procedimiento de recuperación en ese componente.

Nuevos destinos

Si es compatible con el escritor, el solicitante puede restaurar archivos de datos en una ubicación distinta de la ubicación en tiempo de copia de seguridad original. Un escritor indica la compatibilidad con este modo de restauración estableciendo el bit de VSS_BS_WRITER_SUPPORTS_NEW_TARGET en el parámetro dsSchemaMask al llamar a IVssCreateWriterMetadata::SetBackupSchema. Un escritor obtiene las nuevas ubicaciones de los archivos de componente en tiempo de restauración mediante una llamada a IVssComponent::GetNewTargetCount e IVssComponent::GetNewTarget.

Destinos dirigidos

En escenarios de restauración complicados, es posible que un escritor quiera asignar intervalos de un archivo de copia de seguridad a distintos intervalos del mismo archivo o diferente. Esto se puede hacer mediante el mecanismo de destino dirigido. Para ello, un escritor primero debe indicar que esto sucede mediante una llamada a IVssComponent::SetRestoreTarget, pasando VSS_RT_DIRECTED para el parámetro de destino . A continuación, para cada asignación, el escritor llama a IVssComponent::AddDirectedTarget. Este método toma una ruta de acceso completa a un archivo de origen en la copia de seguridad y una ruta de acceso completa a un archivo de destino al que se restaurará. También toma una lista de rangos para cada uno de estos archivos. El escritor llama a estas funciones mientras controla el evento PreRestore y, a continuación, el solicitante es responsable de restaurar los intervalos especificados en el archivo de origen a los intervalos asignados en el archivo de destino. El formato de la cadena de intervalos es el mismo que en IVssComponent::AddPartialFile.

Metadatos del escritor privado

A menudo resulta útil que un escritor mantenga los metadatos privados con una copia de seguridad para realizar correctamente una restauración incremental o diferencial. Un escritor puede llamar a IVssComponent::SetBackupMetadata mientras controla PrepareForBackup o PostSnapshot para almacenar metadatos. El escritor puede acceder a estos metadatos durante PreRestore o PostRestore llamando a IVssComponent::GetBackupMetadata. Los metadatos también se pueden almacenar con una especificación de archivo parcial mediante el parámetro wszMetadata de IVssComponent::AddPartialFile; Se obtiene acceso a estos metadatos a través del parámetro pbstrMetadatade IVssComponent::GetPartialFile. El escritor también puede pasar metadatos a sí mismo entre CVssWriter::OnPreRestore y CVssWriter::OnPostRestore. En CVssWriter::OnPreRestore, los metadatos se establecen mediante una llamada a IVssComponent::SetRestoreMetadata. En CVssWriter::OnPostRestore, los metadatos se recuperan mediante una llamada a IVssComponent::GetRestoreMetadata.