segunda-feira, 16 de maio de 2011

#6 - SQL + TSM

Recentemente aqui na empresa a equipe responsável pelo TSM , entrou em contato avisando que os backups diferenciais(incrementais) que ocorre durante a noite estavam apresentando erros em alguns DB porque não tinha o backup full como parâmetro. Como o job que faz o backup full só roda no sábado precisamos evitar que esse tipo de erro ocorra, pois durante o dia novo bancos podem ser criados ou restaurados, para resolver o problema pesquisei algumas informações sobre o banco "MSDB" e vi que existe todo o relatório de backups realizados e ai começou o desenvolvimento da solução.

Primeiro passo, desenvolvemos um arquivo (busca_fullDB.sql) que consegue verificar quais bancos estão faltando bakcup full nos últimos 6 dias e manda o comando para o TSM os parâmetros para execução.
--Declaração de variáveis necessárias
DECLARE @CMDSQL VARCHAR(1000)
DECLARE @Dt_Referencia datetime

--Recebe o valor do dia -1
SELECT @Dt_Referencia = cast(floor(cast(GETDATE() as float))-1 as datetime) -- Hora zerada

--Monta a lista de bancos que tem backup full nos últimos 6 dias.
SELECT database_name, name,Backup_start_date, datediff(mi,Backup_start_date,Backup_finish_date) [tempo (min)],
server_name,recovery_model, cast(backup_size/1024/1024 as numeric(15,2)) [Tamanho (MB)]
into #tmp_bck
FROM msdb.dbo.backupset B
INNER JOIN msdb.dbo.backupmediafamily BF ON B.media_set_id = BF.media_set_id
where Backup_start_date >= dateadd(hh, 18 ,@Dt_Referencia - 6 ) --backups realizados a partir das 18h de ontem
and Backup_start_date < dateadd (day, 1, @Dt_Referencia)
and type = 'D'
order by 3;

--mostra a lista de servidores que não tem backup full
DECLARE db_cursor CURSOR FOR
select CAST(SERVERPROPERTY('Servername') AS varchar(100)) AS Server, name, database_id from sys.databases where database_id not in (1,2,3,4)
and name not in (select database_name from #tmp_bck)

DECLARE @Dbname VARCHAR(100)
DECLARE @Servername VARCHAR(100)
DECLARE @database_id INT

OPEN db_cursor;

FETCH NEXT FROM db_cursor
INTO @Servername,@Dbname, @database_id
WHILE @@FETCH_STATUS = 0
BEGIN
--linha que passa o DB para o TSM executar o backup full
SET @CMDSQL = ' F:\tsmdata\sql_full_bases.bat ' + @Dbname + ' '+ @Servername
EXEC master..xp_CMDShell @CMDSQL
FETCH NEXT FROM db_cursor INTO @Servername,@Dbname, @database_id;
END
CLOSE db_cursor
DEALLOCATE db_cursor

drop table #tmp_bck

Segundo Passo, no arquivo .bat do TSM mude os parâmetros:

%sql_dir%\tdpsqlc backup %1 full /tsmoptfile=f:\tsmdata\dsm.opt /sqlserver=%2 /logfile=f:\tsmdata\sql_full_bases.log /logprune=30

como no arquivo sql a chamada do arquivo .bat passa dois parâmetros para receber os valores é preciso colocar %1 e 2%, se você precisar passar mais parâmetros basta adicionar %n.

A execução do sql pode ser feito através de um JOB do sql ou via control-m, lembrando que pelo control-m precisa criar um outro arquivo .bat pois ele não executa diretamente arquivos .sql

Nenhum comentário:

Postar um comentário