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

3 分钟阅读
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:用户名/密码无效;登录被拒绝

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

ORA-12545:连接失败,因为目标主机或对象不存在

使用 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:发生连接超时

– 或者 –

错误:对等节点重置连接

这些错误的最常见原因如下:

  • 网络、连接建立或防火墙存在问题。
  • 与客户端的通信未能在指定的时间间隔内完成。
  • 数据库已关闭。
  • 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 数据库实例的安全组允许向数据库传入适当的流量。
  • 如果应用程序从本地部署网络连接,请确保已更新防火墙规则以允许与 RDS 实例之间的连接。
  • JDBC 精简驱动程序连接不会通过 Oracle Net 层。因此,如果您使用的是 Oracle JDBC 精简驱动程序,请以 Oracle JDBC 精简驱动程序执行与 SQL*NET 客户端跟踪等效的操作。有关更多信息,请参阅 Doc ID 793415.1 的 Oracle 文档。
  • 如果您使用的是 JDBC Thick 或 OCI 客户端,请在服务器端开启 sqlnet 跟踪。要在服务器端开启跟踪,请修改附加到实例的自定义参数组。在这种情况下,不需要重新启动。如果您使用的是默认参数组,请创建自定义参数组,修改以下参数,然后修改实例以使用新创建的参数组。在这种情况下,需要重新启动。
    sqlnetora.trace_level_server=16
    sqlnetora.diag_adr_enabled=OFF
    **重要提示:**启用服务器级别的跟踪可能会产生一些潜在影响。可能会很快生成大量跟踪文件。在极少数情况下,故障排除完成后,可能需要重新启动侦听器甚至数据库才能停止跟踪。该过程还需要密切监控。因此,最佳实践是在非高峰工作时间或在没有其他用户连接到数据库的隔离条件下启用跟踪。另外,请确保服务器有充足的可用磁盘空间。本文中提到的参数值仅为示例。您可以根据自己的使用案例修改这些值。有关更多信息,请参阅使用 sqlnet.ora 参数修改连接属性
  • 在客户端开启 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:侦听器目前不知道连接描述符中给出的 SID

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

ORA-12504: TNS:侦听器没有在 CONNECT_DATA 中获得 SERVICE_NAME

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

ORA-12538: TNS:没有此类协议适配器

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

ORA-12560: TNS:协议适配器错误

此错误表示尝试连接到错误的 SID 或未在运行的数据库。检查 RDS 数据库实例的状态。运行 tnsping 命令以测试连接字符串的语法和连接性:

$ tnsping example-connection-string

ORA-00018:已超出最大会话数

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

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

SELECT COUNT(*) TOTAL FROM v$session;

运行以下查询以查看 RDS 实例中 sessionsprocesses 参数的当前使用率、最大使用率以及配置的限制:

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.    要增加 sessionsprocesses 参数的值,请编辑自定义参数组,然后修改这些参数。session 参数未在参数组中定义,它使用引擎的默认值。

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

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

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

有关修改参数组的更多信息,请参阅修改数据库参数组中的参数

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


相关信息

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

AWS 官方
AWS 官方已更新 3 年前