Configurando Transações Two-phase Commit Distribuídas com o RAC Oracle

As configurações de Real Application Cluster (RAC) possuem um problema inerente com o gerenciador de transações quando o Oracle tenta recuperar transações distribuídas de duas fases que abrangem sobre vários nós do Oracle RAC. Pode ocorrer um problema quando um nó falha e o Oracle abre os outros nós ativos para o negócio antes que o RAC Oracle conclua a ação de recuperação necessária para o nó que falhou. A capacidade de o servidor de aplicativo manter a afinidade da transação permite que você resolva esse problema.

Sobre esta Tarefa

Erros podem ocorrer quando o processo de recuperação tenta confirmar ou recuperar uma ramificação da transação por meio de um nó do RAC anteriormente ativo mas que falha posteriormente. O gerenciador de transação receberia a seguinte exceção:
ORA- 24756: transaction does not exist
Se esse erro fosse encontrado, o administrador do banco de dados Oracle poderia precisar resolver manualmente a transação incerta forçando um processo de recuperação ou confirmação. Se você não quisesse uma intervenção manual, no entanto, poderia configurar uma estratégia automática e transparente para a recuperação da transação.
Se a transação incerta não fosse resolvida, todas as transações subseqüentes receberiam a seguinte exceção:
ORA-01591 lock held by in-doubt distributed transaction
O resultado é que as partes do banco de dados não poderão ser usadas.

A chave para uma estratégia de recuperação transparente é eliminar a possibilidade de uma transação global distribuir mais de uma ramificação da transação em vários nós RAC. Uma ramificação da transação corresponde a uma conexão com o banco de dados que está relacionada a uma transação global. Se todas as conexões em uma transação global two-phase commit originarem do mesmo nó, problemas de recuperação da transação deverão surgir. Configure um RAC Oracle com o servidor de aplicativo para evitar erros com as transações two-phase.

O servidor de aplicativos mantém a afinidade da transação para conexões recebidas e você pode beneficiar-se deste recurso para configurar a recuperação automática para o RAC Oracle com transações two-phase commit. Se você implementar esta configuração, todas as conexões de um determinado servidor de aplicativos serão recebidas do mesmo nó do Oracle e as conexões encerrarão nesse mesmo nó. Essa configuração evitará situações nas quais as transações distribuem vários nós e você não deverá ter problemas de recuperação se um ou mais nós do Oracle ficarem inativos.

Procedimento

  • É possível optar por resolver manualmente a transação indeterminada.
    1. Obtenha o ID da transação órfã.
      Emita o seguinte comando:
      sql > select state, local_tran_ID, Global_tran_Id from dba_2pc_pending where state = "prepared"
    2. Recupere todos os IDs da transação que estejam na fase preparada.
      sql > rollback force '';
  • Configure uma estratégia automática para a recuperação da transação.
    1. Crie um serviço Oracle que tenha apenas um nó primário.
      Criar o serviço com um nó primário garantirá que o balanceamento de carga seja desativado. Também é possível especificar um ou mais nós alternativos com o parâmetro -a.
      Execute este comando para criar o serviço:
      srvctl add service -d <database_name> -s <service_name> -r <primary nodes> -a <alternate_nodes>
    2. Ative o DTP (Distributed Transaction Processing) no serviço Oracle.
      O DTP foi primeiramente apresentado no Oracle 10gR2. Cada serviço DTP é um serviço singleton que está disponível em apenas uma instância do RAC Oracle.
      Execute este comando:
      execute dbms_service.modify_service (service_name => '<service_name>' , dtp => true);
    3. Configure cada membro do cluster em um servidor de aplicativos para usar o serviço DTP Oracle.

Resultados

Se você configurou uma estratégia de recuperação automática, o serviço DTP iniciará automaticamente na instância preferida. No entanto, se o banco de dados for reiniciado, o serviço DTP não iniciará automaticamente. É possível iniciar o serviço DTP usando este comando:
srvctl start service -d  -s
Se um nó RAC parar de funcionar, o Oracle não fará failover do serviço DTP até que a limpeza e a recuperação do RAC Oracle estejam concluídas. Mesmo que os nós do Oracle tenham backup, o serviço DTP Oracle não retornará para o nó RAC recentemente reiniciado. Ao contrário, você terá de mover o serviço manualmente para o nó RAC reiniciado.

Quando você configura o DTP no serviço Oracle, transfere o balanceamento de carga do provedor JDBC Oracle para o servidor de aplicativos. A carga de trabalho é distribuída pelo servidor de aplicativos e não pelo Oracle, por isso que você cria serviços que não implementam o balanceamento de carga e usam apenas um nó primário. Essa configuração impede situações nas quais os processos de transação distribuem vários nós RAC e suavizam problemas de recuperação que podem surgir quando um ou mais nós RAC falham.