Restaurando um Database Suspect – SQL Server

Se seu banco de dados estiver em modo suspeito, então nenhuma operação ocorrerá até que o banco de dados seja reparado. Neste post irei mostrar como recuperar o banco de dados nessa situação.

Normalmente esse tipo de situação não é muito comum, porém é um problema crítico, pois causa indisponibilidade no database em questão. Este problema é causado quando ocorre alguma corrupção nos arquivos de dados (DATABASELog.ldf), ou quando falta espaço no disco onde estão os arquivos de DATA e/ou LOG.

Quando ocorre o arquivo de LOG do database está corrompido, você pode receber algumas mensagens de erro que indicam este tipo de situação. Vamos supor que você está usando o SQL Query Analyser, você poderá receber as seguintes mensagens de erro:

Msg 945, Level 14, State 2, Line 1
Database ‘xxxxxx’ cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.

Msg 926, Level 14, State 1, Line 1
Database ‘xxxxxx’ cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server errorlog for more information.

Ou se você estiver utilizando o GUI do SSMS (SQL Server Management Studio) você receberá uma mensagem de erro parecida com a imagem abaixo:

db01

Você também pode ver quais databases estão com o status SUSPECT, executando a query a seguir:

USE master
GO

SELECT 
	Name, State_Desc
FROM 
	sys.databases 
WHERE 
	State_Desc ='SUSPECT'

Se você encontrar algum database com o status SUSPECT, mantenha a calma. A partir do SQL Server 2005 foi introduzida um novo DB Status Emergency. Esse modo pode mudar o DB de modo suspeito para o modo de emergência, para que você possa recuperar os dados somente no modo de leitura. Os passos são simples: depois de de você executar o script a seguir, você terá de volta o seu banco de dados em modo operacional.

Obviamente há mais duas opções disponíveis. A opção REPAIR_ALLOW_DATA_LOSS remove os dados corrompidos, assegurando que o banco de dados seja devolvido a um estado estrutural, transacional e consistente. Tenha em mente que o modo de emergência é uma operação unidirecional, ou seja, qualquer coisa que for feita não pode ser revertida ou desfeita. Para realizar esta operação, realize um BACKUP do database antes de entrar no modo de emergência. Como é uma operação de mão única, você não pode envolvê-lo em uma user-transaction. É uma opção de reparo disponível somente em modo de emergência – se você tentar usar o REPAIR_REBUILD, então ele não irá funcionar.

Obs.: Quando um database está no modo EMEGERNCY, só é possível realizar operações de SELECT no database. UPDATE, INSERT e DELETE não são permitidos. Há perda de dados, pois a opção REPAIR_ALLOW_DATA_LOSS apaga os dados corrompidos.
Nem sempre o SQL Server deixa o database com o status “SUSPECT”. Vamos supor que o problema no arquivo de LOG aconteceu justamento no cabeçalho do mesmo, o SQL Server deixará o status do database como “PENDING STATE”.

Links uteis:
ALTER DATABASE
DBCC CHECKDB

USE Master
GO
-- Coloca o database em modo de emergência
ALTER DATABASE ALAN_TESTE SET EMERGENCY
GO
-- Realiza um check do database
DBCC CHECKDB('ALAN_TESTE')
GO
-- Altera o database para SINGLE_USER, ou seja, só um usuário pode estar conectado
ALTER DATABASE ALAN_TESTE SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- Realiza o comando para reparo do database
DBCC CHECKDB('ALAN_TESTE', REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS
GO
-- Volta a base de dados para multiplos usuários
ALTER DATABASE ALAN_TESTE SET MULTI_USER
GO
-- Restarta o status do database
EXEC sp_resetstatus 'ALAN_TESTE'

Raramente esse tipo de problema irá acontecer, mas quando acontecer é importante analisar detalhadamente para entender o porquê da corrupção dos arquivos de log.

Nesse link, tem uma demo de como deixar um database com o status SUSPECT, e também como resolver esse problema.

6 thoughts on “Restaurando um Database Suspect – SQL Server

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s