Database
 sql >> Base de Dados >  >> RDS >> Database

Como corrigir ORA-12505, TNS:listener atualmente não sabe do SID fornecido no descritor de conexão


Para resolver corretamente esse erro e conectar-se ao banco de dados Oracle apropriado, precisaremos expor um pouco sobre como o Oracle se comporta e, portanto, o que está causando esse problema em primeiro lugar.

SIDs x SERVICE_NAMES


É importante entender a (pequena) diferença entre o que a Oracle define como um SID comparado a um SERVICE_NAME , pois usaremos essas informações para criar uma string de conexão adequada posteriormente.

No Oracle, o identificador do sistema (ou SID ) é um identificador local de até oito caracteres que é usado para identificar um determinado banco de dados e diferenciá-lo de outros bancos de dados no sistema.

Muitas vezes, o SID é a palavra de prefixo ou DB_UNIQUE_NAME que precede o DB_DOMAIN . Por exemplo, o SID da nossa bookstore banco de dados, como visto no global database name completo de bookstore.company.com .

SERVICE_NAMES , por outro lado, representam os nomes pelos quais as instâncias de banco de dados podem ser conectadas. Um SERVICE_NAME normalmente seguirá o formato do SID seguido pelo domínio do banco de dados, assim:DB_UNIQUE_NAME.DB_DOMAIN

O Ouvinte TNS


Quando um cliente está tentando se conectar a um banco de dados Oracle, em vez de se conectar ao banco de dados diretamente , existe um serviço de broker que intervém e trata do pedido de conexão para o cliente.

Este aplicativo corretor é conhecido como listener e executa a tarefa de ouvir para solicitações de clientes recebidas. Quando uma solicitação é recebida, o listener processa e encaminha essa solicitação para o servidor de banco de dados Oracle apropriado usando um service handler , que apenas atua como a conexão entre o listener e o servidor de banco de dados.

Nomes e configuração TNS


Ao se conectar a um banco de dados Oracle, normalmente seu servidor de banco de dados terá tnsnames.ora , que é um arquivo de configuração que informa ao servidor sobre NET_SERVICE_NAMES que são conexões de banco de dados válidas. Por padrão, este arquivo está localizado em ORACLE_HOME/network/admin .

Por exemplo, um NET_SERVICE_NAME descritor em tnsnames.ora pode ser formatado assim:
myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Isso definiria um NET_SERVICE_NAME usando o SERVICE_NAME discutimos anteriormente (bookstore.company.com ) e conectando-se a localhost pela porta 1521 .

String de conexão


Com um pouco mais de conhecimento sobre como o Oracle realmente se conecta aos bancos de dados, agora podemos ver como as connection strings são formatados.

Conectar via Nome TNS/NET_SERVICE_NAME


Ao conectar por meio de um NET_SERVICE_NAME conforme especificado em seu tnsnames.ora config, você deve usar o username , password e, em seguida, anexe o NET_SERVICE_NAME com o @ símbolo, assim:
username/password@NET_SERVICE_NAME

Assim, para nosso NET_SERVICE_NAME anterior descritor acima, o NET_SERVICE_NAME real definimos foi myDatabaseNetService , então nossa string de conexão pode ser algo assim:
john/Hunter2@myDatabaseNetService

Conectar via SERVICE_NAME


Ao conectar por meio de um SERVICE_NAME , você também precisará adicionar o host e port , junto com o / símbolo que precede o SERVICE_NAME em si:
username/password@host:port/SERVICE_NAME

Conectar via SID


Finalmente, se conectar sem um NET_SERVICE_NAME configurado ou até mesmo SERVICE_NAME , você pode fazer isso diretamente através do SID usando o : símbolo em vez do / símbolo como com o SERVICE_NAME cadeia de conexão:
username/password@host:port:SID