Saltar al contenido

¿Cómo soluciono los errores de conexión habituales de mi instancia de Amazon RDS para Oracle?

9 minutos de lectura
0

No puedo conectarme a mi instancia de base de datos de Amazon Relational Database Service (Amazon RDS).

Descripción corta

Antes de solucionar el error de conexión, haz lo siguiente:

  • Comprueba el estado de tu instancia de base de datos de Amazon RDS para Oracle. Si la instancia se encuentra en un estado que no sea Disponible, Optimización de almacenamiento o Copia de seguridad, no podrás conectarte a la instancia.
  • Comprueba que puedes conectarte a la instancia de la base de datos a través del puerto de la base de datos. De forma predeterminada, Oracle usa el puerto 1521.
telnet example-endpoint 1521

Si no puedes establecer una conexión mediante telnet, soluciona el problema según las instrucciones que se indican en ¿Por qué no puedo conectarme a mi instancia de base de datos de Amazon RDS?

Resolución

Comprobación de la conexión

Comprueba que la cadena de conexión sea correcta. Un descriptor de conexión típico tiene un aspecto similar al siguiente:

sqlplus admin/xxxx@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myexampledb.xxxx.us-east-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))

Con Easy Connect, la cadena de conexión es similar a la siguiente:

sqlplus 'admin@myexampledb.xxxx.us-east-1.rds.amazonaws.com:1521/ORCL'

Utiliza las siguientes opciones de solución de problemas según el mensaje de error que se muestre:

ORA-01017: invalid username/password; logon denied

Comprueba las credenciales de usuario proporcionadas en la cadena de conexión. Asegúrate de que estas credenciales sean correctas.

ORA-12545: Connect failed because target host or object does not exist

Utiliza el siguiente comando NLSLOOKUP para comprobar que el nombre de host (punto de enlace de RDS) sea correcto:

nslookup example-database.xxxx.us-east-1.rds.amazonaws.com
Server: xx.xx.xx.xx
Address: xx.xx.xx.xx#53

ORA-12170: TNS:Connect timeout occurred

-o-

ERROR: Connection reset by peer

Los motivos más habituales de estos errores son los siguientes:

  • Hay problemas con la red, el establecimiento de la conexión o el firewall.
  • La comunicación con el cliente no se completó dentro del intervalo de tiempo asignado.
  • La base de datos no funciona.
  • El parámetro sqlnet.ora no es válido.

Ejecuta el comando TNSPING en el lado del cliente para verificar la sintaxis de la cadena de conexión:

tnsping example-connection-string

Si la sintaxis de la cadena de conexión es correcta, el resultado será similar al siguiente:

$ cat $ORACLE_HOME/network/admin/tnsnames.ora
Output :
ORCL=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= example-database.xxxx.us-east-1.rds.amazonaws.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))
$ tnsping ORCL
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:16:04
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=example-database.xxxx.us-east-1.rds.amazonaws.com)(PORT=1521))
CONNECT_DATA=(SERVICE_NAME=ORCL)))
OK (20 msec)

Si hay un error con la sintaxis, el resultado será similar al siguiente:

tnsping ORCL
TNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:23:47
Copyright (c) 1997, 2014, Oracle. All rights reserved.
Used parameter files:
TNS-03505: Failed to resolve name

También puedes ejecutar el comando TRCROUTE para comprobar la sintaxis de la cadena de conexión:

trcroute example-connection-string

Si la sintaxis de la cadena de conexión es correcta, el resultado será similar al siguiente:

Trace Route Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:16:25
Copyright (c) 1995, 2014, Oracle. All rights reserved.
Route of TrcRoute:
------------------
Node: Client            Time and address of entry into node:
-------------------------------------------------------------
16-NOV-2021 09:16:25 ADDRESS= PROTOCOL=TCP  HOST=example-database.xxxx.us-east-1.rds.amazonaws.com  PORT=1521
Node: Server            Time and address of entry into node:
-------------------------------------------------------------
16-NOV-2021 14:16:25 ADDRESS= PROTOCOL=TCP  HOST=example-database.xxxx.us-east-1.rds.amazonaws.com PORT=1521

Si hay un error con la sintaxis, el resultado será similar al siguiente:

trcroute ORCL
Trace Route Utility for Linux: Version 12.1.0.2.0 - Production on 16-NOV-2021 09:25:06
Copyright (c) 1995, 2014, Oracle.  All rights reserved.
TNS-03505: Failed to resolve name

Para seguir solucionando estos errores, haz lo siguiente:

  • Confirma que el grupo de seguridad de la instancia de base de datos de RDS permite el tráfico entrante adecuado a la base de datos.

  • Si la aplicación se conecta desde una red local, confirma que las reglas del firewall permiten las conexiones hacia la instancia y desde esta.

  • La conexión del controlador JDBC Thin no pasa por la capa Oracle Net. Por lo tanto, si utilizas el controlador Oracle JDBC Thin, lleva a cabo lo equivalente a SQL*Net Client Tracing con el controlador Oracle JDBC Thin. Para obtener más información, consulta How to perform the equivalent of SQL*Net client tracing with Oracle JDBC thin driver releases prior to 11.2 (Doc ID 793415.1) (Cómo realizar el equivalente al rastreo de clientes de SQL*Net con versiones de controladores Oracle JDBC Thin anteriores a la 11.2 [ID del documento 793415.1]) en el sitio web de Oracle.

  • Si usas el cliente JDBC Thick u OCI, activa el rastreo de sqlnet en el lado del servidor. Para activar el rastreo en el servidor, modifica el grupo de parámetros personalizados adjunto a la instancia. En este caso, no es necesario reiniciar. Si usas el grupo de parámetros predeterminado, crea un grupo de parámetros personalizado y modifica los siguientes parámetros. A continuación, modifica la instancia para usar el grupo de parámetros recién creado. En este caso, es necesario reiniciar.

    sqlnetora.trace_level_server=16

    sqlnetora.diag_adr_enabled=ON

    Importante: Al activar el seguimiento a nivel de servidor, se puede generar rápidamente una gran cantidad de archivos de seguimiento. En raras ocasiones, es posible que sea necesario reiniciar el agente de escucha o incluso la base de datos para detener el seguimiento una vez finalizada la solución de problemas. El proceso también requiere una estrecha supervisión. Se recomienda activar el rastreo durante las horas no pico de trabajo o en condiciones aisladas cuando ningún otro usuario se conecte a la base de datos. Además, asegúrate de que el servidor disponga de suficiente espacio en disco. Los valores de los parámetros mencionados en este artículo son ejemplos. Puedes modificar estos valores según tu caso de uso. Para obtener más información, consulta Conexión a la instancia de base de datos de RDS para Oracle.

  • Activa el rastreo de sqlnet en el lado del cliente. A continuación, reproduce el error y captura los detalles de los archivos de rastreo. Crea una copia de seguridad del archivo sqlnet.ora y, a continuación, modifica los siguientes parámetros del archivo:

    TRACE_LEVEL_CLIENT = 16

    TRACE_FILE_CLIENT = client.trc

    TRACE_DIRECTORY_CLIENT = /var/log/sqlnet

    TRACE_TIMESTAMP_CLIENT = ON

    TRACE_UNIQUE_CLIENT = ON

    DIAG_ADR_ENABLED= OFF

    Para desactivar el rastreo, elimina los parámetros de rastreo del archivo sqlnet.ora. El seguimiento de las sesiones ya conectadas en el servidor no se detiene hasta que no se cierre la sesión del cliente.

  • Si se muestra el error debido a una red lenta, configura los siguientes parámetros en los lados del cliente y del servidor. Esto permite disponer de más tiempo para establecer la conexión:

    Lado del cliente:

    SQLNET.INBOUND_CONNECT_TIMEOUT

    SQLNET.SEND_TIMEOUT

    SQLNET.RECV_TIMEOUT

    Lado del servidor:

    sqlnetora.sqlnet.inbound_connect_timeout

    sqlnetora.sqlnet.send_timeout

    sqlnetora.sqlnet.recv_timeout

    Por ejemplo, si usas el valor 600 para todos los parámetros, el tiempo de conexión se establece en 10 minutos.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

Confirma que el SID proporcionado en la cadena de conexión coincida con el valor de DBNAME que se encuentra en la pestaña Configuración de la consola de Amazon RDS. De forma predeterminada, el SID y el DBNAME de una instancia de RDS para Oracle es ORCL.

ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

Asegúrate de usar la cláusula SID o SERVICE_NAME en la sección CONNECT_DATA de la cadena de conexión. El valor de SERVICE_NAME proporcionado en la cadena de conexión es el mismo que el valor de DBNAME que se encuentra en la pestaña Configuración de la consola de Amazon RDS. De forma predeterminada, el valor SERVICE_NAME de una instancia de RDS para Oracle es ORCL.

ORA-12538: TNS:no such protocol adapter

Asegúrate de que la sección PROTOCOL de tu descriptor de conexión sea correcta. De forma predeterminada, el valor de PROTOCOL es TCP.

ORA-12560: TNS:protocol adaptor error

Este error indica una conexión al SID incorrecto o a una base de datos que no está activa. Comprueba el estado de la instancia de base de datos de RDS. Ejecuta el comando tnsping para probar la sintaxis y la conectividad de la cadena de conexión:

tnsping example-connection-string

ORA-00018: maximum number of sessions exceeded

Este error indica que hay demasiadas sesiones conectadas a la base de datos. Para solucionar este error, haz lo siguiente:

  1. Si te has conectado a la base de datos, ejecuta la siguiente consulta para encontrar el número de sesiones conectadas:

    SELECT COUNT(*) TOTAL FROM v$session;

    Ejecuta la siguiente consulta para ver la utilización actual, la utilización máxima y los límites configurados para los parámetros de sesiones y procesos en la instancia de RDS:

    SELECT RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
    FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME IN ( 'sessions', 'processes');
  2. Finaliza las sesiones no deseadas para que las demás sesiones puedan conectarse a la base de datos.

    Ejecuta la siguiente consulta para ver el SID y el número de serie de las sesiones individuales que se van a detener:

    col username format a15
    col osuser format a15
    col program format a40
    col machine format a40
    SELECT s.osuser,
    s.sid,
    s.serial#,
    p.spid "RDS OS PID",
    s.program,
    s.machine,
    s.process "CLIENT OS PID",
    s.STATUS,
    s.SQL_ID,
    s.CURRENT_QUEUE_DURATION
    FROM v$session s, v$process p
    WHERE s.paddr = p.addr AND s.machine LIKE '%<client machine>%'
    AND s.STATUS='ACTIVE';

    Nota: Modifica la cláusula WHERE según tu caso de uso.

    Ejecuta el siguiente comando para finalizar las sesiones no deseadas en tu instancia de RDS para Oracle:

    begin
        rdsadmin.rdsadmin_util.disconnect(
            sid => example-sid,
            serial => example-serial_number);
    end;
  3. Para aumentar el valor de los parámetros de las sesiones y procesos, edita el grupo de parámetros personalizado y modifica los parámetros. El parámetro sessions no está definido en el grupo de parámetros y usa los valores predeterminados del motor.

    El número predeterminado de sesiones en Oracle 19c se calcula de la siguiente manera:

    Número de sesiones = (1,5 * número de procesos) + 22.

    El valor predeterminado del parámetro processes se define como LEAST({DBInstanceClassMemory/9868951}, 20000). El número de procesos se calcula como la memoria total (MB) en el host /10 o 20 000, lo que sea menor.

    Para obtener más información sobre la modificación de un grupo de parámetros, consulta Grupos de parámetros para Amazon RDS.

    Como estos parámetros son estáticos, debes reiniciar la instancia después de actualizarlos.

Información relacionada

¿Por qué no puedo conectarme a mi instancia de base de datos de Amazon RDS para Oracle?