Como solucionar erros comuns de conexão em minha instância do Amazon RDS for Oracle?

Última atualização: 18/11/2021

Não consigo estabelecer conexão com minha instância do Amazon Relational Database Service (Amazon RDS) for Oracle. Quero solucionar o problema da mensagem de erro que estou recebendo.

Breve descrição

Antes de solucionar o erro de conexão, siga estas etapas:

  • Confira o estado da instância de banco de dados do Amazon RDS for Oracle. Caso a instância esteja em qualquer estado diferente de available (disponível), storage optimization (otimização de armazenamento) ou backing-up (fazendo backup), não será possível se conectar à instância.
  • Verifique se é possível se conectar à instância do banco de dados pela porta do banco de dados.
    Observação: por padrão, o Oracle usa a porta 1521.
telnet example-endpoint 1521

Se você não conseguir estabelecer uma conexão usando telnet, solucione o problema com base nas instruções fornecidas em Como resolver problemas ao me conectar à instância de banco de dados do Amazon RDS?

Resolução

Verifique se a cadeia de conexão está correta.

Um descritor de conexão comum é semelhante ao seguinte:

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

Com o Easy Connect, a cadeia de conexão é semelhante à seguinte:

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

Use as seguintes opções de solução de problemas de acordo com a mensagem de erro recebida:

ORA-01017: invalid username/password; logon denied (nome de usuário/senha inválidos; acesso negado)

Confira as credenciais do usuário fornecidas na cadeia de conexão. Verifique se essas credenciais são precisas.

ORA-12545: Connect failed because target host or object does not exist (Não foi possível conectar porque o host ou o objeto não existe)

Verifique se o nome do host (endpoint do RDS) está correto usando o 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:Connect timeout occurred (TNS: tempo limite excedido)

-ou-

ERROR: Connection reset by peer (Redefinição de conexão por par)

Os motivos mais comuns para esses erros são:

  • Há problemas com a rede, o estabelecimento de conexão ou o firewall.
  • A comunicação com o cliente não foi concluída dentro do intervalo de tempo alocado.
  • O banco de dados está fora do ar.
  • O parâmetro sqlnet.ora é inválido.

Para solucionar esses erros, verifique a sintaxe da cadeia de conexão executando o comando TNSPING no lado do cliente:

$ tnsping example-connection-string

Se a sintaxe da cadeia de conexão estiver correta, a saída será semelhante à seguinte:

$ 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 houver erro na sintaxe, a saída será semelhante à seguinte:

$ 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

Também é possível executar o comando TRCROUTE para verificar a sintaxe da cadeia de conexão:

$ trcroute example-connection-string

Se a sintaxe da cadeia de conexão estiver correta, a saída será semelhante à seguinte:

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 houver erro na sintaxe, a saída será semelhante à seguinte:

$ 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 continuar solucionando esses erros, faça o seguinte:

  • Verifique se o grupo de segurança de sua instância de banco de dados do RDS permite o tráfego de entrada adequado para o banco de dados.
  • Se a aplicação se conectar de uma rede on-premises, verifique se as regras de firewall estão atualizadas para permitir conexões de entrada e saída da instância do RDS.
  • A conexão do driver JDBC Thin não passa pela camada do Oracle Net. Portanto, se você estiver usando o driver Oracle JDBC Thin, execute o equivalente ao SQL*Net Client Tracing com o Oracle JDBC Thin Driver. Para obter mais informações, consulte a documentação da Oracle para Doc ID 793415.1.
  • Se você estiver usando o cliente JDBC Thick ou OCI, ative o rastreamento sqlnet no lado do servidor. Para ativar o rastreamento no lado do servidor, modifique o grupo de parâmetros personalizados anexado à instância. Nesse caso, não é necessário reinicializar. Se estiver usando o grupo de parâmetros padrão, crie um grupo de parâmetros personalizado, altere os parâmetros a seguir e modifique a instância para usar o grupo de parâmetros recém-criado. Nesse caso, é necessário reinicializar.
    sqlnetora.trace_level_server=16
    sqlnetora.diag_adr_enabled=OFF
    Importante: ativar o rastreamento no nível do servidor pode causar certos impactos. Um grande número de arquivos de rastreamento poderá ser gerado rapidamente. Em casos excepcionais, talvez seja necessário reiniciar o listener ou até mesmo o banco de dados para interromper o rastreamento após concluir a solução de problemas. O processo também requer monitoramento minucioso. Portanto, uma prática recomendada é ativar o rastreamento durante o horário comercial fora do horário de pico ou em condições isoladas quando nenhum outro usuário estiver se conectando ao banco de dados. Além disso, verifique se o servidor tem espaço em disco suficiente disponível. Os valores dos parâmetros mencionados neste artigo são exemplos. Modifique esses valores de acordo com seu caso de uso. Para obter mais informações, consulte Modificar propriedades de conexão usando parâmetros sqlnet.ora.
  • Ative o rastreamento sqlnet no lado do cliente. Em seguida, reproduza o erro e capture os detalhes nos arquivos de rastreamento. Crie um backup do arquivo sqlnet.ora e altere os seguintes parâmetros no arquivo:
    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 desativar o rastreamento, remova os parâmetros de rastreamento do arquivo sqlnet.ora. Mesmo depois que os parâmetros de rastreamento são removidos, o rastreamento das sessões já conectadas no lado do servidor só é interrompido após o encerramento da sessão do cliente.
  • Se você receber o erro por causa de uma rede lenta, configure os parâmetros a seguir no lado do cliente e do servidor. Isso permite mais tempo para estabelecer a conexão:
    Lado do cliente:
    SQLNET.INBOUND_CONNECT_TIMEOUT
    SQLNET.SEND_TIMEOUT
    SQLNET.RECV_TIMEOUT
    Lado do servidor:
    sqlnetora.sqlnet.inbound_connect_timeout
    sqlnetora.sqlnet.send_timeout
    sqlnetora.sqlnet.recv_timeout
    Por exemplo, se você usar o valor 600 para todos os parâmetros, o tempo de conexão será definido como 10 minutos.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor (TNS: o listener atualmente não conhece o SID fornecido no descritor de conexão)

Verifique se o SID fornecido na cadeia de conexão corresponde ao valor de DBNAME que está na guia Configuration (Configuração) no console do Amazon RDS. Por padrão, o SID e o DBNAME para uma instância do RDS for Oracle são ORCL.

ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA (TNS: o listener não recebeu o SERVICE_NAME em CONNECT_DATA)

Utilize a cláusula SID ou SERVICE_NAME na seção CONNECT_DATA da cadeia de conexão. O valor de SERVICE_NAME fornecido na cadeia de conexão é igual ao valor de DBNAME que está na guia Configuration (Configuração) no console do Amazon RDS. Por padrão, o valor de SERVICE_NAME para uma instância do RDS for Oracle é ORCL.

ORA-12538: TNS:no such protocol adapter (TNS: o adaptador de protocolo não existe)

Confira se a seção PROTOCOL (PROTOCOLO) do descritor de conexão está correta. Por padrão, o valor de PROTOCOL é TCP.

ORA-12560: TNS:protocol adaptor error (TNS: erro no adaptador de protocolo)

Esse erro indica que você está tentando se conectar ao SID errado ou a um banco de dados que não está em execução. Verifique o status da instância de banco de dados do RDS. Execute o comando tnsping para testar a sintaxe e a conectividade da cadeia de conexão:

$ tnsping example-connection-string

ORA-00018: maximum number of sessions exceeded (número máximo de sessões excedido)

Esse erro indica que muitas sessões estão conectadas ao banco de dados. Para solucionar esse erro, siga estas etapas:

1.    Se estiver conectado ao banco de dados, execute a seguinte consulta para descobrir o número de sessões conectadas:

SELECT COUNT(*) TOTAL FROM v$session;

Execute a seguinte consulta para exibir a utilização atual, a utilização máxima e os limites configurados para os parâmetros sessions e processes na instância do RDS:

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

2.    Encerre as sessões indesejadas para que as outras sessões possam se conectar ao banco de dados.

Execute a seguinte consulta para visualizar o SID e o número de série de sessões individuais a serem terminadas:

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';

Observação: altere a cláusula WHERE de acordo com seu caso de uso.

Execute este comando para encerrar sessões indesejadas em sua instância do RDS for Oracle:

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

Para obter mais informações, consulte Encerrar uma sessão.

3.    Para aumentar o valor dos parâmetros sessions e processes, edite o grupo de parâmetros personalizados e modifique esses parâmetros. O parâmetro sessions não está definido no grupo de parâmetros e usa os valores padrão do mecanismo.

O número padrão de sessões no Oracle 19c é calculado da seguinte forma:

Número de sessões = (1,5 * número de processos) + 22.

O valor padrão para o parâmetro processes é definido como LEAST({DBInstanceClassMemory/9868951}, 20000). O número de processos é calculado como 20.000 ou a memória total (MB) do host/10, o que for menor.

Para obter mais informações sobre como modificar um grupo de parâmetros, consulte Modificar de parâmetros em um grupo de parâmetros de banco de dados.

Como esses parâmetros são estáticos, será necessário reinicializar a instância depois de atualizar esses parâmetros.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?