Social Icons

18 de out. de 2011

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


ATUALIZADO EM 07/11/2018

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 timezone 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. Recomendo utilizar o timezone "America/Sao Paulo" acrescentando no .bash_profile do usuário oracle o seguinte comando: export TZ=America/Sao_Paulo.

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 timezone do BD, pois o timezone 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 timezone dos Scheduler Jobs existentes no Banco de Dados. Todo agendamento de Scheduler Jobs possui um timezone 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 timezone dos Scheduler Jobs ficam diferentes do timezone 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 o ideal é utilizar um timezone que seja dinâmico, como por exemplo o timezone 'AMERICA/SAO_PAULO', que ajusta  automaticamente as horas quando começa ou termina o horário de verão. Uma vez configurado esse valor no SO teoricamente você não precisará mais se preocupar em configurá-lo também no Banco de Dados, pois ele herda o valor do SO em seu startup. Se você não tem esse valor configurado no SO sugiro corrigir o timezone dos Scheduler Jobs executando o script PL/SQL (com privilégios de DBA) que abaixo, que faz o ajuste do timezone default do BD para 'AMERICA/SAO_PAULO' e ajusta o timezone de todos os scheduler jobs existentes em seguida. Caso você more em outra região do Brasil, sugiro fazer uma consulta na visão V$TIMEZONE_NAMES para escolher um valor mais apropriada à sua região.
 
   
SET SERVEROUTPUT ON
DECLARE
    d_STARTDATE TIMESTAMP with time zone;
    d_NEWSTARTDATE TIMESTAMP with time zone;
    V_STARTHOUR VARCHAR2(100);
    V_nextHOUR VARCHAR2(100);
    v_newStartDate varchar2(100);
    v_timezone_hour VARCHAR2(100);
BEGIN
    DBMS_OUTPUT.ENABLE(NULL);
    
    -- define o valor de timezone para os jobs, atribuindo valor p/ a var V_TIMEZONE_HOUR:
    V_TIMEZONE_HOUR := 'AMERICA/SAO_PAULO';
    
    DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('log_history','90');
    -- altera timezone default do bd:
    DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('default_timezone',V_TIMEZONE_HOUR);
    
    -- loop em jobs que possuem time zone diferente do timezone escolhido
    FOR CUR_ROW IN  ( SELECT  *
                      FROM    DBA_SCHEDULER_JOBS
                      WHERE   REPEAT_INTERVAL IS NOT NULL
                      AND     TO_CHAR(NEXT_RUN_DATE, 'TZR') <> V_TIMEZONE_HOUR
                      )
    LOOP       
        -- atribui data inicio anterior reatribuindo timezone atual:
        begin
           -- 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);
            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);  
        EXCEPTION
          WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Erro no Job ' ||  cur_row.owner || '.' || cur_row.job_name || ': ' || sqlerrm);
        end;        
    END LOOP;
EXCEPTION
  WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE('Erro: ' || sqlerrm);
END;


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

[]s

2 comments:

  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

 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)