Integridade do Banco de Dados

Os dados dentro do banco de dados podem se tornar corrompidos se houver uma falha no sistema de armazenamento em disco quando o SQL Sever estiver gravando em uma pagina. As páginas de dados tem tamanho de 8 quilobytes(KB), mas ao efetuar operações de gravação, o SQL Server divide uma página em 16 blocos de 512 bytes(lembrando que 1KB = 1024 bytes).

Fazendo as contas fica mais ou menos assim:

512 bytes x 16 blocos = 8192 bytes

Aplicando uma regra de tres simples:

1KB  —————– 1024 bytes

xKB  —————– 8192 bytes

1024x = 8192

x = 8KB

Ou seja exatamente o tamanho de uma página de dados. Se o SQL Sever começa a gravar blocos em uma página e o sistema de disco falha no meio do processo de gravação, apenas uma parte da página e gravada com sucesso, gerando um problema chamado de “página rasgada” ou, em inglês, “torn page”.

Os bancos de dados tem uma opção chamada PAGE_VERIFY. A verificação de pagina pode ser configurada como TORN_PAGE_DETECTION ou CHECKSUM. A opção TORN_PAGE_DETECTION de PAGE_VERIFY existe para compatibilidade de versões anteriores e não dever ser utilizada.

Quando a opção CHECKSUM de PAGE_VERIFY e ativada, o SQL Server calcula um CHECKSUM(ou soma de verificação em português) para a página antes da gravação. Sempre que uma página é lida do disco uma soma de verificação e novamente calculada é comparada com o CHECKSUM gravado na página. Se as somas dos CHECKSUM não corresponderem, a página foi corrompida.

Quando o SQL Server encontra uma página corrompida é gerado um erro, o comando que está tentando acessar a página corrompida é cancelado e uma entrada é gravada na tabela SUSPECT_PAGES do banco de dados msdb.

Embora a verificação de página possa detectar e registrar páginas corrompidas, a página deve ser lida do disco para disparar a verificação. Normalmente, os dados são lidos do disco quando usuários e aplicativos os acessam, mas em vez de ter um usuário recebendo uma mensagem de erro, é muito melhor encontrar a corrupção preventivamente e corrigir o problema usando um backup, antes que o usuário tenha um processo cancelado.

Você pode obrigar o SQL Sever a ler toda página do disco e verificar a integridade executando o comando DBCC CHECKDB. A sintaxe de DBCC CHECKDB:

DBCC CHECKDB
[( ‘database’ | database_id | 0
[ , NOINDEX
REPAIR_ALLOW_DATA_LOSS
REPAIR_FAST
REPAIR_REBUILD]
)]
[WITH
{
[ALL_ERRORMSGS ] [ , NO_INFOMSGS ] [ , TABLOCK ]
[, ESTIMATEONLY ] [ , { PHYSICAL_ONLY | DATA_PURITY } ]
}
]

Quando o DBCC CHECKDB é executado, o SQL Server executa todas as ações descritas abaixo:

  • Verifica a alocação de página dentro do banco de dados.
  • Verifica a integridade estrutural de todas as tabelas e viewes indexadas.
  • Calcula um CHECKSUM para cada página de dados e índices para comparar com o CHECKSUM armazenado.
  • Valida o conteúdo de cada modo de exibição indexado.
  • Verifica o catálogo do banco de dados.
  • Valida os dados do Service Broker dentro do banco de dados.

Para realizar essas verificações, o comando DBCC CHECKDB executa os seguintes comandos:

  • DBCC CHECKALLOC, para verificar a alocação de página do banco de dados.
  • DBCC CHECKCATALOG, para verificar o catálogo do banco e dados.
  • DBCC CHECKTABLE, para cada tabela e view no banco de dados verificar a integridade estrutural.

Os erros encontrados são mostrados na saída para que você possa corrigir os problemas. Se for encontrado um erro de integridade em um índice, você deve eliminar e recriar o índice. Se for encontrado um erro de integridade em uma tabela, você precisa usar seus backups mais recentes para reparar as páginas danificadas.

DICA  Espelhamento de banco de dados

Se  o banco de dados estiver participando de espelhamento de banco de dados(Database Mirroring), o SQL Server tentará recuperar uma cópia da página do espelho. Se a página puder ser recuperada do espelho e tiver conteúdo correto, será substituída automaticamente no principal, sem exigir nenhuma intervenção. Quando o SQL Server  substitui uma página corrompida a partir do espelho, uma entrada é gravada na VIEW SYS.DM_DB_MIRRORING_AUTO_PAGE_REPAIR.

Aqueles que pretendem tirar certificação SQL Server 2005 ou 2008(70-431 ou 70-432 respectivamente) esse assunto é um dos abordados. Vou colocar logo abaixo um exemplo de como poderiam abordar esse assunto.

A power failure occurs on the storage area network (SAN) where your SQL Server 2005 database server is located. You need to check the allocation as well as the structural and logical integrity of all databases, including their system catalogs. What should you do?

A. Execute DBCC CHECKFILEGROUP for each filegroup.

B. Execute DBCC CHECKCATALOG.

C. Execute DBCC CHECKDB.

D. Execute DBCC CHECKTABLE for each table.

Resposta: C

Bom espero que tenham gostado do post!

Anúncios

3 thoughts on “Integridade do Banco de Dados

  1. O artigo ficou muito bom! Em especial, a introdução que compara o tamanho do cluster de disco (512 bytes) contra o tamanho da página SQL. Seria muito legal se postasse mais coisas assim! Parabéns!
    Abraços, Fabricio

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s