Solucionar problemas Always On bancos de dados de disponibilidade no estado de recuperação pendente ou suspeito no SQL Server
Este artigo descreve os erros e limitações de um banco de dados de disponibilidade no Microsoft SQL Server que está em um Recovery Pending
estado ou Suspect
e como restaurar o banco de dados para a funcionalidade completa em um grupo de disponibilidade.
Versão original do produto: SQL Server 2012
Número de KB original: 2857849
Resumo
Suponha que um banco de dados de disponibilidade definido em um grupo de disponibilidade Always On faça a transição para um Recovery Pending
estado ou Suspect
em SQL Server. Se isso ocorrer no réplica primário do grupo de disponibilidade, a disponibilidade do banco de dados será afetada. Nessa situação, você não pode acessar o banco de dados por meio dos aplicativos cliente. Além disso, você não pode remover ou remover o banco de dados do grupo de disponibilidade.
Por exemplo, suponha que SQL Server esteja em execução e um banco de dados de disponibilidade seja definido como ou Recovery Pending
Suspect
estado. Ao consultar as DMVs (exibições de gerenciamento dinâmico) no réplica primário usando o seguinte script SQL, o banco de dados poderá ser relatado em um NOT_HEALTHY
estado e RECOVERY_PENDING
ou em um SUSPECT
estado da seguinte maneira:
SELECT
dc.database_name,
d.synchronization_health_desc,
d.synchronization_state_desc,
d.database_state_desc
FROM
sys.dm_hadr_database_replica_states d
JOIN sys.availability_databases_cluster dc ON d.group_database_id = dc.group_database_id
AND d.is_local = 1
database_name synchronization_health_desc synchronization_state_desc database_state_desc
-------------------- ------------------------------ ------------------------------ ---------------------
<DatabaseName> NOT_HEALTHY NOT SYNCHRONIZING RECOVERY_PENDING
(1 row(s) affected)
Além disso, esse banco de dados pode ser relatado como sendo no estado Não Sincronização/Recuperação Pendente ou Suspeito em SQL Server Management Studio.
Quando o banco de dados é definido em um grupo de disponibilidade, o banco de dados não pode ser removido ou restaurado. Portanto, você precisa tomar medidas específicas para recuperar o banco de dados e devolvê-lo ao uso de produção.
Mais informações
O conteúdo a seguir discute os erros e limitações de um banco de dados de disponibilidade que está em um estado de recuperação pendente em várias situações.
Status de banco de dados impede a restauração do banco de dados
Você tenta executar o seguinte script SQL para restaurar o banco de dados que tem o
RECOVERY
parâmetro:RESTORE DATABASE <DatabaseName> WITH RECOVERY
Ao executar esse script, você recebe a seguinte mensagem de erro porque o banco de dados é definido em um grupo de disponibilidade:
Msg 3104, Nível 16, Estado 1, Linha 1
O RESTORE não pode operar no <database DatabaseName> porque ele está configurado para espelhamento de banco de dados ou ingressou em um grupo de disponibilidade. Se você pretende restaurar o banco de dados, use ALTER DATABASE para remover o espelhamento ou remover o banco de dados do grupo de disponibilidade.Msg 3013, Nível 16, Estado 1, Linha 1
RESTORE DATABASE está terminando de forma anormal.O banco de dados status impede a remoção do banco de dados
Você tenta executar o seguinte script SQL para soltar o banco de dados:
DROP DATABASE <DatabaseName>
Ao executar esse script, você recebe a seguinte mensagem de erro porque o banco de dados é definido em um grupo de disponibilidade:
Msg 3752, Nível 16, Estado 1, Linha 1
No momento, o DatabaseName> do banco de dados <está ingressado em um grupo de disponibilidade. Antes de remover o banco de dados, você precisa removê-lo do grupo de disponibilidade.Status de banco de dados impede a remoção do banco de dados do grupo de disponibilidade
Você tenta executar o seguinte script SQL para remover o banco de dados do grupo de disponibilidade:
ALTER DATABASE <DatabaseName> SET hadr OFF
Ao tentar executar esse script, você recebe a seguinte mensagem de erro porque o banco de dados de disponibilidade pertence ao réplica primário:
Msg 35240, Nível 16, Estado 14, Linha 1
DatabaseName <> não pode ser ingressado ou desarticulado do grupo <de disponibilidade AvailabilityGroupName>. Essa operação não tem suporte no réplica primário do grupo de disponibilidade.Por causa dessa mensagem de erro, você pode ser obrigado a fazer failover do banco de dados. Depois que o banco de dados é reprovado, o réplica que possui o banco de dados pendente de recuperação está na função secundária. Nesta situação, você tenta executar o seguinte script SQL novamente para remover o banco de dados do grupo de disponibilidade no réplica secundário:
ALTER DATABASE <DatabaseName> SET hadr OFF
No entanto, você ainda não pode remover o banco de dados do grupo de disponibilidade e recebe a seguinte mensagem de erro porque o banco de dados ainda está no estado Pendente de Recuperação:
Msg 921, Nível 16, Estado 112, Linha 1
DatabaseName <> ainda não foi recuperado. Aguarde e tente novamente.
Resolução quando o banco de dados está na função secundária
Para resolve esse problema, execute as seguintes ações gerais:
- Remova do grupo de disponibilidade o réplica que está hospedando o banco de dados danificado quando o banco de dados estiver na função secundária.
- Resolva quaisquer problemas que estejam afetando o sistema e que possam ter contribuído para a falha do banco de dados.
- Restaure o réplica para o grupo de disponibilidade.
Para executar essas ações, conecte-se ao novo réplica primário e execute o ALTER AVAILABILITY GROUP
script SQL para remover o réplica que está hospedando o banco de dados de disponibilidade com falha. Para fazer isso, execute as etapas a seguir.
Essas etapas pressupõem que o réplica primário primeiro hospeda o banco de dados danificado. Portanto, primeiro deve ocorrer um failover para fazer a transição do réplica que está hospedando o banco de dados danificado em uma função secundária.
Conecte-se ao servidor que está executando SQL Server e que está hospedando o réplica secundário.
Execute o seguinte script SQL:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
Execute o seguinte script SQL para remover o réplica que está hospedando o banco de dados danificado do grupo de disponibilidade:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
Resolva quaisquer problemas no servidor que está executando SQL Server e que possam contribuir para a falha do banco de dados.
Adicione o réplica de volta ao grupo de disponibilidade.
Resolução quando o réplica primário é o único réplica no grupo de disponibilidade
Se o réplica primário hospedar o banco de dados danificado e for o único réplica de trabalho no grupo de disponibilidade, o grupo de disponibilidade deverá ser descartado. Depois que o grupo de disponibilidade for removido, seu banco de dados poderá ser recuperado de um backup ou outros esforços de recuperação de emergência podem ser aplicados para restaurar os bancos de dados e retomar a produção.
Para soltar o grupo de disponibilidade, use o seguinte script SQL:
DROP AVAILABILITY GROUP <AvailabilityGroupName>
Neste ponto, você pode tentar recuperar o banco de dados problemático. Ou você pode restaurar o banco de dados da última cópia de backup boa conhecida.
Resolução ao soltar o grupo de disponibilidade
Quando você solta um grupo de disponibilidade, o recurso do ouvinte também é descartado e interrompe a conectividade do aplicativo com os bancos de dados de disponibilidade.
Para minimizar o tempo de inatividade do aplicativo, use um dos seguintes métodos para sustentar a conectividade do aplicativo por meio do ouvinte e soltar o grupo de disponibilidade:
Método 1: associar o ouvinte a um novo grupo de disponibilidade (função) no Gerenciador de Cluster de Failover
Esse método permite manter o ouvinte durante a remoção e recriação do grupo de disponibilidade.
Na instância de SQL Server à qual o ouvinte do grupo de disponibilidade existente está direcionando conexões, crie um novo grupo de disponibilidade vazio. Para simplificar esse processo, use o comando Transact-SQL para criar um grupo de disponibilidade que não tenha réplica ou banco de dados secundários:
USE master GO CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH ( ENDPOINT_URL = 'tcp://sqlnode1:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL )
Inicie o Gerenciador de Cluster de Failover e selecione Funções no painel esquerdo. No painel que lista as funções, selecione o grupo de disponibilidade original.
No painel do meio inferior, na guia Recursos , clique com o botão direito do mouse no recurso do grupo de disponibilidade e selecione Propriedades. Selecione a guia Dependências , exclua a dependência do ouvinte e selecione OK.
Nos recursos, clique com o botão direito do mouse no ouvinte, selecione Mais Ações e selecione Atribuir a Outra Função.
Na caixa de diálogo Atribuir Fonte à Função , selecione o novo grupo de disponibilidade e selecione OK.
No painel Funções , selecione o novo grupo de disponibilidade. No painel do meio inferior, na guia Recursos , agora você deve ver o novo grupo de disponibilidade e o recurso do ouvinte. Clique com o botão direito do mouse no novo recurso do grupo de disponibilidade e selecione Propriedades.
Clique na guia Dependências , selecione o recurso do ouvinte na caixa suspensa e selecione OK.
Em SQL Server Management Studio, use Pesquisador de Objetos para se conectar à instância de SQL Server que hospeda o réplica primário do novo grupo de disponibilidade. Selecione Always On Alta Disponibilidade, clique no novo grupo de disponibilidade e selecione Ouvintes do Grupo de Disponibilidade. Você deve encontrar o ouvinte.
Clique com o botão direito do mouse no ouvinte, selecione Propriedades, digite o número de porta apropriado para o ouvinte e selecione OK.
Isso garante que os aplicativos que usam o ouvinte ainda possam usá-lo para se conectar à instância de SQL Server que está hospedando os bancos de dados de produção sem interrupção. O grupo de disponibilidade original agora pode ser completamente removido e recriado. Ou os bancos de dados e réplicas podem ser adicionados ao novo grupo de disponibilidade.
Se você recriar o grupo de disponibilidade original, reatribua o ouvinte de volta à função de grupo de disponibilidade, configure a dependência entre o novo recurso de grupo de disponibilidade e o ouvinte e reatribua a porta para o ouvinte. Para fazer isso, siga estas etapas:
- Inicie o Gerenciador de Cluster de Failover e selecione Funções no painel esquerdo. No painel que lista as funções, clique no novo grupo de disponibilidade que hospeda o ouvinte.
- No painel médio inferior, na guia Recursos , clique com o botão direito do mouse no ouvinte, selecione Mais Ações e selecione Atribuir a Outra Função. Na caixa de diálogo, escolha o grupo de disponibilidade recriado e selecione OK.
- No painel Funções , clique no grupo de disponibilidade recriado. No painel médio inferior, na guia Recursos , agora você deve ver o grupo de disponibilidade recriado e o recurso do ouvinte. Clique com o botão direito do mouse no recurso do grupo de disponibilidade recriado e selecione Propriedades.
- Selecione a guia Dependências , selecione o recurso do ouvinte na caixa suspensa e selecione OK.
- Em SQL Server Management Studio, use Pesquisador de Objetos para se conectar à instância de SQL Server que hospeda o réplica primário do grupo de disponibilidade recriado. Selecione Always On Alta Disponibilidade, clique no novo grupo de disponibilidade e selecione Ouvintes do Grupo de Disponibilidade. Você deve encontrar o ouvinte.
- Clique com o botão direito do mouse no ouvinte, selecione Propriedades, digite o número de porta apropriado para o ouvinte e selecione OK.
Método 2: associar o ouvinte a um SQLFCI (Instância Clusterada de Failover) existente SQL Server
Se você estiver hospedando seu grupo de disponibilidade em um SQLFCI (Instância Clusterada de Failover) SQL Server, poderá associar o recurso clusterizado do ouvinte ao grupo de recursos clusterizado SQLFCI enquanto você solta e recria o grupo de disponibilidade.
Inicie o Gerenciador de Cluster de Failover e selecione Funções no painel esquerdo.
No painel que lista as funções, selecione o grupo de disponibilidade original.
No painel médio inferior, na guia Recursos , clique com o botão direito do mouse no recurso do grupo de disponibilidade e selecione Propriedades.
Selecione a guia Dependências , exclua a dependência do ouvinte e selecione OK.
No painel médio inferior, na guia Recursos , clique com o botão direito do mouse no ouvinte, selecione Mais Ações e selecione Atribuir a Outra Função.
Na caixa de diálogo Atribuir Recurso à Função, clique na instância SQL Server FCI e selecione OK.
No painel Funções , selecione o grupo SQLFCI. No painel médio inferior, na guia Recursos , agora você deverá ver o novo recurso do ouvinte.
Isso garante que os aplicativos que usam o ouvinte ainda possam usá-lo para se conectar à instância de SQL Server que hospeda os bancos de dados de produção sem interrupção. O grupo de disponibilidade original agora pode ser removido e recriado. Ou os bancos de dados e réplicas podem ser adicionados ao novo grupo de disponibilidade.
Depois que o grupo de disponibilidade for recriado, reatribua o ouvinte de volta à função de grupo de disponibilidade. Em seguida, configure a dependência entre o novo recurso do grupo de disponibilidade e o ouvinte e reatribua a porta para o ouvinte:
- Inicie o Gerenciador de Cluster de Failover e selecione Funções no painel esquerdo.
- No painel que lista as funções, clique na função SQLFCI original.
- No painel médio inferior, na guia Recursos , clique com o botão direito do mouse no ouvinte, selecione Mais Ações e selecione Atribuir a Outra Função.
- Na caixa de diálogo, clique no grupo de disponibilidade recriado e selecione OK.
- No painel Funções , selecione o novo grupo de disponibilidade.
- Na guia Recursos , você deve ver o novo grupo de disponibilidade e o recurso do ouvinte. Clique com o botão direito do mouse no novo recurso do grupo de disponibilidade e selecione Propriedades.
- Selecione a guia Dependências , selecione o recurso do ouvinte na caixa suspensa e selecione OK.
- Em SQL Server Management Studio, use Pesquisador de Objetos para se conectar à instância de SQL Server que hospeda o réplica primário do novo grupo de disponibilidade.
- Selecione Always On Alta Disponibilidade, clique no novo grupo de disponibilidade e selecione Ouvintes do Grupo de Disponibilidade. Você deve encontrar o ouvinte.
- Clique com o botão direito do mouse no ouvinte, selecione Propriedades, digite o número de porta apropriado para o ouvinte e selecione OK.
Método 3: solte o grupo de disponibilidade e crie novamente o grupo de disponibilidade e o ouvinte com o mesmo nome do ouvinte
Esse método resultará em uma pequena interrupção para aplicativos que estão atualmente conectados porque o grupo de disponibilidade e o ouvinte são descartados e recriados:
Solte o grupo de disponibilidade.
Observação
Isso também soltará o ouvinte.
Crie imediatamente um novo grupo de disponibilidade vazio que inclua a definição do ouvinte no mesmo servidor que hospeda os bancos de dados de produção.
Por exemplo, suponha que o ouvinte do grupo de disponibilidade esteja aglisten. A instrução Transact-SQL a seguir cria um grupo de disponibilidade sem banco de dados primário ou secundário, mas também cria um ouvinte chamado aglisten. Os aplicativos podem usar esse ouvinte para se conectar.
USE master GO CREATE AVAILABILITY GROUP ag FOR REPLICA ON 'sqlnode1' WITH ( ENDPOINT_URL = 'tcp://sqlnode1:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL ) LISTENER 'aglisten' ( WITH IP ((N'11.0.0.25', N'255.0.0.0')), PORT = 1433 ) GO
Recupere o banco de dados danificado. Em seguida, adicione-o e o réplica secundário de volta ao grupo de disponibilidade.