Ignorar backup de log se o backup completo estiver em execução

3

Em alguns dos meus servidores SQL2000, tenho bloqueios ocasionais e conflitos estranhos entre nossas tarefas de backup completo e de backup de log. Com base em As respostas a essa pergunta do SF , preciso descobrir como impedir que meus backups de arquivos de log sejam executados enquanto meus backups completos estiverem em execução no mesmo banco de dados. (Parece que isso foi alterado no SQL2005, então não deve ser um problema para eles.)

Duas estratégias me ocorrem:

  1. Antes de executar toda a tarefa de backup de log, consulte as tabelas de histórico de tarefas do MSDB para ver se a etapa de backup (etapa 3 de 5) da tarefa de backup completo noturno está em execução no momento. Se estiver, ignore o backup de log para todos os bancos de dados.

  2. Dentro do script de tarefa de backup de log, antes de executar um backup de log em um banco de dados individual, consulte as tabelas sysprocess (ou algo) para ver se um BACKUP LIGHTSPEED já está ocorrendo para esse banco de dados específico. Se estiver, pule o backup de log apenas naquele banco de dados.

O primeiro seria muito mais fácil de implementar, mas acabaria pulando muitos bancos de dados que provavelmente poderiam fazer backup sem nenhum problema (possivelmente permitindo que os logs crescessem demais). O segundo é mais atraente, mas não sei exatamente como determinar se um backup está em andamento para um banco de dados específico.

Além disso, com a segunda opção há uma pequena chance de que o backup COMPLETO possa começar a fazer backup de um banco de dados no qual o backup de log já está trabalhando, a menos que eu adicione o mesmo tipo de "check code" ao script de backup completo. (Obviamente, eu quero o total para ter prioridade sobre o trabalho de backup de log)

Alguém já possui um script SQL 2000 que já faz isso? Qual abordagem faz mais sentido considerar? Ou existem outras alternativas?

    
por BradC 19.08.2009 / 16:20

2 respostas

2

A solução que eu gosto de usar (já que não gosto de ativar e desativar trabalhos, pois isso pode deixar os trabalhos desabilitados se houver problemas) é consultar a tabela sysprocesses procurando por um backup. Procure uma consulta que execute o db_id = o banco de dados que você está fazendo backup e o comando BACKUP DATABASE. Seu passo seria algo como isto.

IF EXISTS (SELECT *
           FROM master.dbo.sysprocesses
           WHERE dbid = db_id('YourDatabase')
                 AND cmd LIKE 'BACKUP DATABASE%')
BEGIN
     RAISERROR('The full backup is still running.', 16, 1)
END

Para quando você precisar se preocupar com backups completos em execução enquanto um backup de log estiver sendo executado, use algo como isto.

WHILE EXISTS (SELECT * FROM master.dbo.sysprocesses WHERE dbid = db_id('YourDatabase')
                     AND cmd LIKE 'BACKUP DATABASE%')
BEGIN
     WAITFOR DELAY '00:01:00'
END
    
por 20.08.2009 / 08:54
2

Também encontrei esse problema no SQL Server 2000.

O que eu fiz foi a primeira etapa da tarefa em um backup completo era executar sp_update_job na tarefa de backup de log com @ enable = 0 para desativar a tarefa.

A última etapa da tarefa de backup completo, bem-sucedida ou não, foi ativar a tarefa de backup de log novamente.

Nas raras ocasiões em que todas as luas se alinhavam, o backup de log seria executado quando o backup completo era iniciado e o backup de log falhava, mas pelo menos não continuaria tentando.

    
por 19.08.2009 / 16:37