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

4 分的閱讀內容
0

我無法連線到 Amazon Relational Database Service (Amazon RDS) 執行個體。

簡短描述

在對連線錯誤進行疑難排解之前,請執行以下操作:

  • 檢查 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

-或-

ERROR: 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 Net 層。因此,如果您使用 Oracle JDBC Thin 驅動程式,請使用 Oracle JDBC Thin 驅動程式執行相當於 SQL*Net 用戶端追蹤的操作。如需詳細資訊,請參閱 Oracle 網站上的如何使用 11.2 之前的 Oracle JDBC Thin 驅動程式版本執行相當於 SQL*Net 用戶端追蹤的操作 (文件 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 主控台上組態標籤下的 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)。處理程序數計算為主機中的總記憶體 (MB) /10 或 20,000 (以較少者為準)。

    如需關於修改參數組的更多資訊,請參閱 Amazon RDS 的參數群組

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

相關資訊

為什麼我無法連線到我的 Amazon RDS for Oracle 資料庫執行個體?

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