如何疑難排解 Amazon RDS for Oracle 執行個體的的常見連線錯誤?

上次更新日期:2021 年 11 月 18 日

我無法連線至 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 複雜型用戶端或 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 主控台Configuration (組態) 索引標籤下的 DBNAME 值。預設情況下,RDS for Oracle 執行個體的 SID 和 DBNAME 為 ORCL

ORA-12504:TNS:接聽程式未在 CONNECT_DATA 中獲得 SERVICE_NAME

請務必在連線字串中的 CONNECT_DATA 部分下使用 SID 或 SERVICE_NAME 子句。連線字串中提供的 SERVICE_NAME 的值與 Amazon RDS 主控台上 Configuration (組態) 索引標籤下的 DBNAME 值相同。預設情況下,RDS for Oracle 執行個體的 SERVICE_NAME 值為 ORCL

ORA-12538:TNS:沒有這樣的協議適配器

請確保連接描述項的 PROTOCOL 部分準確無誤。預設情況下,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 參數的值,請編輯自訂參數群組,然後修改這些參數。sessions 參數未在參數群組中定義,並使用引擎的預設值。

Oracle 19c 中預設工作階段數目的計算方法如下:

工作階段數目 = (1.5 * 程序數目) + 22。

processes 參數的預設值定義為 LEAST({DBInstanceClassMemory/9868951}, 20000)。程序數目的計算方式是 主機中的總記憶體 (MB) /10 或 20,000,以較小者為準。

如需修改參數群組的詳細資訊,請參閲修改資料庫參數群組中的參數

由於這些參數是靜態的,因此您必須在更新這些參數後重新啟動執行個體。


此文章是否有幫助?


您是否需要帳單或技術支援?