terça-feira, 7 de julho de 2015

Recuperando Banco de Dados com Transaction Log Corrompido


Já publiquei um post falando de arquivo de dados corrompido e como recuperar o banco (http://sqlserver-brasil.blogspot.com.br/2009/01/recuperando-banco-de-dados-no-sql.html), vou completar o assunto escrevendo sobre Transaction Log corrompido.

Primeiro veremos como simular um arquivo de Log corrompido, depois como recuperar o banco.

Corrompendo o Transaction Log

Para corromper o arquivo de Log basta seguir os passos abaixo:

1) Primeiro vamos criar o banco de Dados “LogCorruptDB” e a tabela de “Clientes” utilizando o script abaixo:

USE master
go

IF DB_ID('LogCorruptDB') is not null
   DROP DATABASE LogCorruptDB
go
CREATE DATABASE LogCorruptDB
go

USE LogCorruptDB
go

-- Cria tabela Clientes
CREATE TABLE dbo.Clientes (
CLientesPK int not null primary key,
Nome varchar(60) not null,
Telefone varchar(20) null)
go

INSERT dbo.Clientes VALUES (1,'Jose','2121-1111')
INSERT dbo.Clientes VALUES (2,'Ana','2222-1111')
INSERT dbo.Clientes VALUES (3,'Maria','2323-1111')
go

2) Próximo passo, executar uma transação de atualização sem finaliza-la.  O comando CHECKPOINT serve para forçar a escrita dos dados no arquivo de dados, já que qualquer alteração é feita primeiramente na memória.

BEGIN TRAN
UPDATE dbo.Clientes SET Telefone = '2323-3333'
WHERE CLientesPK = 3
go
CHECKPOINT
go

3) Para corromper o arquivo de Log precisamos altera-lo com um editor Hexa (http://mh-nexus.de/en/hxd/), porém como os arquivos ficam abertos enquanto o SQL Server está ativo, precisamos para o serviço antes de editar o arquivo.  Um SHUTDOWN simples irá executar o ROLLBACK da transação antes de parar o SQL Server, para não ocorrer o ROLLBACK precisamos parar o serviço utilizando o comando abaixo:

SHUTDOWN WITH NOWAIT


4) Em seguida, vamos editar o arquivo de Log com um editor Hexa, alterando as duas primeiras linhas para corromper o arquivo.


5) Por último, vamos iniciar o SQL Server e verificar o banco corrompido no Management Studio em Databases:



Como o arquivo de Log está corrompido o SQL Server não conseguiu executar o Recovery Process, ficando o banco fora do ar e com status de “Recovery Pending.  A tentativa de acesso ao banco gera o erro abaixo:

USE LogCorruptDB
go

Erro:
Msg 945, Level 14, State 2, Line 46
Database 'LogCorruptDB' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.



Recuperando o Banco com Transaction Log corrompido

Para visualizar o status atual do banco utilizamos a função DATABASEPROPERTYEX:

SELECT DATABASEPROPERTYEX ('LogCorruptDB', 'STATUS')

O banco está com status SUSPECT e fora do ar.

Se tentarmos fazer um Detach/Attach com Rebuild do Log, o SQL Server retorna a mensagem de erro, pois Detach não funciona com banco SUSPECT:

EXEC master.dbo.sp_detach_db @dbname = N'LogCorruptDB'

Erro:
Msg 3707, Level 16, State 2, Line 57
Cannot detach a suspect or recovery pending database.
It must be repaired or dropped.

Outra alternativa é utilizar o comando DBCC CHECKDB, mas antes precisamos alterar o status do banco, como abaixo:

ALTER DATABASE LogCorruptDB SET EMERGENCY
go

DBCC CHECKDB (LogCorruptDB, REPAIR_ALLOW_DATA_LOSS)
WITH NO_INFOMSGS, ALL_ERRORMSGS

Erro:
Msg 7919, Level 16, State 3, Line 70
Repair statement not processed. Database needs
to be in single user mode.

Repare na mensagem, que o comando DBCC CHECKDB com REPAIR_ALLOW_DATA_LOSS requer status de SINGLE USER no banco!

ALTER DATABASE LogCorruptDB SET SINGLE_USER
go

DBCC CHECKDB (LogCorruptDB, REPAIR_ALLOW_DATA_LOSS)
WITH NO_INFOMSGS, ALL_ERRORMSGS
go

A mensagem de retorno alerta que o Transaction Log foi recriado, mas podem ocorrer inconsistências no banco devido a transações inacabadas! 

Podemos acessar agora o banco de dados sem problema, mas a tabela de Clientes manteve a alteração da transação que ficou em aberto, veja:

SELECT * FROM LogCorruptDB.dbo.Clientes


O Rebuild do Transaction Log deve ser utilizado apenas quando não existe Backup para recuperar o banco no caso de Log corrompido, pois sempre existe a possibilidade de recuperar o banco num estado inconsistente!

Até o próximo post.

Saudações Tricolores,
Landry

sábado, 4 de julho de 2015

Criptografia no Backup no SQL Server 2014

A partir do SQL Server 2014 a Microsoft incluiu a criptografia no Backup, agregando mais segurança as informações armazenadas nos bancos de dados.  Contudo, criptografar Backups requer além da alteração nos scripts, alguns cuidados no armazenamento de chaves e senhas, podendo até inviabilizar um Restore!

Segue abaixo lista de restrições no uso de criptografia no Backup:

- As edições do SQL Server Express e Web não suportam criptografia no Backup.

- A cláusula do Backup NOINIT não pode ser utilizada, apenas INIT e FORMAT são aceitas.

- Além da permissão para executar o comando Backup, o Login necessita de permissão VIEW DEFINITION para manipular certificados e chaves.

Atendendo os requisitos acima, basta seguir os passos abaixo para criptografar os Backups do SQL Server:

1) Criar uma Master Key no banco MASTER, como pré-requisito para criação de certificado utilizado na criptografia:

USE master
go
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Landry123*'

2) Criar um Certificado no banco MASTER, para ser utilizado na criptografia do Backup:

Use Master
go
CREATE CERTIFICATE BackupEncryptCert
WITH SUBJECT = 'Certificado para criptografia de Backup'

3) Exportar o Certificado para arquivo, caso seja necessário restaurar o banco em outra instância de SQL Server:

BACKUP CERTIFICATE BackupEncryptCert
TO FILE = 'D:\Landry\BackupEncryptCert.cer'
WITH PRIVATE KEY (
FILE = 'D:\Landry\BackupEncryptCert.key',
ENCRYPTION BY PASSWORD = 'Landry123*')

ATENÇÃO!!!!!! Guardar os arquivos gerados no BACKUP CERTIFICATE (.cer e .key) e a senha em local seguro, você vai precisar deles quando for restaurar o backup em outra instância de SQL Server.

4) Estamos prontos para executar os Backups utilizando a nova cláusula ENCRYPTION do comando BACKUP como abaixo:

BACKUP DATABASE AdventureWorks
TO DISK = N'D:\Landry\AdventureWorks_Encrypt.bak'
WITH COMPRESSION, STATS = 10,
ENCRYPTION (ALGORITHM = AES_256,
SERVER CERTIFICATE = BackupEncryptCert)

Se houver necessidade de restaurar o Backup em outra instância de SQL Server, primeiro tem que criar a Master Key (se não foi criada), em seguida importar o Certificado utilizado no Backup.  Se o Certificado não for importado antes do Restore, você irá receber o erro abaixo:

Msg 33111, Level 16, State 3, Line 59
Cannot find server certificate with thumbprint
'0x4B40E913C8B1FD1692AA0E05D879CD095D774B20'.
Msg 3013, Level 16, State 1, Line 59
RESTORE DATABASE is terminating abnormally.

Preparamos uma instância para receber Backups feitos com criptografia em outra instância utilizando os passos abaixo:

1) Criação da Master Key

USE master
go
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Landry123*'

2) Importação do Certificado

CREATE CERTIFICATE BackupEncryptCert
FROM FILE = 'D:\Landry\BackupEncryptCert.cer'
WITH PRIVATE KEY (
FILE = 'D:\Landry\BackupEncryptCert.key',
DECRYPTION BY PASSWORD = 'Landry123*')

Pronto, basta restaurar os Backups normalmente.

Até o próximo post.
Landry

segunda-feira, 2 de março de 2015

Como Instalar o SQL Server 2014 Books OnLine (BOL) Localmente

A versão 2014 do SQL Server não vem com o Books OnLine local, sendo necessário acesso a internet para consultar seu conteúdo. Como a maioria dos servidores SQL Server possuem acesso restrito a internet, fica impossível consultar o BOL. Por esse motivo, todo servidor SQL Server 2014 que instalo, configuro o BOL localmente.

Neste post vou mostrar como instalar o BOL localmente.

1) O BOL local pode ser obtido na URL abaixo:
http://www.microsoft.com/en-us/download/details.aspx?id=42557

2) Após o download, execute o arquivo SQLServer2014Documentation_....exe para descompactar os documentos em uma pasta temporária.
 
3) Execute o programa Manage Help Settings localizado no grupo de programas do Microsoft SQL Server 2014\Documentation & Community, no menu Start.
 
4) Na janela Help Library Manager selecione Install content from disk, veja na imagem abaixo:
 
5) Em Install Content from Disk entre com a pasta onde foram descompactados os arquivos do BOL (Item 2 acima).

6) Selecione Add na documentação que você pretende instalar e clique no botão Update.
 7) Retornando a primeira página, selecione agora Choose online or local help.

8) Em Settings selecione I want to use local help em clique no botão OK.
 
Pronto! Instalado!
 
Bons estudos e até o próximo post.
Landry

sexta-feira, 14 de setembro de 2012

Como Instalar o SQL Server 2012 Books OnLine (BOL) Localmente

A versão 2012 do SQL Server não vem mais com o Books OnLine local, sendo necessário acesso a internet para consultar seu conteúdo. Percebi isso quando instalei o SQL Server 2012 no meu Notebook e estava estudando em um local sem acesso a Internet!

Neste post vou mostrar como instalar o BOL localmente.

1) O BOL local pode ser obtido na URL abaixo:

2) Após o download, execute o arquivo SQLServer2012Documentation.exe para descompactar os documentos em uma pasta temporária.

3) Execute o programa Manage Help Settings localizado no grupo de programas do Microsoft SQL Server 2012\Documentation & Community, no menu Start.

4) Na janela Help Library Manager selecione Install content from disk, veja na imagem abaixo:
5) Em Install Content from Disk entre com a pasta onde foram descompactados os arquivos do BOL (Item 2 acima).
6) Selecione Add na documentação que você pretende instalar e clique no botão Update.
7) Retornando a primeira página, selecione agora Choose online or local help.
8) Em Settings selecione I want to use local help em clique no botão OK.

Pronto! Instalado!

Bons estudos e até o próximo post.
Landry

segunda-feira, 2 de abril de 2012

Bancos de Exemplo SQL Server 2012

Depois de um longo período sem publicar nada no blog, retorno para iniciar uma nova série de posts sobre o SQL Server 2012. Coletei um vasto material sobre a nova versão do SQL Server como apoio no estudo para as provas BETA de certificação, e gradativamente estou transformando em posts para o blog.

Irei utilizar nas demonstrações o banco de dados de exemplo fornecidos pela Microsoft no endereço abaixo:

AdventureWorks2012 Data File
(http://msftdbprodsamples.codeplex.com/releases/view/55330#DownloadId=165399)

Após o download basta posicionar o arquivo .MDF na pasta onde você pretende armazenar o banco e executar o script abaixo, alterando o trecho de código em vermelho para o caminho selecionado:

CREATE DATABASE AdventureWorks2012
ON (FILENAME = 'C:\Bancos\AdventureWorks2012_Data.mdf')
FOR ATTACH_REBUILD_LOG


O SQL Server Management Studio irá retornar a seguinte mensagem, criando o banco com sucesso:
File activation failure. The physical file name "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\AdventureWorks2012_Log.ldf" may be incorrect.
New log file 'C:\Bancos\AdventureWorks2012_log.ldf' was created.

Até o próximo post, onde iremos explorar as novas funcionalidades do SQL Server 2012.
Landry

quarta-feira, 30 de novembro de 2011

SQL Server 2012 RC0 Download

Depois de um longo período ausente, pretendo retomar
os posts escrevendo sobre a nova versão do SQL Server, definida recentemente como SQL Server 2012.

Segue abaixo alguns links para download do produto e papers:

Link para download SQL Server 2012 RC0 32 e 64 bits:
http://www.microsoft.com/betaexperience/pd/SQLDCTP3CTA/enus/default.aspx

Link para download SQL Server 2012 RC0 Express:
http://msdn.microsoft.com/en-us/evalcenter/hh230763.aspx

Site oficial da Microsoft para o SQL Server 2012:
http://www.microsoft.com/sqlserver/en/us/future-editions.aspx

Segue abaixo a lista dos pré-requisitos:
http://msdn.microsoft.com/en-us/library/ms143506(v=sql.110).aspx

Nos próximos posts vou explorar as novas
funcionalidades do SQL Server 2012, aguardem…
Landry

quinta-feira, 21 de abril de 2011

Filtered Index in SQL Server 2008

Neste post vou falar de um recurso novo no SQL Server 2008 para melhorar o desempenho das consultas: Filtered Index. A partir do SQL Server 2008 pode-se acrescentar ao comando CREATE INDEX uma cláusula WHERE, filtrando linhas da tabela e reduzindo o tamanho do índice.

Para mostrar este recurso utilizei como exemplo a tabela “Production.TransactionHistory” do banco de dados AdventureWorks2008. A consulta abaixo utiliza um “Cluster Index Scan” (leia-se “Table Scan”, pois no nível folha do índice cluster temos a própria tabela) como plano de execução.

set statistics profile on
set statistics io on

select BusinessEntityID,FirstName,MiddleName,LastName,ModifiedDate
from Person.Person where PersonType = 'VC'

-- Cluster Index Scan
-- Table 'Person'. Scan count 1, logical reads 3816
O índice ideal para atender a consulta acima seria um Nonclustered Index com a chave na coluna PersonType e Include nas demais colunas do SELECT, veja:

create index IX_Person_PersonType on Person.Person(PersonType)
include (FirstName,MiddleName,LastName,ModifiedDate)
Se executarmos a consulta acima novamente o SQL Server fará Index Seek, reduzindo consideravelmente o I/O.

-- Index Seek (IX_Person_PersonType)
-- Table 'Person'. Scan count 1, logical reads 4
A partir do SQL Server 2008 pode-se criar índices menores, especializados na cláusula WHERE de uma consulta, gerando redução do espaço ocupado. Basta acrescentar ao final de um CREATE INDEX uma cláusula WHERE:

create index IX_Person_PersonType_Filter on Person.Person(PersonType)
include (FirstName,MiddleName,LastName,ModifiedDate)
where PersonType = 'VC'
Se executarmos a consulta do início do artigo novamente o SQL Server irá gerar o mesmo plano de execução, porém utilizando o novo índice:

-- Index Seek (IX_Person_PersonType_Filter)
-- Table 'Person'. Scan count 1, logical reads 4
Comparando os dois índices com a instrução abaixo, podemos observar a redução no tamanho do índice de 137 para 4 páginas de 8k.

select i.name Indice,used_page_count,row_count
FROM sys.dm_db_partition_stats P INNER JOIN sys.indexes I
ON I.index_id = P.index_id AND I.OBJECT_ID = P.OBJECT_ID
WHERE p.OBJECT_ID = OBJECT_ID('Person.Person')
Até o próximo post,
Landry.