Páginas

22 de fev. de 2020

Como evitar os erros ORA-12801 + ORA-00600:[qertqiFetch:Already Done] em Parallel Query



Olá pessoal,

     Há pouco mais de 3 meses um determinado usuário me ligou porque estavam ocorrendo os erros ORA-12801 + ORA-00600:[qertqiFetch:Already Done] (ver Imagem 01) ao executar uma determinada funcionalidade de uma aplicação desktop que ele utilizava. Pesquisando sobre estes erros no MOS vi que se tratava de mais um bug no Oracle 12cR2, identificado pelo número 24380576, e que já havia um patch para corrigi-lo, mas não ainda para o Release Update que estava aplicado no Banco de Dados de Produção em que o erro havia ocorrido. 

     O que fiz então? Abri um SR no MOS, mandei os arquivos de trace solicitados, alert log, detalhes do SQL (uma instrução SELECT bem grande e complexa) e do seu Plano de execução, e depois de algumas semanas a Oracle me respondeu que iria desenvolver um patch para a versão do meu Release UpdateProblema: Eu, muito menos o usuário, não poderíamos ficar aguardando essa demorada resposta e uma solução definitiva dada pela Oracle (o patch ficou pronto há aprox. 2 semanas atrás). O doc no MOS correspondente ao Bug 24380576 dizia o seguinte:

This bug is only relevant when using Parallel Query (PQO)
ORA-600[15570] or ORA-600[qertqiFetch:Already Done] when there is parallel nested loop join and there is UNPIVOT at the right side. 

Workaround
None.

     Entendendo então que o erro ocorre somente em Parallel Queries e que a Oracle não tinha nenhuma solução de workaround, o que fiz para contornar o problema? Simples! Por se tratar de um bug que só ocorre em instruções SELECT que utilizam paralelismo, desabilitei o recurso Parallel Query na sessão do usuário, e ele conseguiu finalmente executar a devida funcionalidade em sua aplicação. Depois disso ele se tornou  uma pessoa feliz novamente (essa segunda parte eu não tenho certeza, é apenas uma suposição.. rsrsrs)

Imagem 01 - Tela de erro apresentada na aplicação

     Seguem abaixo mais detalhes sobre o erro:
ORA-600: internal error code, arguments: [15570], [1], [0], [3] or ORA-600[qertqiFetch:Already Done]

     Segue abaixo (em vermelho) o comando SQL que foi executado para desabilitar Parallel Query na sessão do usuário, incluso numa trigger de logon com código "resumido e simplificado" para este artigo:

create or replace TRIGGER TR_LOGON_ALL
AFTER LOGON ON DATABASE
DECLARE
  V_MODULE VARCHAR2(100) := UPPER(SYS_CONTEXT('USERENV', 'MODULE'));
  V_USER VARCHAR2(30) := USER;
BEGIN
--------------------------------------------------------------------------------
-- TRIGGER: TR_LOGON_ALL
--------------------------------------------------------------------------------
-- Data: 28/04/2014
-- Nome: Fábio Prado
-- Descrição: Trigger para carregar configurações diferenciadas nas sessões de usuários específicos
--------------------------------------------------------------------------------
    --Código para carregar configurações diferenciadas nas sessões de usuários especificos
    IF V_USER = 'XXX' and V_MODULE = 'YYY' THEN  -- substitua XXX pelo nome da conta do usuário desejado e YYY pelo nome da aplicação
       EXECUTE IMMEDIATE 'alter session disable parallel query';
    END IF;
end;

Por hoje é só! Espero que tenha gostado!
[]s
  
  

2 comentários: