«

»

set 12

Perdeu uma base de sistema?

Talvez por administrar um grande parque de servidores de diferentes empresas de diversos portes, tive a oportunidade de atuar na recuperação de algumas bases de sistema e aqui vai um passo a passo que pode economizar bastante tempo.

As causas são muitas e na maioria das vezes os sintomas são de arquivos corrompidos com logs que são claros, como no nosso exemplo. O Event ID 9004 registra o erro e informa que não foi possível processar o log da base model:

 

Apesar do evento sugerir um restore ou um rebuild do log, como o serviço do SQL não iniciava foi preciso fazer um rebuild das bases de sistema. Como não é possível escolher a base a ser reconstruída, todas as bases de sistema são afetadas – master, model, msdb e tempdb – resultando em consequências como perda de logins e users, bases, endpoints, linked servers, configurações e metadados da instância, o modelo inicial utilizado para criar a TempDB durante a inicialização, jobs, schedules, configurações de service broker entre outras coisas, exceto os objetos de sistema que são armazenados na resource database.

Ficou claro a importância de sempre fazer backup das bases de sistema? Também é interessante aproveitar pra copiar os mdf e os ldf das bases de sistema naquela janela que vai precisar reiniciar o serviço do SQL Server, seja o motivo que for. De posse desses arquivos, eu poderia simplesmente substituí-los e iniciar a instância tranquilamente, praticamente sem impacto.

O procedimento até que é simples mas para quem está em um ambiente de Failover Cluster tem uma dica importantíssima que vamos falar mais adiante.

 

1- Saiba a versão do SQL Server que você está recuperando. Basta olhar nos logs o Event ID 17069 que você fica sabendo exatamente a versão:

 

2- Através da mídia de instalação do SQL Server da mesma versão que está sendo recuperada execute o seguinte comando:

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=DOMAIN\ADMINISTRATOR /SAPWD=N0v@S&nh@

Se sua instância for nomeada, troque MSSQLSERVER pelo nome da instância que você obtém facilmente através da console de serviços do Windows;

Troque DOMAIN pelo nome do seu domínio e coloque um usuário para se tornar membro da Role Sysadmin. No caso de um servidor local troque DOMAIN pelo nome do servidor;

A senha do SA é opcional mas é uma boa oportunidade pra já deixá-la definida;

Muitos procedimentos na internet sugerem a utilização do arquivo local que fica em C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release mas no SQL Server 2008 R2 resulta em erro. Em uma thread no Technet vários DBAs informaram que só funcionou depois de utilizarem o setup.exe do CD de instalação. O Tibor Karaszi dá uma explicação pra isso neste artigo (em inglês) e a Microsoft confirma o bug nesta thread do Connect (em inglês). Por isso, o rebuild deve ser iniciado utilizando o CD de instalação do SQL Server da versão que você possui instalada.

 

O comando quando executado com sucesso não retorna nada, apenas volta para o prompt.

 

Rebuild concluído, se você iniciar os serviços vai perceber que falta muita coisa e que só é possível fazer login com o usuário que você adicionou durante o rebuild ou com o SA, usando a senha redefinida. Não inicie o serviço do SQL ainda, vai ser necessário utilizar um parâmetro para possibilitar que a instância seja iniciada em modo Single User, ou seja, apenas um usuário poderá estar conectado.

Para iniciar a instância em modo Single User muita gente indica colocar o parâmetro “-m;” no serviço do SQL Server , permitindo que apenas um administrador se conecte para fazer o restore. Este procedimento não funciona se você estiver em um ambiente com Failover Cluster pois quando você sobe o serviço do SQL Server o serviço do Cluster se conecta assim que o serviço do SQL Server é iniciado, o que te impossibilita de se conectar para fazer o restore. Portanto, vamos para o procedimento que funciona em servidores Standalone e em ambientes com Failover Cluster.

 

3- Abra o prompt e inicie o SQL Server em modo Single User:

C:\> NET START MSSQLSERVER /m
(troque MSSQLSERVER pelo nome da sua instância se for do tipo nomeada)

Desta forma, somente o serviço do SQL Server é iniciado, o serviço do Cluster não percebe e você pode se logar utilizando o SQLCMD da seguinte forma:

C:\> SQLCMD -E -S MSSQLSERVER
(troque MSSQLSERVER pelo nome da sua instância se for do tipo nomeada)

 

4- Agora faça o restore da Master como se estivesse fazendo o restore de uma base de usuário:

1> RESTORE DATABASE master FROM DISK = ‘D:\backups\master.bak’ WITH REPLACE;
2>GO 

 

5- Pare a instância que está em modo Single User:

C:\> NET STOP MSSQLSERVER
(troque MSSQLSERVER pelo nome da sua instância se for do tipo nomeada)

 
6- Agora se você estiver em um ambiente que utiliza Failover Cluster, basta iniciar o serviço na própria console do Cluster. Quem está fazendo em servidor Standalone basta executar:

C:\> NET START MSSQLSERVER
(troque MSSQLSERVER pelo nome da sua instância se for do tipo nomeada)

 

Conecte-se utilizando o SSMS e veja que agora as bases de usuário, configurações e logins estão todos de volta.

 

Referências:

 

Cluster

http://technet.microsoft.com/en-us/library/ms188236.aspx

 

Rebuild

http://technet.microsoft.com/en-us/library/dd207003(v=sql.105).aspx

 

Single User

http://technet.microsoft.com/en-us/library/ms180965(v=sql.105).aspx

 

Restore

http://technet.microsoft.com/en-us/library/ms190679(v=sql.105).aspx

1 comentário

  1. Ivan Aletto Grosso

    Boa tarde,

    Obrigado pela ajuda, o tópico explica perfeitamente o que é preciso fazer.

    Vale a leitura!

Deixe uma resposta