terça-feira, 13 de abril de 2010

Detectar Ausência de Backups em Produção

Versões do SQL Server: 7.0, 2000, 2005 e 2008.

Olá... Vou abordar um assunto simples, porém muito importante para “não abrir a vaga” do DBA: BACKUP.

Você precisa verificar se todos os bancos de dados dos servidores em produção estão com os backups em dia, o que fazer? Colocar simplesmente um alerta no JOB de backup para quando ocorrer uma falha não basta, porque pode existir um banco novo que ainda não tem JOB de backup... Ou então se o JOB de backup foi desabilitado?

Existe um método simples de verificar consultando a tabela backupset no banco de dados de sistema MSDB. Veja a consulta abaixo:

select b.database_name as Banco,b.backup_finish_date as UltimoBackup,
case b.[type]
when 'D' then 'Database'
when 'I' then 'Database Differential'
when 'L' then 'Log'
when 'F' then 'File or Filegroup'
end as TipoBackup -- b.*
from msdb.dbo.backupset b join
(select database_name, max(backup_finish_date) backup_finish_date
from msdb.dbo.backupset group by database_name) u
on b.database_name = u.database_name and b.backup_finish_date = u.backup_finish_date
where b.backup_finish_date < (getdate() - 2) or b.backup_finish_date is null order by b.database_name


A consulta acima retorna uma lista com os bancos de dados onde o último backup feito (não importa o tipo) é anterior a dois dias da data corrente.

Para obter a lista dos bancos de dados sem backup nos últimos 2 dias, basta comparar o resultado da consulta acima com a view sysdatabases, veja:

with BackupFeito as (
select b.database_name as Banco
from msdb.dbo.backupset b join
(select database_name, max(backup_finish_date) backup_finish_date
from msdb.dbo.backupset group by database_name) u
on b.database_name = u.database_name and
b.backup_finish_date = u.backup_finish_date
where b.backup_finish_date < (getdate() - 2) or b.backup_finish_date is null) select name as Banco from sysdatabases s where s.name not in('tempdb','model') and not exists (select * from BackupFeito b where b.Banco = s.name)


Basta rodar esta consulta em cada servidor para obter a listagem dos bancos de dados sem backup nos últimos 2 dias! Você pode automatizar utilizando Linked Server ou PowerShell. Se você estiver no SQL Server 2008 poderá utilizar o recurso de execução de scripts em múltiplas instâncias, veja no post:
http://sqlserver-brasil.blogspot.com/2008/03/executando-scripts-em-mltiplas.html.

Até o próximo post,
Landry

Um comentário:

Leo Matos disse...

Legal Landry,

Porém tive uma dúvida,
O correto no filtro da CTE BackupFeito não é:


where u.backup_finish_date < (getdate() - 2) or u.backup_finish_date is null)


O valor resgatado (que deve ser o primeiro) de b.backup_finish_date poderá ser o menor de todos, assim retornará todos.

Descupe-me caso esteja equivocado.

Abraços
Leonardo Matos