sql >> Base de Datos >  >> RDS >> Database

Cómo reparar ORA-12505, TNS:el oyente actualmente no conoce el SID proporcionado en el descriptor de conexión

Para resolver correctamente este error y conectarnos a la base de datos de Oracle adecuada, necesitaremos explicar un poco cómo se comporta Oracle y, por lo tanto, qué está causando este problema en primer lugar.

SID frente a SERVICE_NAMES

Es importante comprender la (pequeña) diferencia entre lo que Oracle define como un SID en comparación con un SERVICE_NAME , ya que usaremos esta información para crear una cadena de conexión adecuada más adelante.

En Oracle, el identificador del sistema (o SID ) es un identificador local de hasta ocho caracteres de longitud que se utiliza para identificar una base de datos en particular y diferenciarla de otras bases de datos del sistema.

A menudo, el SID es la palabra prefijo o DB_UNIQUE_NAME que precede al DB_DOMAIN . Por ejemplo, el SID de nuestra bookstore base de datos, como se ve en el global database name de bookstore.company.com .

SERVICE_NAMES , por otro lado, representan los nombres a los que se pueden conectar las instancias de la base de datos. Un SERVICE_NAME normalmente seguirá el formato del SID seguido del dominio de la base de datos, así:DB_UNIQUE_NAME.DB_DOMAIN

El Oyente TNS

Cuando un cliente intenta conectarse a una base de datos de Oracle, en lugar de conectarse a la base de datos directamente , hay un servicio de intermediario que interviene y maneja la solicitud de conexión para el cliente.

Esta aplicación de intermediario se conoce como listener y realiza la tarea de escuchar para las solicitudes de los clientes entrantes. Cuando se recibe una solicitud, el listener procesa y reenvía esa solicitud al servidor de base de datos de Oracle adecuado mediante un service handler , que solo actúa como la conexión entre el listener y el servidor de la base de datos.

Nombres y configuración de TNS

Al conectarse a una base de datos Oracle, normalmente su servidor de base de datos tendrá tnsnames.ora , que es un archivo de configuración que informa al servidor sobre NET_SERVICE_NAMES que son conexiones de base de datos válidas. De forma predeterminada, este archivo se encuentra en ORACLE_HOME/network/admin .

Por ejemplo, un NET_SERVICE_NAME descriptor en tnsnames.ora puede tener este formato:

myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Esto definiría un NET_SERVICE_NAME usando el SERVICE_NAME discutimos anteriormente (bookstore.company.com ) y conectándose a localhost a través del puerto 1521 .

Cadena de conexión

Con un poco más de conocimiento sobre cómo Oracle realmente se conecta a las bases de datos, ahora podemos ver cómo connection strings tienen formato.

Conectar vía TNS Nombre/NET_SERVICE_NAME

Al conectarse a través de un NET_SERVICE_NAME como se especifica en su tnsnames.ora archivo de configuración, debe usar el username , password y luego agregue el NET_SERVICE_NAME con el @ símbolo, así:

username/password@NET_SERVICE_NAME

Por lo tanto, para nuestro anterior NET_SERVICE_NAME descriptor anterior, el NET_SERVICE_NAME real definimos fue myDatabaseNetService , por lo que nuestra cadena de conexión podría verse así:

john/Hunter2@myDatabaseNetService

Conectar vía SERVICIO_NOMBRE

Al conectarse a través de un SERVICE_NAME , también deberá agregar el host y port , junto con el / símbolo que precede a SERVICE_NAME mismo:

username/password@host:port/SERVICE_NAME

Conectar vía SID

Finalmente, si se conecta sin un NET_SERVICE_NAME configurado o incluso SERVICE_NAME , puedes hacerlo directamente a través del SID usando el : símbolo en lugar del / símbolo como con el SERVICE_NAME cadena de conexión:

username/password@host:port:SID