Amazon Redshift 自 2025 年 11 月 1 日起不再支援建立新的 Python UDF。如果您想要使用 Python UDF,請在該日期之前建立 UDF。現有 Python UDF 將繼續正常運作。如需詳細資訊,請參閱部落格文章
針對 Amazon Redshift 中的連線問題進行疑難排解
如果從 SQL 用戶端工具連接至叢集時有問題,您可以檢查幾個項目來縮小問題的範圍。如果您使用 SSL 或伺服器憑證,對連線問題進行故障排除時,請先移除此複雜度。然後在找到解決方案之後加回來。如需更多詳細資訊,請參閱 設定連線的安全選項。
如需 Amazon Redshift 功能中可能影響應用程式的行為變更相關資訊,請參閱 Amazon Redshift 中的行為變更。
重要
Amazon Redshift 已變更 SSL 憑證的管理方式。如果您無法使用 SSL 來連接,您可能需要更新目前的信任根 CA 憑證。如需更多詳細資訊,請參閱 將 SSL 連線轉換為使用 ACM 憑證。
下一節提供連線問題的一些範例錯誤訊息及可能的解決方案。因為不同的 SQL 用戶端工具會提供不同的錯誤訊息,所以這不是完整的清單,但很適合作為問題疑難排解時的起點。
從 Amazon EC2 外部進行連線並發生防火牆逾時問題
執行長時間查詢 (例如 COPY 命令) 時,對資料庫的用戶端連線似乎懸置或逾時。在此情況下,您可能會發現 Amazon Redshift 主控台顯示查詢已完成,但用戶端工具本身仍似乎在執行查詢。取決於連線停止的時間,查詢的結果可能遺漏或不完整。
可能的解決方案
從 Amazon EC2 執行個體以外的機器連線到 Amazon Redshift 時,便會發生此問題。在此情況下,閒置連線會在閒置一段時間後,遭到中繼網路元件 (例如防火牆) 終止。當您從虛擬私有網路 (VPN) 或本機網路登入時,這是很典型的行為。
為了避免這些逾時,建議採取下列變更:
-
提高與 TCP/IP 逾時有關的用戶端系統值。請在您用來連接至叢集的電腦上進行這些變更。應該依您的用戶端和網路來調整逾時期間。如需更多詳細資訊,請參閱 變更 TCP/IP 逾時設定。
-
(選用) 在 DSN 層級上設定保持連線行為。如需更多詳細資訊,請參閱 變更 DSN 逾時設定。
變更 TCP/IP 逾時設定
若要變更 TCP/IP 逾時設定,請根據您用於連接至叢集的作業系統來設定逾時設定。
-
Linux — 如果用戶端在 Linux 上執行,請以根使用者身分執行下列命令,以變更目前工作階段的逾時設定:
/sbin/sysctl -w net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5若要保留設定,請使用下列值建立或修改
/etc/sysctl.conf檔案,然後重新啟動系統。net.ipv4.tcp_keepalive_time=200 net.ipv4.tcp_keepalive_intvl=200 net.ipv4.tcp_keepalive_probes=5
-
Windows — 如果用戶端在 Windows 上執行,請在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ 下編輯下列登錄設定的值:
-
KeepAliveTime:30000
-
KeepAliveInterval:1000
-
TcpMaxDataRetransmissions:10
這些設定使用 DWORD 資料類型。如果這些設定不存在於登錄路徑下,您可以建立設定並指定這些建議值。如需編輯 Windows 登錄的相關資訊,請參閱 Windows 文件。
設定這些值之後,請重新啟動電腦以讓變更生效。
-
-
Mac — 如果用戶端在 Mac 上執行,請執行下列命令,以變更目前工作階段的逾時設定:
sudo sysctl net.inet.tcp.keepintvl=200000 sudo sysctl net.inet.tcp.keepidle=200000 sudo sysctl net.inet.tcp.keepinit=200000 sudo sysctl net.inet.tcp.always_keepalive=1若要保留設定,請使用下列值建立或修改
/etc/sysctl.conf檔案:net.inet.tcp.keepidle=200000 net.inet.tcp.keepintvl=200000 net.inet.tcp.keepinit=200000 net.inet.tcp.always_keepalive=1重新啟動電腦,然後執行下列命令,以驗證是否已設定這些值。
sysctl net.inet.tcp.keepidle sysctl net.inet.tcp.keepintvl sysctl net.inet.tcp.keepinit sysctl net.inet.tcp.always_keepalive
變更 DSN 逾時設定
您可以在 DSN 層級上設定保持連線行為 (若選擇這麼做)。在作法上是在 odbc.ini 檔案中新增或修改下列參數:
- KeepAlivesCount
-
在認為連線已中斷之前可遺失的 TCP 保持連線封包數。
- KeepAlivesIdle
-
驅動程式傳送 TCP 保持連線封包之前的閒置秒數。
- KeepAlivesInterval
-
每一次 TCP 保持連線重新傳輸之間的秒數。
如果這些參數不存在,或值為 0,系統會使用指定給 TCP/IP 的保持連線參數,以決定 DSN 保持連線行為。在 Windows 上,您可以在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ 的登錄中找到 TCP/IP 參數。在 Linux 和 macOS 上,您可以在 sysctl.conf 檔案中找到 TCP/IP 參數。
連線遭拒或失敗
如果您的連線遭拒或失敗,您可能會收到類似下列其中一項的錯誤。
-
「無法對
<endpoint>建立連線。」 -
「無法連接至伺服器:連線逾時。伺服器在主機
'<endpoint>'上執行且在連接埠'<port>'上接受 TCP/IP 連線嗎?」 -
「連線遭拒。請檢查主機名稱和連接埠正確,且 postmaster 接受 TCP/IP 連線。」
可能的解決方案
一般來說,收到錯誤訊息指出無法建立連線時,表示存取叢集的許可有問題,或到達叢集的網路流量有問題。
若要從叢集所在網路外部的用戶端工具連線至叢集,請在叢集的安全群組中新增傳入規則。規則組態取決於 Amazon Redshift 叢集是否建立於虛擬私有雲端 (VPC):
-
如果您在以 Amazon VPC 為基礎的虛擬私有雲端 (VPC) 中建立了 Amazon Redshift 叢集,請在 Amazon VPC 中於 VPC 安全群組內新增會指定用戶端 CIDR/IP 地址的傳入規則。如需為叢集設定 VPC 安全群組以及可公開存取選項的相關資訊,請參閱 VPC 中的 Redshift 資源。
-
如果在 VPC 外部建立了 Amazon Redshift 叢集,請在 Amazon Redshift 中將用戶端 CIDR/IP 地址新增至叢集安全群組。如需設定叢集安全群組的相關資訊,請參閱 Amazon Redshift 安全群組。
如果您嘗試從在 Amazon EC2 執行個體上執行的用戶端工具連線至叢集,您也會新增傳入規則。在此情況下,請在叢集安全群組中新增規則。此規則必須指定與用戶端工具的 Amazon EC2 執行個體相關聯的 Amazon EC2 安全群組。
在某些情況下,您的用戶端與伺服器之間可能有一層,例如防火牆。在這些情況下,請確定防火牆透過您為叢集設定的連接埠接受傳入連線。
用戶端和驅動程式不相容
如果您的用戶端和驅動器不相容,您可能會收到錯誤,指出「指定的 DSN 包含驅動器與應用程式之間的架構不符」。
可能的解決方案
當您嘗試連接並得到有關架構不符的錯誤時,這表示用戶端工具和驅動程式不相容。原因是它們的系統架構不相符。例如,假設您有 32 位元用戶端工具,但卻安裝 64 位元版本的驅動程式,就可能發生此錯誤。有時,64 位元用戶端工具可以使用 32 位元驅動程式,但 32 位元應用程式不能搭配 64 位元驅動程式一起使用。請確定驅動程式和用戶端工具使用相同版本的系統架構。
查詢似乎沒有回應且有時無法觸達叢集
您遇到查詢完成方面的問題,查詢似乎正在執行,但在 SQL 用戶端工具中無回應。有時,查詢無法出現在叢集,例如系統資料表或 Amazon Redshift 主控台。
可能的解決方案
由於封包捨棄,可能發生此問題。在兩個網際網路通訊協定 (IP) 主機之間的網路路徑中,最大傳輸單位 (MTU) 出現差異。MTU 大小決定網路連線上的一個乙太網路訊框中可傳輸的封包大小上限 (位元組)。在 AWS 中,有些 Amazon EC2 執行個體類型支援的 MTU 為 1500 (乙太網路 v2 訊框),而其他執行個體類型支援的 MTU 為 9001 (TCP/IP 巨型訊框)。
為了避免因為 MTU 大小不同而發生問題,建議採取下列其中一個動作:
-
如果叢集使用 EC2-VPC 平台,請以傳回
Destination Unreachable的傳入自訂「網際網路控制訊息通訊協定 (ICMP)」規則來設定 Amazon VPC 安全群組。此規則會藉以指示原始主機沿著網路路徑使用最低的 MTU 大小。如需此方法的詳細資訊,請參閱將安全群組設為允許 ICMP「無法觸達目標」。 -
如果叢集使用 EC2-Classic 平台,或您無法允許 ICMP 傳入規則,請停用 TCP/IP 巨型訊框,以便使用乙太網路 v2 訊框。如需此方法的詳細資訊,請參閱設定執行個體的 MTU。
將安全群組設為允許 ICMP「無法觸達目標」
在兩個主機之間的網路中,當 MTU 大小出現差異時,首先請確定網路設定並未禁止路徑 MTU 探索 (PMTUD)。PMTUD 可讓接收端主機向原始主機回應下列 ICMP 訊息:Destination Unreachable: fragmentation
needed and DF set (ICMP Type 3, Code 4)。此訊息指示原始主機沿著網路路徑,使用最低的 MTU 大小來重新傳送請求。如果不這樣協議,可能會因為請求太大,使得接收端主機無法接受,而發生封包捨棄。如需此 ICMP 訊息的相關資訊,請前往網際網路工程任務組 (IETF) 網站上的 RFC792
如果您沒有明確為 Amazon VPC 安全群組設定此 ICMP 傳入規則,則會封鎖 PMTUD。在 AWS 中,安全群組是虛擬防火牆,可針對執行個體的傳入及傳出流量來指定規則。如需 Amazon Redshift 叢集安全群組的相關資訊,請參閱 Amazon Redshift 安全群組。對於使用 EC2-VPC 平台的叢集,Amazon Redshift 會使用 VPC 安全群組來允許或拒絕流量進入叢集。根據預設,安全群組會鎖定並拒絕所有傳入流量。如需如何為 EC2-Classic 或 EC2-VPC 執行個體設定傳入和傳出規則的相關資訊,請參閱《Amazon EC2 使用者指南》中的 EC2-Classic 與 VPC 中的執行個體差異。
如需如何將規則新增至 VPC 安全群組的相關資訊,請參閱VPC security groups (VPC 安全群組)。如需此規則中所需特定 PMTUD 設定的相關資訊,請參閱《Amazon EC2 使用者指南》中的路徑 MTU 探索。
設定執行個體的 MTU
在某些情況下,您的叢集可能會使用 EC2-Classic 平台,或您無法允許傳入流量的自訂 ICMP 規則。在這些情況下,我們建議您將連線到 Amazon Redshift 叢集之 EC2 執行個體的網路界面 (NIC) 上的 MTU 調整為 1500。此調整會停用 TCP/IP 巨型訊框,以確保連線始終使用相同的封包大小。不過,此選項會完全地降低執行個體的最大網路輸送量,而不只是 Amazon Redshift 的連線而已。如需詳細資訊,請參閱下列程序。
在 Microsoft Windows 作業系統上設定 MTU
如果用戶端在 Microsoft Windows 作業系統中執行,您可以使用 netsh 命令來檢閱並設定乙太網路卡的 MTU 值。
-
執行下列命令來判斷目前的 MTU 值:
netsh interface ipv4 show subinterfaces -
在輸出中檢閱
MTU界面卡的Ethernet值。 -
如果值不是
1500,請執行下列命令來設定此值:netsh interface ipv4 set subinterface "Ethernet" mtu=1500 store=persistent設定此值之後,請重新啟動電腦以讓變更生效。
在 Linux 作業系統上設定 MTU
如果用戶端在 Linux 作業系統中執行,您可以使用 ip 命令來檢閱並設定 MTU 值。
-
執行下列命令來判斷目前的 MTU 值:
$ ip link show eth0 -
在輸出中檢閱
mtu後面的值。 -
如果值不是
1500,請執行下列命令來設定此值:$ sudo ip link set dev eth0 mtu 1500
在 Mac 作業系統上設定 MTU
-
遵循 MacOS 支援網站上有關
How to change the MTU for troubleshooting purposes的指示進行操作。如需詳細資訊,請搜尋支援網站。
設定 JDBC 擷取大小參數
依預設,JDBC 驅動程式會一次收集查詢的所有結果。因此,嘗試透過 JDBC 連線擷取大型結果集時,您可能會遇到用戶端記憶體不足錯誤。若要讓您的用戶端批次擷取 (而非以單一的全有或全無擷取) 結果集,請在您的用戶端應用程式設定 JDBC 擷取大小參數。
注意
ODBC 不支援擷取大小。
為求最佳效能,請將擷取大小設定為不會導致記憶體不足錯誤的最高值。較低的擷取大小值會造成更多伺服器來回行程,進而延長執行時間。伺服器會預留資源,包括 WLM 查詢位置和關聯的記憶體,直到用戶端擷取整個結果集或查詢取消為止。適當地調校擷取大小時,那些資源會更快速釋出,使得它們可供其他查詢使用。
注意
如果您必須擷取大型資料集,建議使用 UNLOAD 陳述式來將資料傳輸至 Amazon S3。使用 UNLOAD 時,運算節點會平行運作,以加速資料的傳輸。
如需設定 JDBC 擷取大小參數的相關資訊,請前往 PostgreSQL 文件中的根據游標取得結果