針對連線問題進行偵錯

簡介

一般來說,連線問題可分為以下三類:

  • 連線中 - 你是否能透過網路連線至執行個體?
  • 授權 - 您是否已獲得連線至執行個體的授權?
  • 驗證 - 資料庫是否接受您的資料庫憑證?

每個類別都可以進一步細分為不同的調查路徑。下一節列出一些問題,可協助您進一步縮小問題範圍:

連線問題檢查清單

錯誤訊息

如需特定 API 錯誤訊息,請參閱「錯誤訊息」參考頁面。

其他連線疑難排解方式

如遇其他問題,請參閱疑難排解頁面的「連線」一節。

常見連線問題

確認您的應用程式正確關閉連線

如果看到含有「Aborted connection nnnn to db:」的錯誤,通常表示應用程式未正確停止連線。網路問題也可能導致這項錯誤。此錯誤並不表示您的 Cloud SQL 執行個體有問題。建議您也執行 tcpdump 檢查封包,追蹤問題來源。

如需連線管理最佳做法的範例,請參閱管理資料庫連線一文。

確認您的憑證未過期

如果執行個體設定為使用安全資料傳輸層 (SSL),請前往 Google Cloud console 中的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面並開啟執行個體。開啟執行個體的「Connections」(連線設定) 頁面,選取「Security」(安全性) 分頁,確認您的伺服器憑證有效。如果憑證已過期,您必須新增憑證並切換至這個新憑證。

確認您已取得連線授權

如果連線失敗,請檢查您是否已取得連線授權:

  • 如果您在使用 IP 位址連線時遇到問題 (例如從內部環境連線至 psql 用戶端),請確保您連線的 IP 位址已取得連線授權,可供您連線至 Cloud SQL 執行個體。

    使用私人 IP 位址連線至 Cloud SQL 執行個體時,系統會自動授權 RFC 1918 位址範圍。這樣一來,所有私人用戶端都能存取資料庫,不必經過 Cloud SQL 驗證 Proxy。非 RFC 1918 位址範圍必須設定為授權網路

    Cloud SQL 預設不會從虛擬私有雲得知非 RFC 1918 子網路路徑。您需要更新 Cloud SQL 的網路對等互連,才能匯出任何非 RFC 1918 路徑。例如:

    gcloud compute networks peerings update cloudsql-postgres-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
  • 這是您目前的 IP 位址

  • 嘗試用 gcloud sql connect 連線到您的執行個體。這項指令會暫時授權您的 IP 位址。您可以在已安裝 gcloud CLI 和 psql 用戶端的環境中執行這項指令。您也可以在 Cloud Shell 中執行這項指令。Cloud Shell 位於Google Cloud 控制台中,且已預先安裝 gcloud CLI 和 psql 用戶端。Cloud Shell 提供 Compute Engine 執行個體,可用於連線至 Cloud SQL。
  • 暫時授權 0.0.0.0/0,允許所有 IP 位址連線至執行個體。

確認連線方式

如果您收到類似這樣的錯誤訊息:

FATAL: database `user` does not exist.

gcloud sql connect --user 指令只能搭配預設使用者 (postgres) 使用。解決方法是使用預設使用者連線,然後使用 "\c" psql 指令以其他使用者身分重新連線。

判斷連線的啟動方式

如要查看目前連線的相關資訊,請連線至資料庫並執行下列指令:

SELECT * from pg_stat_activity ;

顯示 IP 位址 (例如 1.2.3.4) 的連線是使用 IP 連線的。透過 cloudsqlproxy~1.2.3.4 的連線使用 Cloud SQL 驗證 Proxy,否則連線就是來自 App Engine。localhost 的連線可能供某些內部 Cloud SQL 程序使用。

連線限制

Cloud SQL 執行個體沒有 QPS 限制,但是有連線、大小與 App Engine 特定限制。請參閱配額與限制一文。

資料庫連線會耗用伺服器與連線中應用程式的資源,因此請務必要使用合適的連線管理做法,以便將應用程式耗用的資源降到最低,同時降低超過 Cloud SQL 連線限制的可能性。詳情請參閱「管理資料庫連線」。

顯示連線與執行緒

如要查看對資料庫執行的程序,請使用 pg_stat_activity 資料表:

select * from pg_stat_activity;

連線逾時 (從 Compute Engine)

內含 Compute Engine 執行個體的連線會在閒置 10 分鐘後逾時,這可能會影響 Compute Engine 執行個體與 Cloud SQL 執行個體之間長時間不使用的連線。詳情請參閱 Compute Engine 說明文件中的「網路與防火牆」一文。

如要讓長時間未使用的連線保持運作,可以設定 TCP Keepalive。 以下指令可將 TCP Keepalive 值設定為一分鐘,並使設定在執行個體重新啟動後仍然有效。

顯示目前的 tcp_keepalive_time 值。

cat /proc/sys/net/ipv4/tcp_keepalive_time

將 tcp_keepalive_time 設為 60 秒,並確保重新啟動後仍有效。

echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

套用變更。

sudo /sbin/sysctl --load=/etc/sysctl.conf

顯示 tcp_keepalive_time 值,確認變更已套用。

cat /proc/sys/net/ipv4/tcp_keepalive_time

連線偵錯工具

tcpdump

tcpdump 是用來擷取封包的工具。我們強烈建議您在偵錯連線問題時執行 tcpdump,擷取並檢查主機與 Cloud SQL 執行個體之間的封包。

找出本機 IP 位址

如果您不知道主機的本機位址,請執行 ip -br address show 指令。在 Linux 上,這會顯示網路介面、介面狀態、本機 IP 和 MAC 位址。例如: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64

或者,您也可以執行 ipconfigifconfig,查看網路介面狀態。

使用連線能力測試進行測試

連線測試是一種診斷工具,可檢查網路中端點之間的連線。系統會分析設定,有時還會執行執行階段驗證。目前支援 Cloud SQL。請按照這些操作說明,使用 Cloud SQL 執行個體執行測試。

測試連線

您可以使用 psql 用戶端,測試您從本機環境建立連線的能力。詳情請參閱使用 IP 位址連線 psql 用戶端使用 Cloud SQL Auth Proxy 連線 psql 用戶端

確認應用程式的 IP 位址

如要確認執行應用程式的電腦所使用的 IP 位址,以便您能夠授權該位址存取 Cloud SQL 執行個體,請使用下列一項選項:

  • 如果電腦並非位於 Proxy 或防火牆後端,請登入電腦並使用「我的 IP 位址是什麼?」網站,確認其 IP 位址。
  • 如果電腦位於 Proxy 或防火牆後端,請登入該電腦,並使用 whatismyipaddress.com 等工具或服務來確認電腦真正的 IP 位址。

開啟本機通訊埠

如要確認主機正在監聽您認為的通訊埠,請執行 ss -tunlp4 指令。這會顯示開啟及接聽的連接埠。 舉例來說,如果您正在執行 PostgreSQL 資料庫,通訊埠 5432 應會啟動並接聽。如果是 SSH,您應該會看到通訊埠 22。

所有本機通訊埠活動

使用 netstat 指令查看所有本機連接埠活動。舉例來說,netstat -lt 會顯示目前所有作用中的連接埠。

使用 Telnet 連線至 Cloud SQL 執行個體

如要確認是否能使用 TCP 連線至 Cloud SQL 執行個體,請執行 telnet 指令。Telnet 會嘗試連線至您提供的 IP 位址和通訊埠。

舉例來說,如果 Cloud SQL 執行個體正在執行 PostgreSQL 資料庫,您應該就能透過通訊埠 5432 Telnet 連線至該執行個體: telnet 35.193.198.159 5432

成功後,您會看到以下訊息:

Trying 35.193.198.159...

Connected to 35.193.198.159.

如果失敗,您會看到 telnet 停止回應,直到您強制關閉嘗試為止:

Trying 35.193.198.159...

^C.

用戶端驗證

用戶端驗證是由名為 pg_hba.conf 的設定檔控管 (HBA 代表以主機為準的驗證)。

請確認來源資料庫的 pg_hba.conf 檔案中的複製連線區段已更新,以便接受來自 Cloud SQL 虛擬私有雲 IP 位址範圍的連線。

Cloud Logging

Cloud SQL 和 Cloud SQL 會使用 Cloud Logging。如需完整資訊,請參閱 Cloud Logging 說明文件,並查看 Cloud SQL 查詢範例

查看記錄

您可以查看 Cloud SQL 執行個體和其他專案 (例如 Cloud VPN 或 Compute Engine 執行個體) 的記錄。 Google Cloud如要查看 Cloud SQL 執行個體記錄檔項目的記錄:

控制台

  1. 前往 Google Cloud 控制台的「Cloud Logging」頁面。

    前往 Cloud Logging

  2. 在頁面頂端選取現有的 Cloud SQL 專案。
  3. 在查詢建立工具中新增下列項目:
    • 資源:選取「Cloud SQL 資料庫」。在對話方塊中,選取 Cloud SQL 執行個體。
    • 記錄名稱:捲動至 Cloud SQL 區段,然後選取執行個體的適當記錄檔。例如:
      • cloudsql.googleapis.com/postgres.log
    • 嚴重性:選取記錄層級。
    • 時間範圍:選取預設範圍或建立自訂範圍。

gcloud

使用 gcloud logging 指令查看記錄項目。在下方範例中,請將 PROJECT_ID 換成您的 API 金鑰。limit 標記是選用參數,表示要傳回的項目數量上限。

gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/postgres.log" \
--limit=10

私人 IP 位址

使用私人 IP 位址連線至 Cloud SQL 執行個體時,系統會自動授權 RFC 1918 位址範圍。您必須在 Cloud SQL 中將非 RFC 1918 位址範圍設定為授權網路。您也需要更新 Cloud SQL 的網路對等互連,才能匯出任何非 RFC 1918 路徑。例如:

gcloud compute networks peerings update cloudsql-postgres-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID

排解 VPN 問題

請參閱 Cloud VPN 疑難排解頁面。