Come posso risolvere gli errori di connessione più comuni per la mia istanza Amazon RDS for Oracle?

Ultimo aggiornamento: 18-11-2021

Non riesco a connettermi all'istanza database di Amazon Relational Database Service (Amazon RDS) per l'istanza database di Oracle. Desidero risolvere il messaggio di errore che ricevo.

Breve descrizione

Prima di risolvere l'errore di connessione, completa le seguenti operazioni:

  • Controlla lo stato dell'istanza database di Amazon RDS for Oracle. Se l'istanza si trova in uno stato diverso da disponibile, dall'ottimizzazione dell’archiviazione o dal backup, non è possibile connettersi all'istanza.
  • Verifica di poterti connettere all'istanza di database tramite la porta del database.
    Nota: per impostazione predefinita, Oracle utilizza la porta 1521.
telnet example-endpoint 1521

Se non riesci a stabilire una connessione tramite telnet, risolvi il problema in base alle istruzioni fornite in Come posso risolvere i problemi durante la connessione alla mia istanza database Amazon RDS?

Risoluzione

Verifica che la stringa di connessione sia accurata.

Un tipico descrittore di connessione è simile al seguente:

$ 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 stringa di connessione è simile alla seguente:

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

Utilizza le seguenti opzioni di risoluzione dei problemi in base al messaggio di errore visualizzato:

ORA-01017: nome utente/password non validi; accesso negato

Controlla le credenziali utente fornite nella stringa di connessione. Assicurati che queste credenziali siano accurate.

ORA-12545: Connessione non riuscita perché l'host o l'oggetto di destinazione non esiste

Verifica che il nome host (endpoint RDS) sia accurato utilizzando il comando NLSLOOKUP:

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

ORA-12170: TNS: si è verificato il timeout della connessione

-oppure-

ERRORE: ripristino della connessione tramite peer

I motivi più comuni di questi errori sono i seguenti:

  • Ci sono problemi con la rete, la creazione della connessione o il firewall.
  • La comunicazione con il client non è stata completata entro l'intervallo di tempo assegnato.
  • Il database è inattivo.
  • Il parametro sqlnet.ora non è valido.

Per risolvere questi errori, verifica la sintassi della stringa di connessione eseguendo il comando TNSPING lato client:

$ tnsping example-connection-string

Se la sintassi della stringa di connessione è accurata, l'output è simile al seguente:

$ 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)

Se si verifica un errore con la sintassi, l'output è simile al seguente:

$ 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

È inoltre possibile eseguire il comando TRCROUTE per verificare la sintassi della stringa di connessione:

$ trcroute example-connection-string

Se la sintassi della stringa di connessione è accurata, l'output è simile al seguente:

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

Se si verifica un errore con la sintassi, l'output è simile al seguente:

$ 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

Per risolvere ulteriormente questi errori, completa le seguenti operazioni:

  • Accertati che il gruppo di sicurezza per l'istanza database di RDS consenta il traffico in entrata appropriato verso il database.
  • Se l'applicazione si connette da una rete on-premise, assicurati che le regole del firewall siano aggiornate per consentire le connessioni da e verso l'istanza RDS.
  • La connessione del driver JDBC Thin non passa attraverso il livello Oracle Net. Pertanto, se utilizzi il driver Oracle JDBC Thin, esegui l'equivalente di SQL*Net Client Tracing con Oracle JDBC Thin Driver. Per ulteriori informazioni, consulta la documentazione Oracle per Doc ID 793415.1.
  • Se utilizzi il client JDBC Thick o OCI, attiva la traccia sqlnet sul lato server. Per attivare l'analisi sul lato server, modifica il gruppo di parametri personalizzato associato all'istanza. In questo caso, non è richiesto un riavvio. Se utilizzi il gruppo di parametri predefinito, crea un gruppo di parametri personalizzato, modifica i seguenti parametri e quindi modifica l'istanza per utilizzare il gruppo di parametri appena creato. In questo caso, è necessario un riavvio.
    sqlnetora.trace_level_server=16
    sqlnetora.diag_adr_enabled=OFF
    Importante: l'attivazione del tracciamento a livello di server potrebbe avere alcuni potenziali impatti. È possibile che venga generato rapidamente un gran numero di file di traccia. In rari casi, potrebbe essere necessario riavviare il listener o anche il database per interrompere il tracciamento dopo che la risoluzione dei problemi è stata completata. Il processo richiede anche un attento monitoraggio. Pertanto, una best practice consiste nell’attivare il tracciamento durante le ore lavorative non di punta o in condizioni isolate quando nessun altro utente si connette al database. Inoltre, assicurati che il server disponga di spazio su disco sufficiente. I valori dei parametri menzionati in questo articolo sono esempi. È possibile modificare questi valori in base al proprio caso d'uso. Per ulteriori informazioni, consulta Modifica delle proprietà di connessione utilizzando i parametri sqlnet.ora.
  • Attiva sqlnet tracing sul lato client. Quindi, riproduci l'errore e acquisisci i dettagli nei file di traccia. Crea un backup del file sqlnet.ora, quindi modifica i seguenti parametri nel file:
    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
    Per disattivare l'analisi, rimuovi i parametri di tracciamento dal file sqlnet.ora. Anche dopo aver rimosso i parametri di tracciamento, la traccia per le sessioni già connesse sul lato server viene interrotta solo dopo la chiusura della sessione client.
  • Se l'errore si verifica a causa di una rete lenta, configurare i seguenti parametri sul lato client e sul lato server. Ciò consente più tempo per stabilire la connessione:
    Lato client:
    SQLNET.INBOUND_CONNECT_TIMEOUT
    SQLNET.SEND_TIMEOUT
    SQLNET.RECV_TIMEOUT
    Lato server:
    sqlnetora.sqlnet.inbound_connect_timeout
    sqlnetora.sqlnet.send_timeout
    sqlnetora.sqlnet.recv_timeout
    Ad esempio, se utilizzi il valore 600 per tutti i parametri, il tempo di connessione viene impostato su 10 minuti.

ORA-12505: TNS: il listener attualmente non conosce il SID fornito nel descrittore di connessione

Assicurati che il SID fornito nella stringa di connessione corrisponda al valore di DBNAME che si trova nella scheda Configurazione della console Amazon RDS. Per impostazione predefinita, il SID e il DBNAME per un'istanza RDS per Oracle sono ORCL.

ORA-12504: TNS: al listener non è stato assegnato il SERVICE_NAME in CONNECT_DATA

Assicurati di utilizzare la clausola SID o SERVICE_NAME nella sezione CONNECT_DATA nella stringa di connessione. Il valore di SERVICE_NAME fornito nella stringa di connessione è uguale al valore di DBNAME che si trova nella scheda Configurazione della console Amazon RDS. Per impostazione predefinita, il valore SERVICE_NAME per un'istanza RDS per Oracle è ORCL.

ORA-12538: TNS: nessun adattatore di protocollo di questo tipo

Assicurati che la sezione PROTOCOL del descrittore di connessione sia accurata. Per impostazione predefinita, il valore di PROTOCOL è TCP.

ORA-12560: TNS: errore adattatore protocollo

Questo errore indica che stai provando a connetterti al SID sbagliato o a un database non in esecuzione. Controlla lo stato dell'istanza database RDS. Esegui il comando tnsping per verificare la sintassi e la connettività della stringa di connessione:

$ tnsping example-connection-string

ORA-00018: numero massimo di sessioni superato

Questo errore indica che troppe sessioni sono connesse al database. Per risolvere l’errore, procedi come segue:

1.    Se sei connesso al database, eseguire la query riportata per trovare il numero di sessioni connesse:

SELECT COUNT(*) TOTAL FROM v$session;

Esegui la query riportata per visualizzare l'utilizzo corrente, l'utilizzo massimo e i limiti configurati per i parametri delle sessioni e dei processi nell'istanza RDS:

SELECT RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME IN ( 'sessions', 'processes');

2.    Termina le sessioni indesiderate in modo che le altre sessioni possano connettersi al database.

Esegui la query riportata per visualizzare il SID e il numero di serie delle singole sessioni da terminare:

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 clausola WHERE in base al tuo caso d'uso.

Esegui il comando riportato per terminare le sessioni indesiderate nell'istanza RDS per Oracle:

begin
    rdsadmin.rdsadmin_util.disconnect(
        sid => example-sid,
        serial => example-serial_number);
end;

Per ulteriori informazioni, consulta Terminazione di una sessione.

3.    Per aumentare il valore dei parametri delle sessioni e dei processi, modifica il gruppo di parametri personalizzato e modifica questi parametri. Il parametro sessions non è definito nel gruppo di parametri e utilizza i valori predefiniti per il motore.

Il numero predefinito di sessioni in Oracle 19c viene calcolato come segue:

Numero di sessioni = (1,5 * numero di processi) + 22.

Il valore predefinito per il parametro processes è definito come LEAST({DBInstanceClassMemory/9868951}, 20000). Il numero di processi viene calcolato come memoria totale (MB) nell'host /10 o 20.000, a seconda di quale sia inferiore.

Per ulteriori informazioni sulla modifica di un gruppo di parametri, consulta Modifica dei parametri in un gruppo di parametri del database.

Poiché questi parametri sono statici, è necessario riavviare l'istanza dopo aver aggiornato questi parametri.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?