簡介
一般來說,連線問題可分為下列三種:
- 連線 - 你是否能透過網路連上例項?
- 授權 - 您是否已獲得連線至執行個體的授權?
- 驗證 - 資料庫是否接受您的資料庫憑證?
每個類別都可以進一步細分為不同的調查路徑。下一節列出一些問題,可協助您進一步縮小問題範圍:
連線問題檢查清單
- 連線中
- 私人 IP
- 您是否已為專案啟用
Service Networking API? - 您是否使用 Shared VPC?
- 您的使用者或服務帳戶是否具備管理私人服務存取權連線的必要 IAM 權限?
- 專案是否已設定私人服務連線?
- 您是否已為私人連線分配 IP 位址範圍?
- 您分配的 IP 位址範圍是否包含至少 /24 的空間,可供您在每個區域中建立 sqlserver 執行個體?
- 如果您要為 sqlserver 執行個體指定已分配的 IP 位址範圍,該範圍是否包含至少 /24 的空間,可供您在該範圍內建立 sqlserver 執行個體的每個區域使用?
- 是否已建立私人連線?
- 如果私人連線已變更,虛擬私有雲對等互連是否已更新?
- VPC 記錄是否指出任何錯誤?
- 來源機器的 IP 是否為非 RFC 1918 位址?
- 您是否已執行連線測試來追蹤封包路徑,並檢查是否有封包遭到捨棄?
- 公開 IP
- 授權
- Cloud SQL Auth Proxy
- Cloud SQL Auth Proxy 是否為最新版本?
- Cloud SQL 驗證 Proxy 是否正在執行?
- Cloud SQL Auth Proxy 連線指令中的執行個體連線名稱是否正確?
- 您是否已檢查 Cloud SQL 驗證 Proxy 的輸出內容?將輸出內容導向檔案,或在啟動 Cloud SQL Auth Proxy 的 Cloud Shell 終端機中查看。
- 您的使用者或服務帳戶是否具備連線至 Cloud SQL 執行個體的必要 IAM 權限?
- 您是否已為專案啟用
Cloud SQL Admin API? - 如果您有輸出防火牆政策,請確認政策允許連線至目標 Cloud SQL 執行個體的 3307 連接埠。
- 如要使用 UNIX 網域通訊端連線,請列出啟動 Cloud SQL Auth Proxy 時以 -dir 指定的目錄,確認通訊端已建立。
- Cloud SQL 連接器和特定語言的程式碼
- 自行管理的 SSL/TLS 憑證
- 伺服器憑證是否仍有效?
- 已授權網路
- 是否包含來源 IP 位址?
- 您是否使用非 RFC 1918 IP 位址?
- 您是否使用不支援的 IP 位址?
- 連線失敗
- 驗證中
- 原生資料庫驗證 (使用者名稱/密碼)
- 你是否看到
access denied錯誤? - 使用者名稱和密碼是否正確?
錯誤訊息
如需特定 API 錯誤訊息,請參閱「錯誤訊息」參考頁面。
其他連線疑難排解方式
如遇其他問題,請參閱疑難排解頁面的「 連線」一節。
常見連線問題
確認您的應用程式正確關閉連線
如果看到含有「Aborted connection nnnn to db:」的錯誤,通常表示應用程式未正確停止連線。網路問題也可能導致這項錯誤。這個錯誤並不代表 Cloud SQL 執行個體有問題,建議您也執行 tcpdump 檢查封包,追蹤問題來源。
如需連線管理最佳做法的範例,請參閱「管理資料庫連線」。
確認您的憑證未過期
如果執行個體已設定為使用 SSL,請前往 Google Cloud 控制台的 Cloud SQL 執行個體頁面,然後開啟執行個體。開啟其「連線」頁面,選取「安全性」分頁標籤,並確認伺服器憑證有效。如果憑證已過期,請新增憑證並輪替使用。
確認您已取得連線授權
如果連線失敗,請確認您已獲得連線授權:
- 如果無法使用 IP 位址連線 (例如從地端部署環境使用 sqlcmd 用戶端連線),請確認您用來連線的 IP 位址已獲授權可連線至 Cloud SQL 執行個體。
使用私人 IP 位址連線至 Cloud SQL 執行個體時,系統會自動授權 RFC 1918 位址範圍。這樣一來,所有私人用戶端都能存取資料庫,不必經過 Cloud SQL Auth Proxy。非 RFC 1918 位址範圍必須設為授權網路。
根據預設,Cloud SQL 不會從 VPC 學習非 RFC 1918 子網路路徑。如要匯出任何非 RFC 1918 路由,您必須更新與 Cloud SQL 的網路對等互連。例如:
gcloud compute networks peerings update cloudsql-mysql-googleapis-com \ --network=NETWORK \ --export-subnet-routes-with-public-ip \ --project=PROJECT_ID
這是您目前的 IP 位址。
判斷連線的啟動方式
連線至資料庫並執行下列指令,即可查看目前連線的相關資訊:
sp_who go
顯示 IP 位址的連線 (例如 1.2.3.4) 是透過 IP 連線。連線 (cloudsqlproxy~1.2.3.4) 使用 Cloud SQL Auth Proxy,否則連線來自 App Engine。localhost 的連線可能供某些內部 Cloud SQL 程序使用。
連線限制
Cloud SQL 執行個體沒有 QPS 限制,但是有連線、大小與 App Engine 特定限制。請參閱配額與限制一文。
資料庫連線會耗用伺服器和連線應用程式的資源。請務必採用良好的連線管理做法,盡量減少應用程式的資源用量,並降低超出 Cloud SQL 連線限制的可能性。詳情請參閱「管理資料庫連線」。
顯示連線與執行緒
如要查看資料庫上執行的程序,請連線至資料庫並執行下列指令:sp_who go
如要瞭解如何解讀 sp_who 傳回的資料欄,請參閱 SQL Server 參考資料。
連線逾時 (來自 Compute Engine)
如果連線閒置 10 分鐘,Compute Engine 執行個體就會連線逾時,這可能會影響 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偵錯連線的工具
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,查看網路介面狀態。
使用連線測試進行測試
連線測試是一項診斷工具,可檢查網路中端點之間的連線。系統會分析設定,有時還會執行執行階段驗證。目前支援 Cloud SQL。請按照這些指示,使用 Cloud SQL 執行個體執行測試。
測試連線
您可以使用 sqlcmd 用戶端,測試能否從本機環境連線。詳情請參閱「使用 IP 位址連線至 sqlcmd 用戶端」和「使用 Cloud SQL Auth Proxy 連線至 sqlcmd 用戶端」。
判斷應用程式的 IP 位址
如要確認執行應用程式的電腦所使用的 IP 位址,以便您能夠授權該位址存取 Cloud SQL 執行個體,請使用下列一項選項:
- 如果電腦沒有使用 Proxy 或防火牆,請登入電腦並使用「我的 IP 是什麼?」 網站判斷 IP 位址。
- 如果電腦位於 Proxy 或防火牆後方,請登入電腦,並使用 whatismyipaddress.com 等工具或服務,判斷電腦的真實 IP 位址。
開啟本機通訊埠
如要確認主機正在監聽您認為的通訊埠,請執行 ss -tunlp4 指令。這會顯示哪些通訊埠已開啟並正在接聽。
所有本機通訊埠活動
使用 netstat 指令查看所有本機連接埠活動。舉例來說,netstat -lt 會顯示目前所有作用中的連接埠。
使用 telnet 連線至 Cloud SQL 執行個體
如要確認是否能使用 TCP 連線至 Cloud SQL 執行個體,請執行 telnet 指令。Telnet 會嘗試連線至您提供的 IP 位址和通訊埠。
成功後,您會看到以下訊息:
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 執行個體和其他專案 (例如 Cloud VPN 或 Compute Engine 執行個體) 的記錄。 Google Cloud如要查看 Cloud SQL 執行個體記錄檔項目,請按照下列步驟操作:
控制台
-
前往 Google Cloud 控制台的「Cloud Logging」頁面。
- 在頁面頂端選取現有的 Cloud SQL 專案。
- 在查詢建立工具中新增下列項目:
- 資源:選取「Cloud SQL 資料庫」。在對話方塊中,選取 Cloud SQL 執行個體。
- 記錄名稱:捲動至 Cloud SQL 專區,然後選取執行個體的適當記錄檔。例如:
- 嚴重性:選取記錄層級。
- 時間範圍:選取預設範圍或建立自訂範圍。
gcloud
使用 gcloud logging 指令查看記錄項目。在下方範例中,請替換 PROJECT_ID。limit 旗標是選用參數,表示要傳回的項目數量上限。
私人 IP 位址
使用私人 IP 位址連線至 Cloud SQL 執行個體時,系統會自動授權 RFC 1918 位址範圍。您必須在 Cloud SQL 中將非 RFC 1918 位址範圍設為授權網路。您也需要更新 Cloud SQL 的網路對等互連,匯出所有非 RFC 1918 路徑。例如:
gcloud compute networks peerings update cloudsql-sqlserver-googleapis-com
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID
診斷虛擬私有雲網路和私人 IP 連線失敗問題
透過虛擬私有雲網路連線至 Cloud SQL 執行個體或從該執行個體連線時 (例如透過私人服務存取或虛擬私有雲網路對等互連),連線失敗通常會產生一般「連線逾時」或「連線遭拒」錯誤,而不會指出根本原因。
如要診斷連線失敗的原因 (例如流量是否遭到防火牆規則封鎖、缺少路徑或對等互連處於非使用中狀態),請使用 Network Intelligence Center Connectivity Tests。
執行連線能力測試
您可以測試從用戶端 VM 執行個體到 Cloud SQL 執行個體的連線 (或反向連線,例如從 Cloud SQL 連線至遷移期間的來源資料庫):
控制台
- 前往 Google Cloud 控制台的「Connectivity Tests」頁面:
- 按一下「建立連線能力測試」。
- 在「來源」下方:
- 指定來源端點 (例如用戶端 Compute Engine VM 執行個體或 IP 位址和虛擬私有雲網路)。
- 在「目的地」下方:
- 指定目的地端點:
- IP 位址:輸入 Cloud SQL 執行個體的私人 IP 位址。
- 「網路」:選取虛擬私有雲網路。
- 連接埠:輸入資料庫連接埠 (MySQL 為
3306、PostgreSQL 為5432,SQL Server 則為1433)。 - 「通訊協定」:選取
TCP。
- 指定目的地端點:
- 點選「建立」。
- 查看測試結果:
- 可連線:來源與目的地之間的網路路徑已開啟。如果還是無法連線,請確認資料庫使用者憑證,並確認資料庫程序正在執行。
- 無法連線 / 已捨棄:展開追蹤記錄詳細資料,查看流量遭捨棄的確切躍點:
- 遭防火牆捨棄:檢查追蹤記錄中顯示的防火牆規則,並在資料庫通訊埠的目的地網路中新增輸入允許規則。
- 沒有路徑:確認自訂路徑已透過 VPC 網路對等互連連線匯出及匯入。
- 對等互連連線處於非啟用狀態:確認兩個網路中的虛擬私有雲網路對等互連連線都處於
ACTIVE狀態。
gcloud
- 啟用 Network Management API:
gcloud services enable networkmanagement.googleapis.com --project=PROJECT_ID
- 從來源 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
更改下列內容:
TEST_NAME:測試名稱,例如cloudsql-vpc-test。SOURCE_IP:用戶端 VM 的內部 IP 位址。INSTANCE_PRIVATE_IP:Cloud SQL 執行個體的私人 IP 位址。DB_PORT:資料庫連接埠 (MySQL 為3306、PostgreSQL 為5432,SQL Server 則為1433)。
- 查看診斷追蹤記錄和捨棄原因:
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 疑難排解」頁面。