Muitas aplicações antigas estão configuradas para utilizar o SID para conectar no banco de dados. No Oracle Database 12c, na arquitetura multitenant, devemos conectar em um PDB utilizando o SERVICE_NAME. Então o que acontece caso venhamos a plugar um non-cdb em um CDB e a aplicação tente conectar utilizando o SID?
A resposta é simples, irá ocorrer o seguinte erro:
ERROR: ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
Para resolver esse problema, foi introduzido um novo parâmetro que pode ser configurado no listener.ora, o USE_SID_AS_SERVICE_listener=on. Isso permitirá que o SID usado no descritor de conexão seja interpretado como um nome de serviço quando um usuário tentar uma conexão com o banco de dados.
Lista de PDBs:
SQL> select con_id,name,open_mode from v$pdbs; CON_ID NAME OPEN_MODE ---------- ------------------------------ ---------- 2 PDB$SEED READ ONLY 3 PDB1 READ WRITE 4 PDB2 MOUNTED
Como estão configurados os arquivos tnsnames.ora dos clientes que acessam a aplicação:
APP = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle01)(PORT = 1521)) ) (CONNECT_DATA = (SID = pdb1) ) )
Ao tentar conectar no banco de dados utilizando esta string de conexão:
[oracle@oracle01 admin]$ sqlplus scott/tiger@app> SQL*Plus: Release 12.1.0.1.0 Production on Mon Jun 2 09:47:10 2014 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
Conteúdo atual do listener.ora:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = oracle01)(PORT = 1521)) ) )
Agora adicionando o novo parâmetro:
USE_SID_AS_SERVICE_LISTENER=on LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = oracle01)(PORT = 1521)) ) ) [oracle@oracle01 admin]$ lsnrctl reload LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 02-JUN-2014 09:54:24 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) The command completed successfully
Com o novo parâmetro ativado, é possível conectar na PDB utilizando o SID:
[oracle@oracle01 admin]$ sqlplus scott/tiger@app> SQL*Plus: Release 12.1.0.1.0 Production on Mon Jun 2 09:57:08 2014 Copyright (c) 1982, 2013, Oracle. All rights reserved. Last Successful login time: Mon Jun 02 2014 09:56:58 +01:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options SQL> show con_name CON_NAME ------------------------------ PDB1
Referências
- Listener
- Oracle Net 12c: How to enable Clients using SID to connect to PDB? (Doc ID 1644355.1)
Abraço
Alex Zaballa, formado em Análise de Sistemas, é especialista em Banco de Dados Oracle com sólidos conhecimentos em Servidores de Aplicação e Sistemas Operacionais; trabalha com Oracle há 15 anos, é ORACLE ACE Director, certificado OCM Database 11G / Cloud e conta com mais de 140 outras certificações em produtos da Oracle. Alex também é um dos fundadores do Grupo de Usuários Oracle de Angola (GUOA), participa do Grupo de Usuários de Tecnologia Oracle Brasil (GUOB) e é membro do time OraWorld.