針對連線問題進行偵錯

Cloud SQL 的連線診斷功能可讓您找出並解決網路連線、用戶端授權和使用者驗證等方面的資料庫連線失敗問題。您可以根據指定的疑難排解檢查清單評估設定,並使用 Connectivity Tests、Cloud Logging 或 tcpdump 等工具檢查流量,找出根本原因。

連線問題檢查清單

錯誤訊息

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

其他連線問題疑難排解

如需其他問題的解決方法,請參閱疑難排解頁面的「 連線能力」一節。

常見連線問題

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

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

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

確認您的憑證未過期

如果執行個體已設為使用 SSL,請前往 Google Cloud 控制台的 Cloud SQL 執行個體頁面,然後開啟執行個體。開啟「Connections」(連線) 頁面,選取「Security」(安全性) 分頁標籤,確認伺服器憑證有效。如果憑證已過期,請新增憑證並輪替。

確認您已取得連線授權

如果連線失敗,請確認您有權連線:

  • 如果無法使用 IP 位址連線 (例如從地端部署環境使用 mysql 用戶端連線),請確認連線來源 IP 位址有權連線至 Cloud SQL 執行個體。

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

    根據預設,Cloud SQL 不會從虛擬私有雲辨識非 RFC 1918 子網路路徑。您必須更新與 Cloud SQL 的網路對等互連,才能匯出任何非 RFC 1918 路徑。例如:

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

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

確認連線方式

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

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)

當您連線時,請確認您已取得密碼。

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

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)

當您連線時,請確認使用正確的密碼,且如果執行個體需要透過 SSL 連線,請以此方式連線。

判斷連線的啟動方式

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

SHOW PROCESSLIST;

如果連線顯示 IP 位址 (例如 1.2.3.4),表示是使用 IP 連線。與 cloudsqlproxy~1.2.3.4 的連線是使用 Cloud SQL Auth Proxy,或源自 App Engine。部分內部 Cloud SQL 程序可能會使用來自 localhost 的連線。

連線限制

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

資料庫連線會耗用伺服器和連線應用程式的資源。請務必採用良好的連線管理做法,盡可能減少應用程式的資源用量,並降低超出 Cloud SQL 連線限制的可能性。詳情請參閱「管理資料庫連線」。

顯示連線與執行緒

如果收到「連線數量過多」錯誤訊息,或想瞭解執行個體上發生的情況,可以使用 SHOW PROCESSLIST 顯示連線和執行緒數量。

從 MySQL 用戶端,執行:

mysql> SHOW PROCESSLIST;

輸出內容大致如下:

+----+-----------+--------------+-----------+---------+------+-------+----------------------+
| Id | User      | Host         | db        | Command | Time | State | Info                 |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
|  3 | user-name | client-IP    | NULL      | Query   |    0 | NULL  | SHOW processlist     |
|  5 | user-name | client-IP    | guestbook | Sleep   |    1 |       | SELECT * from titles |
| 17 | user-name | client-IP    | employees | Query   |    0 | NULL  | SHOW processlist     |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
3 rows in set (0.09 sec)

如要瞭解如何解讀 PROCESSLIST 傳回的資料欄,請參閱 MySQL 參考資料。

如要取得執行緒數量,可以使用:

mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';

輸出內容大致如下:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 7     |
+-------------------+-------+
1 row in set (0.08 sec)

連線逾時 (從 Compute Engine)

如果 Compute Engine 執行個體閒置 10 分鐘,連線就會逾時,這可能會影響 Compute Engine 執行個體和 Cloud SQL 執行個體之間長期未使用的連線。詳情請參閱 Compute Engine 說明文件中的「網路和防火牆」。

如要讓長期未使用的連線保持運作,可以設定 TCP 保持運作。下列指令會將 TCP 保持運作值設為一分鐘,並在執行個體重新啟動時永久保留設定。

顯示目前的 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

使用 IPv6 連線

如果您收到以下任一錯誤訊息

Can't connect to MySQL server on '2001:1234::4321' (10051)
Can't connect to MySQL server on '2001:1234::4321' (101)

當您連線時,您可能嘗試連線至執行個體的 IPv6 位址,但工作站上沒有可用的 IPv6。您可以前往 ipv6.google.com,確認工作站是否支援 IPv6。如果無法載入,表示您無法使用 IPv6。請改為連線至 IPv4 位址或 Cloud SQL 執行個體。您可能需要先為執行個體新增 IPv4 位址。

偶爾連線失敗 (舊版高可用性)

Cloud SQL 因維護事件而重新啟動執行個體時,連線可能會轉送至容錯移轉副本。連線至容錯移轉副本時:

  • 用戶端使用未加密連線傳送的讀取要求會正常執行。不過,寫入要求會失敗並傳回錯誤訊息,例如「Error 1290: The MySQL server is running with the --read-only option so it cannot execute this statement.」(錯誤 1290:MySQL 伺服器正在執行 --read-only 選項,因此無法執行這個陳述式)。
  • 用戶端使用加密連線提出的讀取和寫入要求失敗,並傳回錯誤訊息,例如「x509: certificate is valid for master-instance, not failover-instance」。

事件結束後,Cloud SQL 會重設連線。重試連線。建議您在設計應用程式時,採用指數輪詢等錯誤處理策略,以便處理偶爾發生的連線失敗。詳情請參閱「應用程式導入」。

連線偵錯工具

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。

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

使用 Connectivity Tests 進行測試

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

測試連線

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

判斷應用程式的 IP 位址

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

  • 如果電腦未設有 Proxy 或防火牆,請登入電腦,並使用「我的 IP 是什麼?」網站,判斷其 IP 位址。
  • 如果電腦位於 Proxy 或防火牆後方,請登入電腦,並使用 whatismyipaddress.com 等工具或服務,判斷其真實 IP 位址。

開啟本機通訊埠

如要確認主機是否在您預期的通訊埠上監聽,請執行 ss -tunlp4 指令。這會顯示哪些通訊埠已開啟並正在監聽。 舉例來說,如果您有執行中的 MySQL 資料庫,則通訊埠 3306 應處於啟動和監聽狀態。如果是 SSH,應該會看到通訊埠 22。

所有本機通訊埠活動

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

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

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

舉例來說,如果 Cloud SQL 執行個體執行 MySQL 資料庫,您應該可以透過通訊埠 3306 進行 telnet:telnet 35.193.198.159 3306。

成功後,您會看到以下內容:

Trying 35.193.198.159...

Connected to 35.193.198.159. 。

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

Trying 35.193.198.159...

^C. 。

Cloud Logging

Cloud SQL 使用 Cloud Logging,可讓您儲存、搜尋、分析、監控記錄資料,並接收相關警告。詳情請參閱 Cloud Logging 說明文件。如需分析 Cloud SQL 記錄檔的查詢清單,請參閱「Cloud SQL 查詢範例」。

查看記錄

您可以查看 Cloud SQL 執行個體和其他 Google Cloud專案 (例如 Cloud VPN 或 Compute Engine 執行個體) 的記錄。如要查看 Cloud SQL 執行個體記錄項目的記錄,請按照下列步驟操作:

控制台

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

    前往 Cloud Logging

  2. 在頁面頂端選取現有的 Cloud SQL 專案。
  3. 在查詢建立工具中,新增下列內容:
    • 資源:選取「Cloud SQL 資料庫」。在對話方塊中選取 Cloud SQL 執行個體。
    • 記錄檔名稱:捲動至「Cloud SQL」部分,然後選取執行個體適用的記錄檔。例如:
      • cloudsql.googlapis.com/mysql-general.log
      • cloudsql.googleapis.com/mysql.err
    • 嚴重性:選取記錄層級。
    • 日期範圍:選取預設範圍或建立自訂範圍。

gcloud

使用 gcloud logging 指令查看記錄項目。在以下範例中,請替換 PROJECT_ID。limit 旗標是選用參數,用於指定要傳回的項目數量上限。

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

私人 IP 位址

使用私人 IP 位址連至 Cloud SQL 執行個體的連線,會自動獲得 RFC 1918 位址範圍的授權。非 RFC 1918 位址範圍必須在 Cloud SQL 中設為授權網路。您也需要更新與 Cloud SQL 的網路對接,匯出所有非 RFC 1918 路徑。例如:

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

診斷虛擬私有雲網路和私人 IP 連線失敗

透過虛擬私有雲網路 (例如使用私人服務存取權或虛擬私有雲網路對接) 連線至 Cloud SQL 執行個體或從中連線時,連線失敗通常會產生一般的「連線逾時」或「連線遭拒」錯誤,而不會指出根本原因。

如要診斷連線失敗的原因 (例如流量是否遭到防火牆規則、缺少路徑或未啟用的對等互連封鎖),請使用 Network Intelligence Center Connectivity Tests。

執行 Connectivity Tests

您可以測試用戶端 VM 執行個體與 Cloud SQL 執行個體之間的連線,也可以反向測試,例如在遷移期間從 Cloud SQL 連線至來源資料庫:

控制台

  1. 前往 Google Cloud 控制台的「Connectivity Tests」頁面:

    前往「Connectivity Tests」頁面

  2. 按一下「Create connectivity test」(建立連線能力測試)。
  3. 在「來源」下方:
    • 指定來源端點 (例如用戶端 Compute Engine VM 執行個體或 IP 位址和虛擬私有雲網路)。
  4. 在「目的地」下方:
    • 指定目的地端點:
      • IP 位址:輸入 Cloud SQL 執行個體的私人 IP 位址。
      • 「網路」:選取虛擬私有雲網路。
      • 通訊埠:輸入資料庫通訊埠 (MySQL 為 3306、PostgreSQL 為 5432,SQL Server 則為 1433)。
      • 「Protocol」(通訊協定):選取「TCP」。
  5. 點選「建立」。
  6. 查看測試結果:
    • 可連線:來源和目的地之間的網路路徑已開啟。如果仍無法連線,請確認資料庫使用者憑證,並確認資料庫程序正在執行。
    • 無法連線 / 已捨棄:展開追蹤記錄詳細資料,查看流量捨棄的確切躍點:
      • 遭防火牆捨棄:檢查追蹤記錄中顯示的防火牆規則,並在目的地網路中,為資料庫通訊埠新增輸入允許規則。
      • 沒有路由:確認自訂路由已透過虛擬私有雲網路對接連線匯出及匯入。
      • 對接未啟用:確認兩個網路的虛擬私有雲網路對接連線都處於 ACTIVE 狀態。

gcloud

  1. 啟用 Network Management API:
    gcloud services enable networkmanagement.googleapis.com --project=PROJECT_ID
        
  2. 建立並執行 Connectivity Tests,從來源 VM 或 IP 連至 Cloud SQL 執行個體:
    gcloud network-management connectivity-tests create TEST_NAME \
        --project=PROJECT_ID \
        --source-network=projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME \
        --source-ip=SOURCE_IP \
        --destination-ip=INSTANCE_PRIVATE_IP \
        --destination-port=DB_PORT \
        --protocol=TCP \
        --round-trip
        

    更改下列內容:

    • TEST_NAME:測試名稱,例如 cloudsql-vpc-test。
    • SOURCE_IP:用戶端 VM 的內部 IP 位址。
    • INSTANCE_PRIVATE_IP:Cloud SQL 執行個體的私人 IP 位址。
    • DB_PORT:資料庫通訊埠 (MySQL 為 3306、PostgreSQL 為 5432,SQL Server 則為 1433)。
  3. 查看診斷追蹤記錄和捨棄原因:
    gcloud network-management connectivity-tests describe TEST_NAME \
        --project=PROJECT_ID
        

    輸出內容會指出封包是否到達目的地,或是在何處遭到捨棄 (例如特定防火牆規則或遺失的路由)。

驗證虛擬私有雲網路對接和防火牆規則

如果連線能力測試顯示封包遺失,或您無法建立連線,請確認下列事項:

  • 虛擬私有雲網路對接狀態:確認對接連線狀態為 ACTIVE:
    gcloud compute networks peerings list \
        --network=VPC_NETWORK_NAME \
        --project=PROJECT_ID
        
  • 交換的路徑:查看透過對接連線交換的路徑:
    gcloud compute networks peerings list-routes PEERING_NAME \
        --network=VPC_NETWORK_NAME \
        --region=REGION \
        --direction=OUTGOING \
        --project=PROJECT_ID
        
  • 輸入防火牆規則:確認虛擬私有雲網路設有輸入規則,允許來自用戶端 IP 範圍的資料庫通訊埠流量:
    gcloud compute firewall-rules list \
        --project=PROJECT_ID \
        --filter="network:VPC_NETWORK_NAME AND allowed[].ports:DB_PORT"
        

VPN 疑難排解

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