Recuperando a base de sistema tempdb após um crash de disco!

Olá pessoal tudo certo? Espero que sim! Hoje irei simular a perda de um disco com os arquivos da base de sistema tempdb em uma instalação do SQL Server stand-alone, após o crash da instância, irei mostrar como você pode contornar a situação! Vamos lá!

Simulando o problema...

Tenho dois discos, o disco T: é exclusivo da TEMPDB.


Rodando o comando sp_helpfile no banco de dados TEMPDB, veja que os dois arquivos estão no disco T:


Parei o serviço da instância do SQL Server via Configuration Manager, por estar em um SQL Server stand-alone também seria possível fazê-lo através de outros mecanismos como por exemplo usando o NET STOP.:


Depois fui até o Disk Management, cliquei com o botão direito sobre o disco T:, selecionei “Delete Volume” e confirmei a operação:
 


Pronto, o disco T: está fora da jogada e os arquivos do TEMPDB também:


De volta ao Configuration Manager, tentei iniciar a instância do SQL Server:
 

Não funcionou, fui até o diretório de log da instância, e abri o ERRORLOG:


No ERRORLOG visualizei os seguintes erros no final do arquivo:

2014-05-30 13:26:22.24 spid10s     Clearing tempdb database.
2014-05-30 13:26:22.24 spid10s     Error: 5123, Severity: 16, State: 1.
2014-05-30 13:26:22.24 spid10s     CREATE FILE encountered operating system error 3(The system cannot find the path specified.) while attempting to open or create the physical file 'T:\Data\tempdb.mdf'.
2014-05-30 13:26:22.29 spid10s     Error: 17204, Severity: 16, State: 1.
2014-05-30 13:26:22.29 spid10s     FCB::Open failed: Could not open file T:\Data\tempdb.mdf for file number 1.  OS error: 3(The system cannot find the path specified.).
2014-05-30 13:26:22.33 spid10s     Error: 5120, Severity: 16, State: 101.
2014-05-30 13:26:22.33 spid10s     Unable to open the physical file "T:\Data\tempdb.mdf". Operating system error 3: "3(The system cannot find the path specified.)".
2014-05-30 13:26:22.45 spid10s     Error: 1802, Severity: 16, State: 4.
2014-05-30 13:26:22.45 spid10s     CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
2014-05-30 13:26:22.45 spid10s     Could not create tempdb. You may not have enough disk space available. Free additional disk space by deleting other files on the tempdb drive and then restart SQL Server. Check for additional errors in the event log that may indicate why the tempdb files could not be initialized.
2014-05-30 13:26:22.46 spid10s     SQL Trace was stopped due to server shutdown. Trace ID = '1'. This is an informational message only; no user action is required.

Resolvendo o problema...

Para superarmos este problema, temos que subir o SQL Server usando o parâmetro /f e o traceflag 3608, os mesmos usados no post: (http://sqlmagu.blogspot.com.br/2014/01/movimentacao-incorreta-da.html). O parâmetro -f, indica que quero subir o SQL Server com uma configuração mínima, montando apenas o Resource Database e o master. E o trace flag 3608 serve para não fazer o recovery dos bancos de dados de usuário. Uma vez que meu SQL Server é uma instalação stand alone, irei usar o NET START num prompt de comando elevado. E não se esqueça de trocar o texto em vermelho pelo nome da sua instância do SQL Server:

NET START MSSQL$SQLTEST /f /t3608

Se tudo estiver correto vocês verão a mensagem abaixo:


Notem que na snap-in de Services, o serviço da instância do SQL Server está iniciado:


Como estamos no modo mínimo, apenas um sysadmin poderá se logar por vez no SQL Server, então, vou me conectar ao SQL Server via SQLCMD rodando o comando abaixo:

SQLCMD –S .\SQLTEST –E
  
O –S server para indicar o nome da instância, enquanto que o –E indica uma conexão com login integrado, ou seja, o usuário que está logado no Windows deve possuir privilégios para acessar o SQL Server. Se o comando der certo, estaremos dentro do SQL Server:


Agora basta executarmos um ALTER DATABASE e apontar os arquivos da TEMPDB para um caminho novo em outro disco. Para saber qual nome dos arquivos da TEMPDB que foram perdidos junto com o disco T:,  rode o comando abaixo:

SELECT * FROM SYSALTFILES WHERE DBID = 2
GO

Você verá algo como a seguir:


Agora vou rodar os comandos abaixo para apontar novos caminhos para estes arquivos: 

ALTER DATABASE TEMPDB MODIFY FILE (NAME=’TEMPDEV’, FILENAME=’C:\DATA\TEMPD.MDF’)
GO

ALTER DATABASE TEMPDB MODIFY FILE (NAME=’TEMPLOG’, FILENAME=’C:\LOG\TEMPLOG.LDF’)
GO 

Agora, saia do SQLCMD pressionando CTRL + C, pare o serviço do SQL Server e inicie-o normalmente. Se o serviço iniciar sem problemas, vá até o Management Studio, conecte-se na instância e dispare os comandos abaixo:

USE TEMPDB
GO
SP_HELPFILE 

Pronto! É possível ver que os arquivos estão localizados no novo caminho dentro da unidade "C":
 

Espero que tenham gostado do post! Um abraço!

2 comentários:

  1. Respostas
    1. Rômulo fico feliz que o artigo tenha sido util a você! Abraço!

      Excluir