Social Icons

18 de out de 2011

Ajustes no Oracle Database para o horário de verão

Olá pessoal,

     O artigo de hoje é bastante útil para os DBAs que administram bancos de dados Oracle e que precisam ajustar o horário de máquinas e bancos de dados quando começa ou acaba o horário de verão.
   
     Desde a versão 10G, a Oracle afirma que não é mais necessário reiniciar o BD após o ajuste das horas no SO e eu já fiz vários testes em laboratório que confirmam essa teoria, porém, consultando a Internet, encontrei relatos em vários blogs sobre BDs que tiveram problemas com o horário de verão, principalmente em seu término, quando ocorre o atraso da hora, portanto, para evitar possíveis problemas, execute os procedimentos  abaixo:
  
1- Configurando o timezone das horas do SO
    Existem inúmeras formas de você alterar as horas do SO para o horário de verão. A que eu conheço e que causa menor impacto, é configurar o time zone das horas do SO, conforme indicado no artigo Alterando para horário de verão. Este procedimento precisará ser executado apenas 1 única vez. Após executá-lo, se você optar por não restartar o BD será necessário pelo menos restartar as sessões de usuários, para que elas utilizem o novo timezone. 

2- Parando o Banco de Dados
     Executar o procedimento publicado pelo grande Rodrigo Almeida no artigo Horário de verão - Os impactos no banco de dados Oracle, é o método mais seguro para evitar que você tenha problemas com a alteração de horas. Ele é opcional, mas eu não deixaria de executá-lo se você puder parar os BDs, principalmente ao terminar o horário de verão.

3- Alterando o timezone do BD
     O timezone do BD não é ajustado automaticamente, somente as horas são ajustadas. Se você seguiu algum dos procedimentos indicados no item 1, você nem precisará ajustar o time zone do BD, pois o time zone do SO influenciará nas sessões do BD, portanto, ressalto de novo, não é necessário reiniciar o BD, mas você precisará, pelo menos, matar as sessões de usuário para que elas reiniciem pegando o novo timezone.
     Outro ponto importante é o time zone dos Scheduler Jobs existentes no Banco de Dados. Todo agendamento de Scheduler Jobs possui um time zone que deve estar sincronizado com as horas do servidor do Banco de Dados. Após ajustar o horário de um servidor, no caso de começar ou terminar o horário de verão no Brasil, o time zone dos Scheduler Jobs ficam diferentes do time zone do banco de dados (consequência da alteração do horário da máquina) e ele poderá executar 1 hora antes ou 1 hora depois da hora esperada. Para que isso não ocorra, ajuste o time zone dos Scheduler Jobs executando o script PL/SQL (com privilégios de DBA) que criei abaixo, que também poderá ser baixado a partir do MEU SKY DRIVE (ver painel direito da página do blog), pasta Oracle -> Scripts, arquivo correcao_timezone_schedulejobs.sql:

SET SERVEROUTPUT ON
DECLARE
    d_STARTDATE TIMESTAMP with time zone;
    d_NEWSTARTDATE TIMESTAMP with time zone;
    V_STARTHOUR VARCHAR2(10);
    v_newStartDate varchar2(30);
    v_timezone_hour VARCHAR2(6);
BEGIN
    DBMS_OUTPUT.ENABLE(NULL);
   
    -- recupera time zone atual da máquina
    SELECT TO_CHAR(SYSTIMESTAMP, 'TZR') INTO V_TIMEZONE_HOUR FROM DUAL;   
   
    --DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('log_history','90');
    DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone',V_TIMEZONE_HOUR);
   
    -- loop em jobs que possuem time zone diferente do time zone atual da maquina
    FOR CUR_ROW IN  ( SELECT  OWNER, JOB_NAME, START_DATE
                      FROM    DBA_SCHEDULER_JOBS
                      WHERE   TO_CHAR(SYSTIMESTAMP, 'TZR') <> TO_CHAR(NEXT_RUN_DATE, 'TZR'))
                      --AND     REPEAT_INTERVAL IS NOT NULL)
    LOOP   
        -- recupera data inicio
        DBMS_SCHEDULER.GET_ATTRIBUTE(CUR_ROW.OWNER || '.' || CUR_ROW.JOB_NAME, 'START_DATE', d_STARTDATE);
        V_STARTHOUR := TO_CHAR(D_STARTDATE, 'hh24:mi:ss');
        V_NEWSTARTDATE := TO_CHAR(SYSDATE,'dd/mm/yyyy ') || V_STARTHOUR || ' ' || V_TIMEZONE_HOUR;
        DBMS_OUTPUT.PUT_LINE('d_STARTDATE: ' || d_STARTDATE);
        DBMS_OUTPUT.PUT_LINE('v_newStartDate: ' || V_NEWSTARTDATE);
        D_NEWSTARTDATE := to_timestamp_tz(V_NEWSTARTDATE, 'dd/mm/yyyy hh24:mi:ss TZR');
        DBMS_OUTPUT.PUT_LINE('D_NEWSTARTDATE: ' || D_NEWSTARTDATE);      
                      
        -- atribui data inicio anterior reatribuindo time zone atual
        DBMS_SCHEDULER.SET_ATTRIBUTE(cur_row.OWNER || '.' || cur_row.JOB_NAME,'START_DATE',D_NEWSTARTDATE);
        DBMS_OUTPUT.PUT_LINE('Start Date Job ' || cur_row.owner || '.' || cur_row.job_name || ': ' || D_NEWSTARTDATE); 
    END LOOP;
EXCEPTION
  WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('Erro: ' || sqlerrm);
END;



Por hoje é só! Espero que o artigo te ajude!

[]s

2 comentários:

  1. Salientando que no passo 2- Parando o Banco de Dados, basta um "Stop/start para sincronizar com o novo horário" conforme comentário de 03/06/2012 do próprio Rodrigo Almeida.

    ResponderExcluir
    Respostas
    1. Antonio, obrigado pelo comentário, mas eu nunca arrisquei no término do horário de verão apenas dar shutdown/startup nos BDs.

      Já li nas documentações da Oracle algo informando que no BD não ocorrerá problemas em seu funcionamento se houver horários repetidos, pois o que importa o é o SCN, e este não se repetirá.

      O que eu sei que pode gerar problemas posteriormente são os seguintes itens:
      - Se vc precisar efetuar restaurações de backups naquele período de tempo que se repetiu (se vc não souber o SCN correto);
      - Jobs que podem ser executados 2 vezes por causa dos horários repetidos;
      - Dados das aplicações que podem gerar registros cadastrados em tempos diferentes mas com horas repetidas.

      []s

      Excluir

 

Meus últimos Links Favoritos

Suporte remoto alunos

Seguidores

Meu One Drive (antigo Sky Drive)