如何解决我的 Amazon RDS for Oracle 实例的常见连接错误?

4 分钟阅读
0

我无法连接到我的 Amazon Relational Database Service(Amazon RDS)for Oracle 实例。

简短描述

在排除连接错误之前,请执行以下操作:

  • 检查您的 Amazon RDS for Oracle 数据库实例的状态。如果实例处于可用存储优化备份以外的任何状态,则您无法连接到该实例。
  • 验证您是否可以通过数据库端口连接到数据库实例。默认情况下,Oracle 使用端口 1521。
telnet example-endpoint 1521

如果您无法使用 telnet 建立连接,则根据如何解决连接 Amazon RDS 数据库实例时遇到的问题?中提供的说明对问题进行故障排除

解决方法

检查您的连接

验证您的连接字符串是否准确。典型的连接描述符如下所示:

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

使用 Easy Connect 时,连接字符串如下所示:

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

根据收到的错误消息使用以下故障排除选项:

ORA-01017: invalid username/password; logon denied

检查连接字符串中提供的用户凭证。确保这些凭证准确无误。

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

使用以下 NLSLOOKUP 命令验证主机名(RDS 端点)是否准确:

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

-或-

** 错误 Connection reset by peer**

这些错误的最常见原因包括:

  • 网络、建立连接或防火墙存在问题。
  • 与客户的通信未能在规定的时间间隔内完成。
  • 数据库已关闭。
  • sqlnet.ora 参数无效。

在客户端运行 TNSPING 命令以验证连接字符串的语法:

tnsping example-connection-string

如果连接字符串的语法准确,则输出如下所示:

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

如果语法有错误,则输出如下所示:

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

您也可以运行 TRCROUTE 命令来检查连接字符串的语法:

trcroute example-connection-string

如果连接字符串的语法准确,则输出如下所示:

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

如果语法有错误,则输出如下所示:

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

要排除此类错误,请执行以下操作:

  • 确认您的 RDS 数据库实例的安全组允许相应的传入流量进入您的数据库。

  • 如果应用程序从本地网络连接,则确认防火墙规则允许进出该实例。

  • JDBC Thin 驱动程序连接不通过 Oracle 网络层。因此,如果您使用 Oracle JDBC Thin 驱动程序,请使用 Oracle JDBC Thin 驱动程序执行 SQL*Net 客户端跟踪等效操作。有关更多信息,请参阅 Oracle 网站上的 How to perform the equivalent of SQL*Net client tracing with Oracle JDBC thin driver releases prior to 11.2 (Doc ID 793415.1)

  • 如果您使用 JDBC Thick 或 OCI 客户端,请在服务器端打开 sqlnet 跟踪。要在服务器端开启跟踪,请修改附加到实例的自定义参数组。在这种情况下,不需要重启。如果您使用默认参数组,则创建自定义参数组并修改以下参数。然后,修改该实例以使用新创建的参数组。在这种情况下,需要重新启动。

    sqlnetora.trace_level_server=16

    sqlnetora.diag_adr_enabled=ON

    **重要事项:**当您开启服务器级跟踪时,可以快速生成大量跟踪文件。在极少数情况下,可能需要在故障排除完成后重新启动监听器甚至数据库才能停止跟踪。该过程还需要密切监测。最佳做法是在非高峰工作时间或在没有其他用户连接到数据库的隔离条件下开启跟踪。另外,请确保服务器有足够的可用磁盘空间。本文中提到的参数值是示例。您可以根据自己的用例修改这些值。有关更多信息,请参阅连接到 RDS for Oracle 数据库实例

  • 在客户端启用 sqlnet 跟踪。然后,重现错误并在跟踪文件中捕获详细信息。创建 sqlnet.ora 文件的备份,然后修改该文件中的以下参数:

    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

    要关闭跟踪,请从 sqlnet.ora 文件中删除跟踪参数。只有在客户端会话关闭后,对服务器端已连接会话的跟踪才会停止。

  • 如果由于网络速度慢而出现错误,请在客户端和服务器端配置以下参数。这样可以有更多时间建立连接:

    客户端:

    SQLNET.INBOUND_CONNECT_TIMEOUT

    SQLNET.SEND_TIMEOUT

    SQLNET.RECV_TIMEOUT

    服务器端:

    sqlnetora.sqlnet.inbound_connect_timeout

    sqlnetora.sqlnet.send_timeout

    sqlnetora.sqlnet.recv_timeout

    例如,如果您对所有参数使用值 600,则连接时间将设置为 10 分钟。

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

确认连接字符串中提供的 SID 与 Amazon RDS 控制台配置选项卡下的 DBNAME 值相匹配。默认情况下,RDS for Oracle 实例的 SID 和 DBNAME 为 ORCL

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

请务必使用连接字符串中 CONNECT_DATA 部分下的 SID 或 SERVICE_NAME 子句。连接字符串中提供的 SERVICE_NAME 的值与 Amazon RDS 控制台上 Configuration(配置)选项卡下的 DBNAME 的值相同。默认情况下,RDS for Oracle 实例的 SERVICE_NAME 值为 ORCL

ORA-12538: TNS:no such protocol adapter

确保连接描述符的 PROTOCOL 部分准确无误。默认情况下,PROTOCOL 的值为 TCP

ORA-12560: TNS:protocol adaptor error

此错误表示连接了错误的 SID 或数据库处于非活动状态。检查 RDS 数据库实例的状态。运行 tnsping 命令来测试连接字符串的语法和连接:

tnsping example-connection-string

ORA-00018: maximum number of sessions exceeded

此错误表示连接到数据库的会话过多。要排查此错误,请执行以下操作:

  1. 如果您已连接到数据库,则运行以下查询以查找连接的会话数:

    SELECT COUNT(*) TOTAL FROM v$session;

    运行以下查询,查看 RDS 实例中会话和进程参数的当前利用率、最大利用率以及配置的限制:

    SELECT RESOURCE_NAME, CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
    FROM V$RESOURCE_LIMIT WHERE RESOURCE_NAME IN ( 'sessions', 'processes');
  2. 结束不需要的会话,以便其他会话可以连接到数据库。

    运行以下查询,查看要停止的各个会话的 SID 和序列号:

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

    **注意:**根据您的用例修改 WHERE 子句。

    运行以下命令以结束您的 RDS for Oracle 实例中不需要的会话:

    begin
        rdsadmin.rdsadmin_util.disconnect(
            sid => example-sid,
            serial => example-serial_number);
    end;
  3. 要增加会话和进程参数的值,请编辑自定义参数组并修改参数。会话参数未在参数组中定义,使用引擎的默认值。

    Oracle 19c 中的默认会话数的计算方法如下:

    会话数 =(1.5\ * 进程数)+ 22。

    进程参数的默认值定义为 LEAST({DBInstanceClassMemory/9868951}, 20000)。进程数按主机 /10 或 20,000 中的总内存 (MB) 计算,以较小者为准。

    有关修改参数组的详细信息,请参阅 Amazon RDS 的参数组

    由于这些参数是静态的,因此您必须在更新这些参数后重启实例。

相关信息

为什么我无法连接到我的 Amazon RDS for Oracle 数据库实例?