- Este tópico contém 14 respostas, 5 vozes e foi atualizado pela última vez 15 anos, 2 meses atrás por
hcamposcru.
-
AutorPosts
-
17 de dezembro de 2010 às 2:50 pm #97337
hcamposcru
ParticipanteBom 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
17 de dezembro de 2010 às 3:05 pm #97338rwarstat
ParticipanteHudson,
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,
Roberto17 de dezembro de 2010 às 4:07 pm #97339hcamposcru
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) ISV_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')
)
LOOPV_HOUR := R_HIST."HOUR"; V_STATE := R_HIST.STATE; V_COUNT := R_HIST."COUNT";END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THENNULL;END;
17 de dezembro de 2010 às 4:20 pm #97340rwarstat
ParticipanteO 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,
Roberto17 de dezembro de 2010 às 4:21 pm #97341ramasine
ParticipanteOlá,
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
17 de dezembro de 2010 às 4:31 pm #97344hcamposcru
ParticipanteComo 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.
17 de dezembro de 2010 às 4:34 pm #97345leandrolbs
ParticipanteQuem é o dono da procedure?. Quando vc roda o insert na mão o usuário é igual o dono da procedure?.
17 de dezembro de 2010 às 4:40 pm #97346hcamposcru
ParticipanteO usuário é o mesmo. tanto para quando eu rodo o insert na mão quanto na procedure.
17 de dezembro de 2010 às 4:45 pm #97348rwarstat
ParticipanteHudson,
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) ISV_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')
)
LOOPV_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,
Roberto17 de dezembro de 2010 às 4:49 pm #97349hcamposcru
ParticipanteOk, Roberto.
Vou tentar aqui e depois te falo.
Muito obrigado pela atenção.
17 de dezembro de 2010 às 4:58 pm #97350hcamposcru
ParticipanteRoberto, 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.
17 de dezembro de 2010 às 5:28 pm #97355rwarstat
ParticipanteBom 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,
Roberto17 de dezembro de 2010 às 6:22 pm #97360ramasine
ParticipanteColoca esses DBA’s para trabalhar !!!! 🙂
23 de dezembro de 2010 às 7:37 am #97423hudsona
ParticipanteChará
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.
28 de dezembro de 2010 às 4:27 pm #97465hcamposcru
ParticipanteE ai Chará beleza?
Valeu pela dica. Vou tentar fazer isso aqui…
Obrigado.Abraço
-
AutorPosts
- Você deve fazer login para responder a este tópico.