Horário de Verão x SQL Server
Fala Pessoal,
O que vocês fazem com seus jobs do SQL Server no inicio e no fim do horário de verão?
Essa semana eu fiz alguns um teste de homologação em uma VM para comprovar o que exatamente acontece com os Jobs do SQL Server.
A regra do horário de verão é a seguinte:
Art. 1o Fica instituída a hora de verão, a partir de zero hora do terceiro domingo do mês de outubro de cada ano, até zero hora do terceiro domingo do mês de fevereiro do ano subseqüente, em parte do território nacional, adiantada em sessenta minutos em relação à hora legal.
Parágrafo único. No ano em que houver coincidência entre o domingo previsto para o término da hora de verão e o domingo de carnaval, o encerramento da hora de verão dar-se-á no domingo seguinte.
Fonte: http://www.planalto.gov.br/ccivil_03/_ato2007-2010/2008/decreto/d6558.htm
No meu ambiente, os servidores já atualizam a hora automaticamente na ida e na volta do horário de verão (configuração da galera da infra).
Para homologar o que acontece com os Jobs agendados no SQL Server, as seguintes estruturas foram criadas:
Uma tabela para armazenar o insert do Job:
CREATE TABLE [dbo].[Teste_Horario_Verao](
[Cod] [int] IDENTITY(1,1) NOT NULL,
[Data] [datetime] NOT NULL default(getdate()),
[Texto] [varchar](8000) NULL)
Um job que roda a cada 10 minutos no servidor conforme pode ser visto abaixo:
Esse job executa a seguinte query:
insert into Teste_Horario_Verao(texto)
select ‘Teste Horario de Verao – Job a cada 10 minutos’
1 – Homologando o início do Horário de Verão
No início do horário de verão, o horário do servidor muda de 00:00h para 01:00h.
Às 12:25h (simulando 00:00h) alterei o horário do servidor manualmente para 12:35h (simulando 01:00h). Nesse momento, o job que seria executado às 12:30h (vide figura anterior) foi executado imediatamente e sua próxima execução foi alterada para às 12:40h conforme pode ser conferido abaixo:
Fazendo um select na tabela, conferimos que a execução das 12:30h não aconteceu, mas o job foi executado às 12:35h:
Ou seja, quando o horário de verão adianta o horário do servidor, os jobs que iriam ser executados nesse intervalo são iniciados automaticamente.
Problemas que podem acontecer:
- Pode haver uma sobrecarga no servidor caso muitos jobs sejam executados juntos.
- Caso exista um job que rode a cada 10 minutos, ele só será executado uma vez, e não as 6 vezes como aconteceria normalmente.
2 – Homologando o fim do horário de verão
No início do horário de verão, o horário do servidor muda de 00:00h para 23:00h.
O job foi executado às 13:00h conforme abaixo:
Às 13:05h (simulando 00:00h) a hora do servidor foi alterada para 12:55h (simulando 23:00h).
Dando um refresh no job monitor, não temos nenhuma alteração:
Dando um select no banco, nenhum registro foi inserido:
O job manteve o seu Next Run para às 13:10h.
Quando a hora do servidor chegou novamente às 13:00h, o job não foi executado novamente.
Após às 13:10 podemos ver que o job foi executado normalmente.
Ou seja, quando o horário de verão atrasa o horário do servidor, os jobs que estão nesse intervalo não são executados mais do que uma vez.
Problemas que podem acontecer:
- Caso exista um job que rode a cada 5 minutos, esse job ficará uma hora sem rodar. Se ele for um job que faça backup do log e sua base tiver muita alteração, corre o risco de acontecer um transaction log full. A única solução que vejo é executá-lo manualmente.
- Os inserts com getdate() não ficam sequenciais pois pode acontecer um insert às 23:50h e após a volta do horário, outro insert acontecerá às 23:10h.
Uma possível solução para o problema dos inserts com getdate(), seria a utilização de um fuso horário que não seja afetado pelo horário de verão (UTC – Universal Coordinated Time ). Neste caso, o controle da hora seria feito, por exemplo, com uma função que verifica se a hora corrente deve ser alterada em uma hora (período de horário de verão) ou não.
Artigos referências para serem verificados:
Caso encontrem outros problemas relacionados ao horário de verão, comentários são bem vindos.
Gostou desse Post?
Cadastre seu e-mail para receber novos Posts e curta minha Página no Facebook para receber Dicas de Leituras e Eventos sobre SQL Server.
Abraços,
Fabrício Lima
MCITP – Database Administrator
Consultor e Instrutor SQL Server
Trabalha com SQL Server desde 2006
Fabricio, este comportamento de executar os jobs automaticamente quando o servidor avança o horário afeta todas as versões do SQL Server? Ou apenas as versões mais novas?
Olá João Paulo,
Esse KB da microsoft fala sobre SQL Server 2000 e 2005:
http://support.microsoft.com/kb/931975/pt-br
Entretanto, meus testes foram realizados no SQL Server 2008 R2.
Eu acho que serve até para a versão do sql server 2000, mas não posso te dar certeza pois não homologuei essa informação.
Abraços.
Fabricio,
Mas é uma boa pratica para o servidor ou nao é necessrio?
Obrigado
Helber
Fala Helber,
No meu caso que expliquei no post eu não vou fazer nada pois não é necessário.
Abraços
Fabricio,
Boa noite.
Minha duvida é porque não encontro nenhum documento Microsof dizendo se é necessario parar a instancia ou nao no retorno do horario de verão.
Os servidores Oracle eu paro as 23:59 e a aguardo 1 hora para restartar o banco. Queria daber se com a instancia SQL seria importante fazer o mesmo procedimento?
Muito Obrigado
Abraços
Helber
Desculpa a demora Helber,
Foi exatamente isso que eu testei no post. No meu caso não será preciso fazer nada e eu tenho vários jobs que rodam entre 23:00 e 01:00.
O único documento da microsoft para o horário de verão que eu encontrei foi o que coloquei o link no post.
Valeu.
Fabricio,
Tambem nao encontrei nada, mas no ano passado no retorno do horarop de verão nao parei nada e nao tive problemas, a mudança foi transparente.
Muito obrigado
Abraços
Helber
Bom dia Fabricio;
Sabe algo relacionado a Mirroring, será que pode ter algum impacto?
Abs.
Olá Ricardo. Não fiz nenhum teste como esse, mas teoricamente não era para dar nenhum problema pois o Database Mirroring não depende do horário do servidor.
Abraços
Minha duvida é se tem como eu fazer dois jobs com o mesmo horário sendo que são bancos de dados Diferentes (1º banco : syspdv e 2º banco : fortes)!!
Vlw Abraço !!