Índice do fórum Treinamentos Avançados Treinamento Oracle Tuning - SQL PURGE TRANSACTION

PURGE TRANSACTION

Dúvidas, dicas e atualizações sobre o Treinamento Oracle Tuning - SQL.

Mensagem Ter Dez 06, 2016 5:55 pm

Mensagens: 0
Pessoal,
vira e mexe tenho que limpar algumas transações distribuídas que ficam retidas na DBA_2PC_PENDING. Antes de começar a limpar mudo o parametro: "_smu_debug_mode" = 4, e depois executo o ROLLBACK FORCE 'XX.XXXX.XX' + DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('XXX.XXXX.XXX'). Após isso procedo com o commit e vejo que a sessão foi expurgada. Faço um select novamente na DBA_2PC_PENDING e vejo que foram limpas.

O problema é que eu tenho esse trabalho praticamente toda semana. É viável colocar um job para fazer isso automaticamente ou tem algum parâmetro que já mata essas transações? Eu queria mesmo descobrir a causa raiz, pelos relatos na internet são problemas relacionados á rede e componentes antigos que por algum motivo finalizam a transação.

Tem algum problema em deixar o SMU_DEBUG_MODE como 4?

Mensagem Qua Dez 14, 2016 9:34 am
portilho Site Admin

Mensagens: 482
A causa raiz geralmente é um problema de rede entre os bancos. Os parâmetros do SQLNET.ORA dos dois lados devem estar de acordo com o ambiente para evitar TIMEOUTs.
Veja também seus parâmetros OPEN_LINKS, OPEN_LINKS_PER_INSTANCE, e DISTRIBUTED_LOCK_TIMEOUT.

Por que você precisa do SMU_DEBUG_MODE?

Eu acho que poderia automatizar sim. Faz uma Procedure que pegue o FAIL_TIME maior que SYSDATE-1, por exemplo, e já faz o ROLLBACK FORCE e DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY.

Mensagem Sex Dez 23, 2016 5:39 pm

Mensagens: 0
Portilho, vi que de vez em quando róla uns timeouts na rede, então de fato isso pode ser a causa raiz, criei um job para fazer isso todo domingo:

declare
xid varchar2(22);
begin
for c1 in (select LOCAL_TRAN_ID FROM DBA_2PC_PENDING) loop
dbms_transaction.PURGE_LOST_DB_ENTRY(c1.LOCAL_TRAN_ID);
commit;
end loop;
end;

Isso já resolve meu problema, o estranho é que quando essa transação cai, se você rodar o mesmo comando ele fala que o recurso está retido pela transação distribuída:
--[1]: (Error): ORA-01591: bloqueio retido pela transação distribuída 3975.8.24398

Quando essa transação cai inesperadamente, os blocos ou registros ficam presos até que eu limpe-a? Essa transação 3975.8.24398 impediu um select rodar até que eu achei a solução e limpei.

Mensagem Qui Dez 29, 2016 2:26 pm
portilho Site Admin

Mensagens: 482
Aumente o parâmetro DISTRIBUTED_LOCK_TIMEOUT, o padrão dele é 60 segundos, e acompanhe se estas ocorrências diminuem.
E sim, se esta transação possuía recursos bloqueados (Lock), eles continuarão bloqueados até que a transação seja finalizada.


Voltar para Treinamento Oracle Tuning - SQL

cron