Olá pessoal,

Espero que estejam bem!

Faz um tempinho desde a minha última postagem, mas hoje vou compartilhar um problema que vocês pegamos num cliente que começou a utilizar Oracle RAC.

Esse problema ocorreu em setembro de 2024, com um cliente rodando a versão 19.24 do Oracle Database.

Resumo da história: construímos um RAC de 2 nós para suportar uma aplicação bancária/financeira. Durante os testes, enquanto a aplicação estava configurada para usar o SCAN, o cliente encontrou o seguinte erro:

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Esse erro indica que os serviços do banco de dados não estavam registrados nos SCAN Listeners.

Isso parecia estranho, já que toda a configuração estava aparentemente correta.

Revisamos toda a configuração e tudo parecia estar em ordem.

De acordo com os padrões do cliente, eles não utilizavam o parâmetro de inicialização REMOTE_LISTENER com o estilo EZCONNECT. Em vez disso, utilizavam uma entrada no arquivo tnsnames.ora.

Decidimos, então, habilitar o trace para o processo LREG e verificar o que estava acontecendo.

Nota: O comando abaixo só funciona no Oracle 18c ou versões superiores:

Conectado com um usuário privilegiado (DBA), execute os seguintes comandos para habilitar o trace do LREG:

alter system set events=’trace[LREG] disk highest’;

alter system set events=’immediate trace name LREG_STATE level 3′;

alter system register;

Após isso, será possível encontrar um arquivo de trace para o processo LREG, por exemplo:

/u01/app/oracle/diag/rdbms/db_rac/PREPROD2/trace/PREPROD2_lreg_21024.trc

Aqui está uma saída resumida para facilitar a leitura:

#—————————————-

Remote listeners:
0 - (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scan.client.org)(PORT=1522))) pdb 0 dci 0 flg 0x22
firewall=0, publish_service_acl=0
state=1, err=0
nse[0]=0, nse[1]=0, nte[0]=0, nte[1]=0, nte[2]=0
ncre=0
endp=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scan.client.org)(PORT=1522)))
flg=0x0 nse=12542 pri=0x7ff727ded770
1 - (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scan.client.org)(PORT=1521))) pdb 0 dci 0 flg 0x22
firewall=0, publish_service_acl=0
state=1, err=0
nse[0]=0, nse[1]=0, nte[0]=0, nte[1]=0, nte[2]=0
ncre=0
endp=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scan.client.org)(PORT=1521)))
flg=0x0 nse=12542 pri=0x7ff727ded1c0

#—————————————-

No trace, notamos a seguinte string:

nse=12542

No trace, notamos a seguinte string:

ORA-12542: TNS:address already in use

No trace, notamos a seguinte string:

Após algumas pesquisas, encontramos uma nota que explicou o problema:

———–

The error nse=12542 occurred because PMON did not interpret the hostname "scan" into 3 unique ip addresses.

———–

A entrada TNS que o cliente usava era essa:

SCAN_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = scan.client.org)(PORT = 1521))
)

Para evitar esse erro, precisamos alterar a entrada TNS para apontar para os 3 VIPs do SCAN, em vez do nome do SCAN:

Os IPs foram alterados para proteger as informações reais:

SCAN_LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.11)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.12)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.13)(PORT = 1521))
)

Essa alteração deve ser feita em todos os nós do cluster.

Depois de realizar a alteração, execute o seguinte comando em todas as instâncias do banco de dados atendidas pelos SCAN Listeners:

alter system register;

Após realizar essas alterações, o cliente conseguiu se conectar ao banco de dados sem problemas.

Para desabilitar o trace do LREG:

alter system set events=’trace[LREG] disk disable’;

Notas úteis:

SCAN Registration Issue: Services Fail to Register to SCAN Listeners (Doc ID 1448717.1)

How to Trace Dynamic Registration from PMON or LREG (12c) (Doc ID 787055.1)

Bug 12946495 : SERVICES FAIL TO REGISTER TO ALL SCAN LISTENERS

Espero que seja útil!

Abraços!

Vinicius