Como resolver ORA-14450: attempt to access a transactional temp table already in use Tabela temporária Oracle

Um erro que pode incomodar bastante durante a atualização de uma tabela temporária é o :

ORA-14450: attempt to access a transactional temp table already in use

A mensagem apesar de clara pode ser difícil de tratar caso você não consiga identificar e/ou derrubar todas as sessões conectadas. Dessa forma, caso deseje “forçar” a alteração de uma tabela desse tipo, siga os seguintes passos:

  1. Execute o comando
    lock table <SCHEMA>.<TABELA_TEMPORARIA> in exclusive mode;
  2. Desconecte da sessão e conecte novamente no Banco (Ex: utilizando Sql Tools ou PLSQL Developer)
  3. Após conectado execute a seguinte Query:
    SELECT * FROM v$lock WHERE id1 = (SELECT object_id FROM all_objects WHERE owner =<SCHEMA> AND object_name =<TABELA_TEMPORARIA>);
    
  4. Ao identificar uma linha nesse select, vamos proceder “matando” a sessão:
    ALTER SYSTEM KILL SESSION '<sid>,<serial#>';
  5. Depois de executado o comando KILL e confirmado sua execução com sucesso, você poderá executar o comando DDL desejado:
    ALTER TABLE <SCHEMA>.<TABELA_TEMPORARIA> MODIFY(COLUNA NUMBER (20,0));
  6. Por fim, libere o lock realizado no passo1 através do comando:
    rollback;

E só 😉



Conexão JDBC para Oracle RAC (Cluster)

Um cluster consiste em multiplos computadores interconectados ou servidores que têm como objetivo compartilhar/ processar requisições de usuários em aplicações para usuários finais. O Oracle RAC permite que um Database seja clusterizado e ele utiliza o Oracle Clusterware como infraestrutura para processar várias instances como um sistema único.

O ORACLE RAC (real application cluster) é uma solução de banco de dados em cluster que requer dois ou mais nós de hardware capazes de trabalhar juntos sob o controle de um sistema operacional. Se você precisa conectar uma aplicação java via JDBC a um banco Oracle RAC o formato clássico de String de conexão  não vai funcionar.

 jdbc:oracle:thin:@<HOST>:1521:<SID>

A string que deve ser utilizada para uma conexão Oracle RAC é

DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ENDERECO_HOST1)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=ENDERECO_HOST2)(PORT=1521))(LOAD_BALANCE=ON)(FAILOVER=ON))(CONNECT_DATA=(SERVICE_NAME=NOME_DO_SERVICE_NAME)(FAILOVER_MODE=(TYPE=select)(METHOD=basic)))

Para descobrir o NOME_DO_SERVICE_NAME , procure pelo arquivo tsnames.ora (geralmente localizado em C:\orant\NETWORK\ADMIN – Plataforma Windows)

Cada “Address” do Address_List representa um servidor de conexão, fique atento aos IP’s de cada Host!

 


Dica rápida: problema ao remover programas do Windows 7

Hoje passei por um problema chato. Ao tentar remover algumas versões do Java, o desinstalador do Windows estava sem embananando… e solicitando  pacotes .msi para continuar com a desinstalação… .Após algumas pesquisas, acabei encontrando um programinha da Microsoft chamado Fix It.

O Fix It diagnostica de forma automática problemas que podem impedir a instalação ou a desinstalação de programas no computador. Ele Ajuda no caso de programas que não são instalados corretamente e programas que impedem novas instalações de programas. 

Conforme orientação da Microsoft o programa corrige…
  • Remove uma chave de registro defeituosa em sistemas operacionais de 64 bits.
  • As chaves de registro do Windows que controlam os dados de atualização (patch) ficam corrompidas.
  • Resolve problemas que impedem a instalação de programas novos.
  • Resolve problemas que impedem a desinstalação completa de programas e bloqueiam novas instalações e atualizações.
  • Use esse solucionador de problemas em uma desinstalação somente se o programa não for desinstalado usando o recurso Adicionar ou Remover Programas do Windows.

microsoft-fixit

Download do Fixt It

ou através do link: http://support.microsoft.com/mats/Program_Install_and_Uninstall


Erro Oracle – ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

Dica simples para encontrar objetos locados no banco e matar sua sessão.

select a.sid, a.serial#
    from v$session a, v$locked_object b, dba_objects c
   where b.object_id = c.object_id
      and a.sid = b.session_id
      -- and OBJECT_NAME='NOME_OBJETO'; <-- Caso deseje UTILIZE O NOME DOBJETO PARA IDENTIFICAR O SEU SID E SERIAL

— APÓS IDENTIFICAR O SID E SERIAL… MATE A SESSAO

alter system kill session '105,294'; -- Ex: 105 (SID),294 (SERIAL)

Páginas:1234567...18