Pular para o conteúdo
  • Este tópico contém 14 respostas, 5 vozes e foi atualizado pela última vez 15 anos, 2 meses atrás por hcamposcru.
Visualizando 15 posts - 1 até 15 (de 15 do total)
  • Autor
    Posts
  • #97337
    hcamposcru
    Participante

      Bom dia!

      Estou com um problema que é o seguinte: todos os dias roda uma procedure feita para atender uma demanda aqui da empresa, porém uma ou duas vezes no mês acontece um erro no banco onde quebra o processo da rotina gerando sérios problemas no sistema no qual precisa dessa rotina para popular uma determinada tabela.
      Bom o que eu preciso é saber se tem como eu rodar uma consulta ou executar algum processo onde irá me mostrar se o banco caiu, se foi erro na procedure, alguma coisa me me lista os processos que ocorreu no banco no momento em que ocorreu o erro.

      Agradeço a atenção

      #97338
      rwarstat
      Participante

        Hudson,

        Qual a versão do banco que tu está executando? Em qual SO?
        Poderia começar dando uma olhada no alert.log. Com certeza se houve algo com o banco lá irá ter alguma coisa para começar a investigar.

        Abraço,
        Roberto

        #97339
        hcamposcru
        Participante

          [quote=”rwarstat”:3qx6nodx]Hudson,

          Qual a versão do banco que tu está executando? Em qual SO?
          Poderia começar dando uma olhada no alert.log. Com certeza se houve algo com o banco lá irá ter alguma coisa para começar a investigar.

          Abraço,
          Roberto[/quote]

          Roberto,
          A versão é Oracle 10g e o SO é o RED HAT.
          O problema aconteceu quando compilar uma procedure, pois apareceu o erro ORA-00942: table or view does not exist. O erro é nas linhas onde realiza os inserts abaixo:

          INSERT INTO TB_AJUSTA_PARAMETRO VALUE ( SELECT * FROM V$PARAMETER );
          INSERT INTO TB_AJUSTA_INSTANCIA VALUE ( SELECT * FROM V$INSTANCE );
          INSERT INTO TB_AJUSTA_HIST_ACTIVE VALUE ( SELECT * FROM DBA_HIST_ACTIVE_SESS_HISTORY ); .

          Agora se eu executar qualquer um dos insert fora da procedure, irá funcionar perfeitamente.

          O que acontece é que está ocorrendo um erro esporadicamente e ninguém nos fala que erro é esse. E nós precisamos saber que erro é esse pois está causando sérios problemas no nosso sistema.

          Abaixo segue a procedure que criei:


          create or replace
          PROCEDURE SP_AJUSTA_PARAMETROS (P_RETORNO VARCHAR2) IS

          V_HOUR VARCHAR2(10);
          V_STATE VARCHAR2(10);
          V_COUNT VARCHAR2(100);

          BEGIN

          INSERT INTO TB_AJUSTA_PARAMETRO VALUE ( SELECT * FROM V$PARAMETER );
          INSERT INTO TB_AJUSTA_INSTANCIA VALUE ( SELECT * FROM V$INSTANCE );
          INSERT INTO TB_AJUSTA_HIST_ACTIVE VALUE ( SELECT * FROM DBA_HIST_ACTIVE_SESS_HISTORY );

          FOR R_HIST IN (
          SELECT TO_CHAR(TRUNC((SAMPLE_TIME), 'HH'), 'HH24:MI') AS "HOUR",
          STATE,
          COUNT(*)/360 AS "COUNT"
          FROM (
          SELECT SAMPLE_TIME,
          SAMPLE_ID,
          CASE WHEN SESSION_STATE = 'ON CPU' THEN 'CPU'
          WHEN SESSION_STATE = 'WAITING' AND WAIT_CLASS IN('User I/O') THEN 'IO'
          WHEN SESSION_STATE = 'WAITING' AND WAIT_CLASS IN('Cluster') THEN 'CLUSTER'
          ELSE 'WAIT'
          END STATE
          FROM TB_AJUSTA_HIST_ACTIVE
          WHERE SESSION_TYPE IN('FOREGROUND')
          AND SAMPLE_TIME BETWEEN TRUNC(SYSDATE, 'HH') -25/24
          AND TRUNC(SYSDATE, 'HH') -1/24
          )
          GROUP BY TRUNC((SAMPLE_TIME), 'HH'), STATE
          ORDER BY TRUNC((SAMPLE_TIME), 'HH')
          )
          LOOP

          V_HOUR          := R_HIST."HOUR"; 
          V_STATE         := R_HIST.STATE; 
          V_COUNT         := R_HIST."COUNT"; 
          

          END LOOP;

          COMMIT;

          EXCEPTION
          WHEN OTHERS THEN

          NULL; 
          

          END;

          #97340
          rwarstat
          Participante

            O usuário que está executando a procedure tem permissão explícita nas 3 views onde está sendo feito o select?

            grant select on v$parameter to usuario_aqui;
            grant select on v$instance to usuario_aqui;
            grant select on v$DBA_HIST_ACTIVE_SESS_HISTORY to usuario_aqui;

            No caso do PL/SQL não adianta ter permissão via role, pois irá ser desconsiderado.

            Abraço,
            Roberto

            #97341
            ramasine
            Participante

              Olá,

              Ative os traces, se possuir ambiente de testes, faça o restore desta procedure e execute com o trace habilitado, depois verifique o resultado…onde está o stop point…

              Abraços

              #97344
              hcamposcru
              Participante

                Como eu não tenho acesso a criação de usuário eu não sei te falar se tem permissões. Sinceramente eu não entendi como que fora da procedure eu consigo realizar o insert.
                O usuário que eu tenho é um que foi criado para a aplicações desenvolvida acessar o banco.

                Agora você tem alguma idéia que eu possa fazer para pegar o erro que acontece e salvar em uma outra tabela?

                A rotina roda todas as madrugadas, um ou duas vezes no mês acontece algum problema, preciso fazer uma procedure para dispará-la assim que acontecer o erro na rotina.

                #97345
                leandrolbs
                Participante

                  Quem é o dono da procedure?. Quando vc roda o insert na mão o usuário é igual o dono da procedure?.

                  #97346
                  hcamposcru
                  Participante

                    O usuário é o mesmo. tanto para quando eu rodo o insert na mão quanto na procedure.

                    #97348
                    rwarstat
                    Participante

                      Hudson,

                      Faça o quê o Ramasine falou: ativa o trace e analisa onde ele está parando.

                      A questão de que fora da procedure funciona e dentro dela não é uma questão de como o engine do PL/SQL trata as permissões. Basicamente o PL/SQL não enxerga as roles. Já faz algum tempo que rolou por aqui uma discussão dessas, acho até que a dúvida era minha.

                      Modifiquei a tua exception para gravar a mensagem de erro em uma tabela. O campo para gravar a mensagem deve ser varchar2(4000).

                      create or replace
                      PROCEDURE SP_AJUSTA_PARAMETROS (P_RETORNO VARCHAR2) IS

                      V_HOUR VARCHAR2(10);
                      V_STATE VARCHAR2(10);
                      V_COUNT VARCHAR2(100);

                      BEGIN

                      INSERT INTO TB_AJUSTA_PARAMETRO VALUE ( SELECT * FROM V$PARAMETER );
                      INSERT INTO TB_AJUSTA_INSTANCIA VALUE ( SELECT * FROM V$INSTANCE );
                      INSERT INTO TB_AJUSTA_HIST_ACTIVE VALUE ( SELECT * FROM DBA_HIST_ACTIVE_SESS_HISTORY );

                      FOR R_HIST IN (
                      SELECT TO_CHAR(TRUNC((SAMPLE_TIME), 'HH'), 'HH24:MI') AS "HOUR",
                      STATE,
                      COUNT(*)/360 AS "COUNT"
                      FROM (
                      SELECT SAMPLE_TIME,
                      SAMPLE_ID,
                      CASE WHEN SESSION_STATE = 'ON CPU' THEN 'CPU'
                      WHEN SESSION_STATE = 'WAITING' AND WAIT_CLASS IN('User I/O') THEN 'IO'
                      WHEN SESSION_STATE = 'WAITING' AND WAIT_CLASS IN('Cluster') THEN 'CLUSTER'
                      ELSE 'WAIT'
                      END STATE
                      FROM TB_AJUSTA_HIST_ACTIVE
                      WHERE SESSION_TYPE IN('FOREGROUND')
                      AND SAMPLE_TIME BETWEEN TRUNC(SYSDATE, 'HH') -25/24
                      AND TRUNC(SYSDATE, 'HH') -1/24
                      )
                      GROUP BY TRUNC((SAMPLE_TIME), 'HH'), STATE
                      ORDER BY TRUNC((SAMPLE_TIME), 'HH')
                      )
                      LOOP

                      V_HOUR          := R_HIST."HOUR";
                      V_STATE         := R_HIST.STATE;
                      V_COUNT         := R_HIST."COUNT";
                      

                      END LOOP;

                      COMMIT;

                      EXCEPTION
                      WHEN OTHERS THEN
                      insert into tabela_log values (sqlerrm);

                      END;

                      Abraço,
                      Roberto

                      #97349
                      hcamposcru
                      Participante

                        Ok, Roberto.

                        Vou tentar aqui e depois te falo.

                        Muito obrigado pela atenção.

                        #97350
                        hcamposcru
                        Participante

                          Roberto, eu não tenho permissão para ativar a trace…
                          Acho que minha situação aqui está difícil, pois os DBAs daqui não nos passar o erro e eu não tenho como descobrir.

                          Acho que agora complicou.

                          Abraço.

                          #97355
                          rwarstat
                          Participante

                            Bom Hudson,
                            Nesse caso tu vai ter que falar com os DBA´s, explicar a situação para eles e pedir para que eles ativem o trace. Agora isso se transformou mais em uma questão interna de vocês, pois para todas as soluções aqui dadas vai ser necessário acesso de DBA ao banco.

                            Abraço,
                            Roberto

                            #97360
                            ramasine
                            Participante

                              Coloca esses DBA’s para trabalhar !!!! 🙂

                              #97423
                              hudsona
                              Participante

                                Chará

                                Da pra sair dessa de duas formas,

                                A primeira é ver se o teu usuario de S.O consegue ler o alert.ora, se ele consegue ler esse arquivo no servidor é só olhar o horario que o db entrou em shutdown, se realmente aconteceu isso.
                                A outra forma é criar um shell ou uma bat se for windows para ficar dando ps em um determinado range de tempo que roda seu processo, e ficar monitorando pra ver se o processo cai e se cair logar em alguma tabela.

                                Mas obvio que o melhor e mais indicado é atuar junto com a sua equipe de DBA.

                                #97465
                                hcamposcru
                                Participante

                                  E ai Chará beleza?

                                  Valeu pela dica. Vou tentar fazer isso aqui…
                                  Obrigado.

                                  Abraço

                                Visualizando 15 posts - 1 até 15 (de 15 do total)
                                • Você deve fazer login para responder a este tópico.