Bom dia Pessoal,

Esta semana começou já bem agitada, logo nas primeiras horas de trabalho encontramos um problema ao tentar adicionar um nó (Add Node) em uma Instância SQL Server em Cluster, vejam abaixo detalhes do cenário e a descrição detalhada do problema:

Cenário:

Nosso ambiente atualmente consistia em um Cluster de 2 Nós (Ativo/Ativo) rodando SQL Server 2008 SP3 suportados por Windows Server 2008 SP2, neste cenário em questão estavamos tentando adicionar uma nova máquina ao Cluster visando aumentar a disponibilidade de hardware de nosso Cluster.

Problema:

Ao tentar executar o commando de Add Node pelo instalador do SQL Server, a instalação procede normalmente até o ponto da validação dos usuários e senhas dos serviços, neste ponto o instalador nos apresenta um erro que não poderia prosseguir, pois o usuário do SQL Server Agent é inválido, e para nossa surpresa ao checar a nome do usuário na caixa de texto, verificamos que ela está vazia, conforme exibido no detalhe abaixo:

 

O maior problema desta situação é que não temos como modificar o usuário durante um procedimento de Add Node, o que fazer então para continuar com a instalação deste novo nó ?

Troubleshooting:

Primeiramente vamos tentar entender o que está acontecendo em nosso ambiente durante a validação do usuário, para isto vamos checar o log da instalação do SQL Server que fica em :

C:\%ProgramFiles%\Microsoft SQL Server\100\Setup Bootstrap\Log\<<Data e Hora da Instalação>>

Olhamos o arquivo Detail.txt, e no horário exato do erro localizamos a entrada abaixo:

2013-06-22 11:52:27 Slp: Sco: Attempting to create base registry key HKEY_LOCAL_MACHINE, machine SQLCLUSTERSAMPLE
2013-06-22 11:52:27 Slp: Sco: Attempting to open registry subkey System\CurrentControlSet\Services\MSSQL$INSTANCE
2013-06-22 11:52:27 Slp: Sco: Attempting to get registry value ObjectName
2013-06-22 11:52:27 Slp: Exception type: Microsoft.SqlServer.Configuration.Sco.ScoException
2013-06-22 11:52:27 Slp:     Message:
2013-06-22 11:52:27 Slp:         Attempted to perform an unauthorized operation.
2013-06-22 11:52:27 Slp:     Data:
2013-06-22 11:52:27 Slp:       WatsonData = Microsoft SQL Server
2013-06-22 11:52:27 Slp:       DisableRetry = true
2013-06-22 11:52:27 Slp:     Inner exception type: System.UnauthorizedAccessException
2013-06-22 11:52:27 Slp:         Message:
2013-06-22 11:52:27 Slp:                 Attempted to perform an unauthorized operation.
2013-06-22 11:52:27 Slp:         Stack:
2013-06-22 11:52:27 Slp:                 at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
2013-06-22 11:52:27 Slp:                 at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
2013-06-22 11:52:27 Slp:                 at Microsoft.SqlServer.Configuration.Sco.SqlRegistrySecurity..ctor(ResourceType resourceType, SafeRegistryHandle handle, AccessControlSections includeSections)
2013-06-22 11:52:27 Slp:                 at Microsoft.SqlServer.Configuration.Sco.SqlRegistrySecurity.Create(InternalRegistryKey key)
2013-06-22 11:52:27 Slp:                 at Microsoft.SqlServer.Configuration.Sco.InternalRegistryKey.SetSecurityDescriptor(String sddl, Boolean overwrite

 

Pela descrição do erro no log da instalação detectamos que o problema estava relacionado ao permissionamento do registro do windows, visto que quando o Instalador do SQL Server tentava recuperar qual era o usuário atualmente em uso pelo SQL Server, recebemos um erro de System.UnauthorizedAccessException.

Este erro poderia estar relacionado diretamente as chaves de registro do SQL Server, como também poderia ser gerado por uma falta de permissão ligada ao Serviço do WMI (que o SQL Server utiliza para recuperar estas informações).

Solução:

A solução mais adequada para este problema seria acertar as pemissões no registro do Windows para que o usuário que estava executando a instalação pudesse acessar as chaves necessárias, porém em nosso caso o Cliente não tinha acesso a fazer quaisquer alterações nas chaves de registro, com isto passamos então para uma solução alternativa:

Para evitar que o SQL Server executasse a rotina de recuperação do usuário de serviço do SQL Server aproveitamos de um recurso do próprio instalador para contornar o problema, abaixo a sintaxe que utilizamos:

 setup.exe /q /ACTION=AddNode /INSTANCENAME="<Insert Instance Name>" /AGTSVCACCOUNT="<SQL Server Agent account that is used on other nodes>", /AGTSVCPASSWORD="<SQL Server Agent account password>"

Com isto ao chegar na etapa de instalação os dados de usuário e senha estavam corretamente preenchidos e com isto pudemos finalizar a instalação com sucesso ...

 Acho que é isto pessoal, espero ter ajudado um pouco aos que estejam enfrentando problemas similares durante a instalação de novos nós para um Cluster SQL Server 2008 existente.

 Um forte abraço e até a próxima!!!

Thiago Iacopini