Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Há situações em que os dados de um gravador dependem de dados gerenciados por outro gravador. Nesses casos, você deve fazer backup ou restaurar dados de ambos os gravadores.
O VSS lida com esse problema por meio da noção de uma dependência explícita de componente de gravador e da interface deIVssWMDependency.
Um gravador adiciona uma ou mais dependências ao criar o Documento de Metadados do Gravador usando o métodoIVssCreateWriterMetadata::AddComponentDependency. O gravador passa ao método o nome e o caminho lógico do componente dependente (que ele gerencia), bem como o nome e o caminho lógico e a ID da classe de gravador (o GUID que identifica a classe) do componente do qual ele depende.
Uma vez estabelecida, essa dependência informa ao solicitante que, durante qualquer operação de backup ou restauração, o componente dependente e os destinos de suas dependências devem participar.
Um determinado componente pode ter várias dependências, o que exige que ele e todos os seus destinos dependentes participem do backup e da restauração juntos.
O componente dependente e/ou os destinos de suas dependências podem ser incluídos explicitamente ou implicitamente em operações de backup ou restauração.
O mecanismo de dependência de componente de gravador explícito não deve ser usado para criar uma dependência entre dois componentes no mesmo gravador. As regras de seleção podem fornecer a mesma funcionalidade com mais eficiência sem risco de dependências circulares.
Como exemplo, IVssCreateWriterMetadata::AddComponentDependency poderia ser usado para definir a dependência do gravador de componenteData (com o caminho lógico "") do gravador MyWriter no internetData do componente (com um caminho lógico de "Conexões") de um gravador chamado InternetConnector com uma ID X de classe de gravador. (Embora seja possível para vários gravadores com a mesma ID de classe estar no sistema simultaneamente, a confusão será evitada porque a combinação de caminho lógico e nome do componente é exclusiva no sistema em VSS.)
Um gravador adiciona várias dependências a um determinado componente simplesmente chamando IVssCreateWriterMetadata::AddComponentDependency repetidas com componentes diferentes de diferentes gravadores. O número de outros componentes dos quais um determinado componente depende pode ser encontrado examinando o cDependencies membro da estrutura VSS_COMPONENTINFO.
Um gravador ou solicitante recupera instâncias da interfaceIVssWMDependency com IVssWMComponent::GetDependency. O IVssWMDependency retorna o nome do componente, o caminho lógico e a ID de classe do gravador que gerencia o componente que é o destino da dependência.
O mecanismo de dependência não prescreve nenhuma ordem de preferência específica entre o componente dependente e os destinos de suas dependências. Conforme observado acima, tudo o que uma dependência indica é que sempre que um determinado componente é feito backup ou restaurado, o componente ou os componentes dos quais ele depende também devem ser copiados ou restaurados. A implementação exata da dependência fica a critério do aplicativo de backup.
Por exemplo, no caso acima, o componente writerData (caminho lógico "") depende do componente InternetConnector (caminho lógico "Conexões"). Um solicitante é livre para interpretá-lo de qualquer uma das seguintes maneiras:
- Se o componente dependente, writerData, estiver selecionado (implicitamente ou explicitamente) para backup ou restauração, o solicitante deverá selecionar (implicitamente ou explicitamente) o destino de sua dependência, internetData
- Se o destino de sua dependência, internetData, não estiver selecionado para backup, o componente dependente, writerData, não deverá ser selecionado.
No entanto, ao desenvolver suporte para dependências, os desenvolvedores solicitantes devem estar cientes de que não há nenhuma maneira de um gravador determinar se um de seus componentes é um destino de uma dependência.
Declarando dependências remotas
Um aplicativo distribuído é um aplicativo que pode ser configurado para usar um ou mais computadores de cada vez. Normalmente, o aplicativo é executado em um ou mais computadores do servidor de aplicativos e se comunica com (mas pode ou não ser executado) com um ou mais computadores de servidor de banco de dados. Às vezes, essa configuração é conhecida como uma implantação de vários sistemas. Geralmente, o mesmo aplicativo também pode ser configurado para ser executado em um único computador que executa um servidor de aplicativos e um servidor de banco de dados. Essa configuração é chamada de implantação de sistema único. Em ambas as configurações, o servidor de aplicativos e o servidor de banco de dados têm seus próprios gravadores VSS independentes.
Em uma implantação de vários sistemas, se um componente gerenciado pelo gravador do aplicativo depender de um componente remoto gerenciado pelo gravador do servidor de banco de dados, isso será chamado de dependência remota. (Uma implantação de sistema único, por outro lado, tem apenas dependências locais.)
Como exemplo de uma implantação de vários sistemas, considere um servidor de aplicativos que usa um servidor de banco de dados do SQL Server como um armazenamento de dados. Os dados específicos do aplicativo, que incluem as Web Parts, os arquivos de conteúdo da Web e a metabase do IIS, residem em um ou mais computadores, chamados de servidores Web front-end. O repositório de dados SQL real, que inclui o banco de dados Config e vários bancos de dados de conteúdo, reside em um ou mais computadores, chamados de servidores de banco de dados de back-end. Cada um dos servidores Web front-end contém o mesmo conteúdo e configuração específicos do aplicativo. Cada um dos servidores de banco de dados de back-end pode hospedar qualquer um dos bancos de dados de conteúdo ou o banco de dados de configuração. O software de aplicativo é executado somente nos servidores Web front-end, não nos servidores de banco de dados. Nessa configuração, o gravador VSS do aplicativo tem dependências remotas nos componentes gerenciados pelo gravador do SQL.
Um gravador pode declarar uma dependência remota chamando o métodoAddComponentDependency, acrescentando "\\RemoteComputerName\", em que RemoteComputerName é o nome do computador onde reside o componente remoto, para o caminho lógico no parâmetro wszOnLogicalPath. O valor de RemoteComputerName pode ser um endereço IP ou um nome de computador retornado pela função GetComputerNameEx.
Windows Server 2003: Um gravador não pode declarar dependências remotas até o Windows Server 2003 com o Service Pack 1 (SP1).
Para identificar uma dependência, um solicitante chama os métodos GetWriterId, GetLogicalPathe métodos getComponentName da interface IVssWMDependency. O solicitante deve examinar o nome do componente que GetComponentName retorna no parâmetro pbstrComponentName. Se o nome do componente começar com "\\", o solicitante deverá assumir que ele especifica uma dependência remota e que o primeiro componente a seguir "\\" é o RemoteComputerName que foi especificado quando o gravador chamado AddComponentDependency. Se o nome do componente não começar com "\\", o solicitante deverá assumir que ele especifica uma dependência local.
Se houver uma dependência remota, o solicitante deverá fazer backup do componente remoto quando fizer backup do componente local. Para fazer backup do componente remoto, o solicitante deve ter um agente no computador remoto e deve iniciar o backup no computador remoto.
Estruturando dependências remotas
É importante entender que uma dependência não é um componente em si mesma. Um componente é necessário para manter a dependência.
Os exemplos a seguir mostram duas maneiras de estruturar um conjunto de dependências.
Example 1:
Writer 1
Component A
File A
File B
Dependency (SQL/MSDE Writer, Component X, "\")
Dependency (SQL/MSDE Writer, Component Y, "\")
Example 2:
Writer 2
Component A
File A
File B
Component B
Dependency (SQL/MSDE Writer, Component X, "\")
Dependency (SQL/MSDE Writer, Component Y, "\")
No exemplo 1, as dependências são mantidas pelo componente A. Como somente os componentes podem ser selecionados, não arquivos individuais, estruturar as dependências do Componente A dessa maneira exigiria que todo o componente, os arquivos e as dependências, sempre precisassem ser backupados e restaurados juntos. Eles não podem ser apoiados ou restaurados individualmente.
No exemplo 2, componentes separados (componentes A e B) contêm cada uma das dependências. Nesse caso, os dois componentes podem ser selecionados de forma independente e, portanto, fazer backup e restauração independentemente. Estruturar as dependências dessa forma proporciona a um aplicativo distribuído muito mais flexibilidade no gerenciamento de suas dependências remotas.
Suporte a dependências remotas
Um solicitante pode fornecer suporte total ou parcial para dependências remotas.
Para fornecer suporte completo, o solicitante deve fazer o seguinte no tempo de backup e restauração.
No momento do backup, o solicitante deve iniciar o backup no computador front-end (local), determinar as dependências existentes e fazer spool de trabalhos de backup adicionais para capturar os bancos de dados de back-end. O solicitante deve aguardar até que os trabalhos de backup de back-end no computador remoto tenham sido concluídos antes de chamar os métodos IVssBackupComponents::SetBackupSucceededed e IVssBackupComponents::BackupComplete. Se o solicitante aguardar até que o backup de componentes de back-end seja concluído antes de chamar BackupComplete, isso produzirá um backup recuperável mais facilmente para um gravador que implementa aprimoramentos adicionais, como bloqueio de topologia, por exemplo, durante o backup. O procedimento a seguir descreve o que o solicitante deve fazer:
- No computador local, o solicitante chama o IVssBackupComponents::InitializeForBackup, IVssBackupComponents::GatherWriterMetadata, métodos IVssBackupComponents::P repareForBackupe IVssBackupComponents::D oSnapshotSet.
- Depois que a cópia de sombra local for concluída, mas antes que o backup seja concluído, o solicitante enviará trabalhos de backup adicionais enviando uma solicitação ao agente no computador remoto.
- No computador remoto, o agente do solicitante executa a sequência de backup em spool chamando InitializeForBackup, GatherWriterMetadata, PrepareForBackup, DoSnapshotSet, SetBackupSucceededede BackupComplete.
- Quando o agente do solicitante concluir os trabalhos em spool no computador remoto, o solicitante concluirá a sequência de backup chamando SetBackupSucceeded e BackupComplete.
No momento da restauração, o solicitante deve iniciar a restauração envolvendo o computador front-end (local), selecionar os componentes e suas dependências a serem restaurados e, em seguida, enviar o evento PreRestore chamando o método IVssBackupComponents::P reRestore. Em seguida, o solicitante deve fazer spool dos trabalhos de restauração de back-end no computador remoto e chamar o método IVssBackupComponents::P ostRestore quando as restaurações de back-end forem concluídas. Esse requisito fornece ao gravador de front-end mais controle sobre a experiência de restauração e uma melhor experiência de usuário administrador em geral. Como os backups em cada um dos sistemas não ocorrem no mesmo ponto no tempo, o gravador de front-end precisará executar alguma limpeza dos dados de back-end. No aplicativo de exemplo discutido no anterior "Declarando dependências remotas", o gravador deve iniciar um site remapeando ou reexescrevendo após a conclusão de uma restauração de um dos bancos de dados de back-end. Para fazer isso, o gravador deve receber eventos no servidor front-end. O procedimento a seguir descreve o que o solicitante deve fazer:
- No computador local, o solicitante chama IVssBackupComponents::InitializeForRestore, GatherWriterMetadata, IVssBackupComponents:::SetSelectedForRestore (ou IVssBackupComponentsEx::SetSelectedForRestoreEx) e PreRestore.
- Depois que a fasedo PreRestorefor concluída, mas antes que a fasePostRestore comece, o solicitante enviará trabalhos de restauração adicionais enviando uma solicitação ao agente no computador remoto.
- No computador remoto, O agente do solicitante executa os trabalhos de restauração em spool chamando InitializeForRestore, GatherWriterMetadata, SetSelectedForRestore, PreRestore, SetFileRestoreStatus (ou SetSelectedForRestoreEx) e PostRestore.
- Quando o agente do solicitante concluir os trabalhos em spool no computador remoto, o solicitante concluirá a sequência de restauração chamando IVssBackupComponents::SetFileRestoreStatus e PostRestore.
Para fornecer suporte parcial para dependências remotas, o solicitante deve seguir dependências remotas e incluí-las como parte do backup, mas a ordenação de eventos em sistemas front-end e back-end, conforme detalhado nos dois procedimentos anteriores, não seria necessária. Para um solicitante que implementa apenas o suporte parcial, o solicitante deve se referir à documentação de backup/restauração do aplicativo gravador para entender quais cenários podem ser suportados.