Solucionar problemas de bancos de dados de disponibilidade Always On no estado de Recuperação Pendente ou Suspeito no SQL Server
Este artigo descreve os erros e as 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 original do KB: 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
no SQL Server. Se isso ocorrer na réplica primária 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 descartar ou remover o banco de dados do grupo de disponibilidade.
Por exemplo, suponha que o SQL Server esteja em execução e um banco de dados de disponibilidade esteja definido como o Recovery Pending
estado ou Suspect
. Quando você consulta as DMVs (exibições de gerenciamento dinâmico) na réplica primária usando o script SQL a seguir, o banco de dados pode 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 estando no estado Não Sincronizando/Recuperação Pendente ou Suspeito no SQL Server Management Studio.
Quando o banco de dados é definido em um grupo de disponibilidade, o banco de dados não pode ser descartado ou restaurado. Portanto, você precisa executar etapas específicas para recuperar o banco de dados e retorná-lo ao uso em produção.
Mais informações
O conteúdo a seguir discute os erros e as limitações de um banco de dados de disponibilidade que está em um estado de Recuperação Pendente em várias situações.
O status do 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 está definido em um grupo de disponibilidade:
Msg 3104, Nível 16, Estado 1, Linha 1
RESTORE não pode operar no banco de dados <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 de seu grupo de disponibilidade.Mensagem 3013, Nível 16, Estado 1, Linha 1
RESTORE DATABASE está terminando de forma anormal.O status do banco de dados evita o descarte do banco de dados
Você tenta executar o seguinte script SQL para descartar o banco de dados:
DROP DATABASE <DatabaseName>
Ao executar esse script, você recebe a seguinte mensagem de erro porque o banco de dados está definido em um grupo de disponibilidade:
Msg 3752, Nível 16, Estado 1, Linha 1
O banco de dados <DatabaseName> está ingressado em um grupo de disponibilidade. Antes de descartar o banco de dados, você precisa removê-lo do grupo de disponibilidade.O status do 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 à réplica primária:
Msg 35240, Nível 16, Estado 14, Linha 1
O banco de dados <DatabaseName> não pode ser ingressado ou desassociado do grupo <de disponibilidade AvailabilityGroupName>. Não há suporte para essa operação na réplica primária do grupo de disponibilidade.Devido a essa mensagem de erro, você pode ser obrigado a fazer failover do banco de dados. Após o failover do banco de dados, a réplica que possui o banco de dados de recuperação pendente está na função secundária. Nessa situação, você tenta executar o seguinte script SQL novamente para remover o banco de dados do grupo de disponibilidade na réplica secundária:
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 Recuperação Pendente:
Msg 921, Nível 16, Estado 112, Linha 1
Database <DatabaseName> ainda não foi recuperado. Aguarde e tente novamente.
Resolução quando o banco de dados está na função secundária
Para resolver esse problema, execute as seguintes ações gerais:
- Remova do grupo de disponibilidade a 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 a réplica para o grupo de disponibilidade.
Para executar essas ações, conecte-se à nova réplica primária e execute o ALTER AVAILABILITY GROUP
script SQL para remover a réplica que está hospedando o banco de dados de disponibilidade com falha. Para fazer isso, siga estas etapas:
Essas etapas pressupõem que a réplica primária hospede primeiro o banco de dados danificado. Portanto, um failover deve ocorrer primeiro para fazer a transição da réplica que está hospedando o banco de dados danificado para uma função secundária.
Conecte-se ao servidor que está executando o SQL Server e que está hospedando a réplica secundária.
Execute o seguinte script SQL:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> FAILOVER
Execute o seguinte script SQL para remover a réplica que está hospedando o banco de dados danificado do grupo de disponibilidade:
ALTER AVAILABILITY GROUP <AvailabilityGroupName> REMOVE REPLICA ON '<SQLServerNodeName>'
Resolva todos os problemas no servidor que está executando o SQL Server e que podem contribuir para a falha do banco de dados.
Adicione a réplica de volta ao grupo de disponibilidade.
Resolução quando a réplica primária é a única réplica no grupo de disponibilidade
Se a réplica primária hospedar o banco de dados danificado e for a única réplica de trabalho no grupo de disponibilidade, o grupo de disponibilidade deverá ser descartado. Depois que o grupo de disponibilidade for descartado, seu banco de dados poderá ser recuperado de um backup ou outros esforços de recuperação de emergência poderão ser aplicados para restaurar os bancos de dados e retomar a produção.
Para descartar 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 a partir da última cópia de backup válida conhecida.
Resolução quando você descarta o grupo de disponibilidade
Quando você descarta um grupo de disponibilidade, o recurso de 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 descartar 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 que você mantenha o ouvinte enquanto descarta e recria o grupo de disponibilidade.
Na instância do SQL Server para a 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 secundária ou banco de dados:
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 central 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, em seguida, selecione Atribuir a outra função.
Na caixa de diálogo Atribuir Origem à Função, selecione o novo grupo de disponibilidade e, em seguida, selecione OK.
No painel Funções, selecione o novo grupo de disponibilidade. No painel central inferior, na guia Recursos , agora você deve ver o novo grupo de disponibilidade e o recurso de 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 de ouvinte na caixa suspensa e selecione OK.
No SQL Server Management Studio, use o Pesquisador de Objetos para se conectar à instância do SQL Server que hospeda a réplica primária do novo grupo de disponibilidade. Selecione Alta Disponibilidade Always On, 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 do 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, deverá reatribuir o ouvinte de volta à função do grupo de disponibilidade, configurar a dependência entre o novo recurso do grupo de disponibilidade e o ouvinte e, em seguida, reatribuir a porta ao 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 central inferior, na guia Recursos , clique com o botão direito do mouse no ouvinte, selecione Mais Ações e, em seguida, 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 central inferior, na guia Recursos , agora você deve ver o grupo de disponibilidade recriado e o recurso de 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 de ouvinte na caixa suspensa e selecione OK.
- No SQL Server Management Studio, use o Pesquisador de Objetos para se conectar à instância do SQL Server que hospeda a réplica primária do grupo de disponibilidade recriado. Selecione Alta Disponibilidade Always On, 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 uma SQLFCI (Instância Clusterizada de Failover do SQL Server) existente
Se você estiver hospedando seu grupo de disponibilidade em uma SQLFCI (Instância Clusterizada de Failover do SQL Server), poderá associar o recurso clusterizado do ouvinte ao grupo de recursos clusterizado SQLFCI enquanto descarta 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 central 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 central inferior, na guia Recursos , clique com o botão direito do mouse no ouvinte, selecione Mais Ações e, em seguida, selecione Atribuir a Outra Função.
Na caixa de diálogo Atribuir Recurso à Função, clique na instância da FCI do SQL Server e selecione OK.
No painel Funções, selecione o grupo SQLFCI. No painel central inferior, na guia Recursos , agora você deve ver o novo recurso de ouvinte.
Isso garante que os aplicativos que usam o ouvinte ainda possam usá-lo para se conectar à instância do 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 do grupo de disponibilidade. Em seguida, configure a dependência entre o novo recurso do grupo de disponibilidade e o ouvinte e reatribua a porta ao 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 central inferior, na guia Recursos , clique com o botão direito do mouse no ouvinte, selecione Mais Ações e, em seguida, 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 de 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 de ouvinte na caixa suspensa e selecione OK.
- No SQL Server Management Studio, use o Pesquisador de Objetos para se conectar à instância do SQL Server que hospeda a réplica primária do novo grupo de disponibilidade.
- Selecione Alta Disponibilidade Always On, 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: descartar o grupo de disponibilidade e recriar o grupo de disponibilidade e o ouvinte com o mesmo nome de ouvinte
Esse método resultará em uma pequena interrupção para aplicativos que estão conectados no momento porque o grupo de disponibilidade e o ouvinte são descartados e recriados:
Descarte o grupo de disponibilidade.
Observação
Isso também derrubará o ouvinte.
Crie imediatamente um novo grupo de disponibilidade vazio que inclua a definição de ouvinte, no mesmo servidor que hospeda os bancos de dados de produção.
Por exemplo, suponha que o ouvinte do grupo de disponibilidade esteja intermitente. 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 a réplica secundária de volta ao grupo de disponibilidade.