Verificação de Página e Restore de Bases no SQL Server

Posted on junho 2, 2011

4


 

PAGE VERIFY é a opção que detecta páginas corrompidas no banco de dados por erros de disco, problemas de hardware ou “not clean shutdown” da máquina.

Temos 3 opções de verificação disponíveis no SQL Server que são:

  •  CHECKSUM – A engine do SQL Server calcula um checksum para cada página de dados e armazena no header da página quando é escrita em disco. Quando a página é lida do disco, o checksum é recomputado e comparado com o checksum armazenado. Se o valor não for o mesmo, à página está possivelmente corrompida. O checksum é uma feature implementada no SQL Server 2005, lembrando que quando habilitamos a verificação de página checksum para um banco de dados, temos um overhead de aproximadamente 2% de CPU,  porque os cálculos para a realização do checksum são complexos e todas as vezes que uma página for tirada do disco para ser colocada em memória o SQL Server terá que calcular um checksum.

 

  •  TORN_PAGE_DETECTION – Cada página contém 8KB, para cada setor de 512-Bytes é especificado 2Bytes de verificação (Flag) que é armazenado no header da página. Quando a página é  colocada em memória, o conjunto de bits armazenados no header é comparado com o conjunto de bits do disco, se houver alguma modificação, por causa de operações de I/O, falha do sistema então a página estará corrompida.
  •  NONE – Nenhuma Verificãção é realizada

Vamos analisar o seguinte cenário:

1. Iremos realizar um backup do banco de dados com cada tipo de verificação de página para ver se isso influencia no momento de um restore do banco de dados.

–Verificação de Página Checksum

ALTER DATABASE AdventureWorks

SET PAGE_VERIFY CHECKSUM

 

BACKUP DATABASE AdventureWorks

TO DISK = ‘C:\temp\AdventureWorksCHECKSUM.BAK’

WITH INIT, CHECKSUM

 

–Verificação de Página TORN_PAGE_DETECTION

ALTER DATABASE AdventureWorks

SET PAGE_VERIFY TORN_PAGE_DETECTION

 

BACKUP DATABASE AdventureWorks

TO DISK = ‘C:\temp\AdventureWorksTORN_PAGE_DETECTION.BAK’

WITH INIT

 

–Verificação de Página NONE

ALTER DATABASE AdventureWorks

SET PAGE_VERIFY NONE

 

BACKUP DATABASE AdventureWorks

TO DISK = ‘C:\temp\AdventureWorksNONE.BAK’

WITH INIT

 

image

 

2. Usando o editor hexadecimal – http://www.superdownloads.com.br/download/141/hex-editor/  navegue até o offset 02b69c10 posição 80 e altere para 70 como está na foto a seguir. Faça nos 3 backups que acabamos de realizar, sendo assim estamos simulando que em algum momento os backups foram corrompidos (alterados).

Antes

image

Depois

image

 

3. Agora iremos realizar a verificação dos backups gerados, para isso podemos utilizar uma opção de restore chamada RESTORE VERIFYONLY que verifica se o backup esta válido ou não, se está legível, lembrando que esta opção não analísa a estrutura do dados contida no backup.

–CHECKSUM

RESTORE VERIFYONLY

FROM DISK = ‘C:\temp\AdventureWorksCHECKSUM.BAK’

 

–TORN_PAGE_DETECTION

RESTORE VERIFYONLY

FROM DISK = ‘C:\temp\AdventureWorksTORN_PAGE_DETECTION.BAK’

 

–NONE

RESTORE VERIFYONLY

FROM DISK = ‘C:\temp\AdventureWorksNONE.BAK’

 

Resultados da Verificação dos Backups:

Checksum:

Msg 3189, Level 16, State 1, Line 1

Damage to the backup set was detected.

Msg 3013, Level 16, State 1, Line 1

VERIFY DATABASE is terminating abnormally.

Torn Page Detection:

The backup set on file 1 is valid.

 

None:

The backup set on file 1 is valid.

 

Devemos saber que o tipo de verificação da página não está diretamente

relacionado aos backups que foram realizados. O erro da verificação do backup

com  checksum só ocorreu porque na opção do backup eu especifiquei WITH

INIT, CHECKSUM ou seja aqui eu peço para que ele calcule um checksum

para o backup, sendo assim quando eu realizei a alteração do backup no editor,

o checksum já não é o mesmo que o calculado quando o backup foi

realizado pelo SQL Server, por isso o erro acontece.

 

4. Após termos verificado todos os backups, vamos agora fazer o restore dos bancos de dados 

–Restore Database – NONE

RESTORE DATABASE AdventureWorksNONE

FROM DISK = ‘C:\temp\AdventureWorksNONE.BAK’

WITH RECOVERY, STATS,

      MOVE ‘AdventureWorks_Data’ TO ‘C:\temp\AdventureWorks_Data1.mdf’,

      MOVE ‘AdventureWorks_Log’ TO ‘C:\temp\AdventureWorks_Log1.ldf’

  

Processed 21560 pages for database ‘AdventureWorksNONE’, file ‘AdventureWorks_Data’ on file 1.
Processed 1 pages for database ‘AdventureWorksNONE’, file ‘AdventureWorks_Log’ on file 1.
RESTORE DATABASE successfully processed 21561 pages in 5.124 seconds (32.873 MB/sec).

 

–Restore Database – TORN_PAGE_DETECTION

RESTORE DATABASE AdventureWorksTORN_PAGE_DETECTION

FROM DISK = ‘C:\temp\AdventureWorksTORN_PAGE_DETECTION.BAK’

WITH RECOVERY, STATS,

      MOVE ‘AdventureWorks_Data’ TO ‘C:\temp\AdventureWorks_Data.mdf’,

      MOVE ‘AdventureWorks_Log’ TO ‘C:\temp\AdventureWorks_Log.ldf’

 

Processed 21560 pages for database ‘AdventureWorksTORN_PAGE_DETECTION’, file ‘AdventureWorks_Data’ on file 1.
Processed 1 pages for database ‘AdventureWorksTORN_PAGE_DETECTION’, file ‘AdventureWorks_Log’ on file 1.
RESTORE DATABASE successfully processed 21561 pages in 5.184 seconds (32.493 MB/sec)

 

–Restore Database – CHECKSUM

RESTORE DATABASE AdventureWorksCHECKSUM

FROM DISK = ‘C:\temp\AdventureWorksCHECKSUM.BAK’

WITH RECOVERY, STATS,

      MOVE ‘AdventureWorks_Data’ TO ‘C:\temp\AdventureWorks_Data2.mdf’,

      MOVE ‘AdventureWorks_Log’ TO ‘C:\temp\AdventureWorks_Log12.ldf’

 

10 percent processed.
20 percent processed.
Msg 3183, Level 16, State 1, Line 2
RESTORE detected an error on page (1:5555) in database “AdventureWorksCHECKSUM” as read from the backup set.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

 

Como o backup está corrompido, então não conseguimos fazer o restore desse backup, e agora? Agora utilizamos uma opção de restore CONTINUE_AFTER_ERROR que irá fazer com que todos os erros encontrados sejam colocados na tabela msdb.dbo.suspect_pages.

 

Novo Restore da Base:

RESTORE DATABASE AdventureWorksCHECKSUM

FROM DISK = ‘C:\temp\AdventureWorksCHECKSUM.BAK’

WITH RECOVERY, STATS, CONTINUE_AFTER_ERROR,

      MOVE ‘AdventureWorks_Data’ TO ‘C:\temp\AdventureWorks_Data2.mdf’,

      MOVE ‘AdventureWorks_Log’ TO ‘C:\temp\AdventureWorks_Log12.ldf’

 

Processed 21560 pages for database ‘AdventureWorksCHECKSUM’, file ‘AdventureWorks_Data’ on file 1.
Processed 1 pages for database ‘AdventureWorksCHECKSUM’, file ‘AdventureWorks_Log’ on file 1.
Damage to the backup set was detected.
RESTORE WITH CONTINUE_AFTER_ERROR was successful but some damage was encountered. Inconsistencies in the database are possible.
RESTORE DATABASE successfully processed 21561 pages in 4.851 seconds (34.723 MB/sec).

 

Rodando o CheckDB:

Msg 8928, Level 16, State 1, Line 1
Object ID 1758629308, index ID 4, partition ID 72057594054180864, alloc unit ID 72057594056933376 (type In-row data): Page (1:5555) could not be processed.  See other errors for details.
Msg 8939, Level 16, State 98, Line 1
Table error: Object ID 1758629308, index ID 4, partition ID 72057594054180864, alloc unit ID 72057594056933376 (type In-row data), page (1:5555). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed. Values are 63047689 and -4.

 

Tabela msdb.dbo.suspect_pages:

image

 

Nesse momento, temos o banco de dados restaurado, porém sabemos que há uma página corrompida no banco de dados.

E para tentar solucionar esse problema podemos:

  1. Ter uma estratégia de backup/restore  – Nesse caso precisamos de uma rotina contendo backup de log.
  2. O CHECKDB em alguns casos pode ajudar, dependendo do erro.
  3. Verifique o eventlog e veja se encontra alguma informação que possa ajudar.
  4. Se o problema for de hardware, substitua.
Posted in: Script's