skip to Main Content

Recuperando Banco de Dados no SQL Server

Neste post veremos como recuperar um banco de dados SQL Server com arquivo de Transaction Log corrompido. Primeiro vamos criar um banco de dados para teste, o script abaixo cria o banco TesteDB com uma tabela de Clientes:

USE master
go
CREATE DATABASE TesteDB
go

USE TesteDB
go
CREATE TABLE Clientes (
ClientesID int not null, 
Nome varchar(40) not null, 
Telefone varchar(20) null)
go

INSERT Clientes VALUES (1,'Jose','(21) 2521-2252')
INSERT Clientes VALUES (2,'Maria','(21) 2521-1151')
go

Agora para corromper o banco TesteDB, basta simular uma queda de energia:

1) Na mesma conexão utilizada no script anterior, execute o código abaixo e mantenha a conexão aberta:

-- Abre transacao e atualiza tabela
BEGIN TRAN
  UPDATE Clientes SET Telefone = '(21) 2521-1151'
  WHERE ClientesID = 2
go
CHECKPOINT
go

2) Abra uma nova conexão e execute o comando “SHUTDOWN WITH NOWAIT”.

O SQL Server para o serviço com o arquivo de dados atualizado pela transação que ficou em aberto, mantendo no arquivo de log o registro desta transação incompleta.  Em uma situação normal, O SQL Server resolveria o problema ao iniciar, executando um ROLLBACK da transação que ficou em aberto, utilizando as informações do arquivo de log.

Para corromper o arquivo de log basta abri-lo no NOTEPAD, apagar alguns caracteres no seu início e salvar.  Após corromper o arquivo de log inicie o SQL Server e tente entrar no banco TesteDB, teremos a mensagem de erro abaixo:

USE TesteDB
go

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

Se você pesquisar no log do serviço (Management Studio – Object Explorer – Management – SQl Server Logs) teremos as mensagens abaixo:

– File activation failure. The physical file name “F:\sql2005\TesteDB_log.LDF” may be incorrect.
– The header for file ‘F:\sql2005\TesteDB_log.LDF’ is not a valid database file header. The PageAudit property is incorrect.

Para verificar o status do banco TesteDB:

SELECT databasepropertyex ('TesteDB', 'STATUS');

Resultado: SUSPECT

Vamos tentar resolver o problema com Detach e depois Attach:

EXEC sp_detach_db 'TesteDB'

Resultado:
Msg 947, Level 16, State 1, Line 1 Error while closing database ‘TesteDB’. Check for previous additional errors and retry the operation.

O Detach ocorreu, apesar do erro alertando o estado inconsistente do banco de dados.  Verifique com o comendo abaixo:

SELECT * FROM sys.databases WHERE NAME = 'TesteDB'

Até o próximo post.

Saudações Tricolores,
Landry

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Back To Top