簡介
一般來說,連線問題可分為以下三類:
- 連線:您是否能透過網路連上執行個體?
- 授權 - 您是否有權連線至執行個體?
- 驗證:資料庫是否接受您的資料庫憑證?
每個問題都可以進一步細分為不同的調查路徑。以下提供一些問題範例,供您自行思考,進一步縮小問題範圍:
連線問題檢查清單
- 連線中
- 私人 IP
- 您是否已為專案啟用
Service Networking API
? - 您是否使用共用虛擬私有雲?
- 您的使用者或服務帳戶是否具備必要的 IAM 權限,可管理私人服務存取連線?
- 專案是否已設定私人服務存取連線?
- 您是否為私人連線分配 IP 位址範圍?
- 您已分配的 IP 位址範圍是否包含您打算建立 MySQL 執行個體的每個區域至少一個 /24 空間?
- 如果您要為 MySQL 執行個體指定已分配的 IP 位址範圍,請問您在該範圍內規劃要建立 MySQL 執行個體的每個區域,是否至少包含 /24 個空間?
- 是否已建立私人連線?
- 如果私人連線有所變更,是否已更新 vpc-peerings?
- VPC 記錄是否顯示任何錯誤?
- 來源機器的 IP 位址是否為 非 RFC 1918 位址?
- 公開 IP
- 來源 IP 是否列為授權網路?
- 是否需要 SSL/TLS 憑證?
- 您的使用者或服務帳戶是否具備必要的 IAM 權限,可連線至 Cloud SQL 執行個體?
- 授權
- Cloud SQL 驗證 Proxy
- Cloud SQL 驗證 Proxy 是否保持最新狀態?
- Cloud SQL 驗證 Proxy 是否執行?
- 在 Cloud SQL 驗證 Proxy 連線指令中,是否正確建立執行個體連線名稱?
- 您是否檢查過 Cloud SQL 驗證 Proxy 的輸出內容?將輸出傳送至檔案,或者監看您啟動 Cloud SQL 驗證 Proxy 時所使用的 Cloud Shell 終端機。
- 您的使用者或服務帳戶是否具備必要的 IAM 權限,可連線至 Cloud SQL 執行個體?
- 您是否已為專案啟用
Cloud SQL Admin API
? - 如果您有傳出防火牆政策,請確定該政策允許連線至目標 Cloud SQL 執行個體的 3307 通訊埠。
- 如果您使用 UNIX 網域通訊端連線,請確認通訊端是透過列出您啟動 Cloud SQL 驗證 Proxy 時使用 -dir 指定的目錄建立。
- Cloud SQL 連接器和語言特定程式碼
- 自行管理的 SSL/TLS 憑證
- 已授權網路
- 是否包含來源 IP 位址?
- 您是否使用非 RFC 1918 IP 位址?
- 您是否使用系統不支援的 IP 位址?
- 連線失敗
- 驗證
- 原生資料庫驗證 (使用者名稱/密碼)
- 畫面上是否顯示
access denied
錯誤訊息? - 使用者名稱和密碼是否正確?
- IAM 資料庫驗證
- 您是否已在執行個體上啟用
cloudsql.iam_authentication
標記 ? - 您是否為帳戶新增政策繫結?
- 您是否使用 Cloud SQL 驗證 Proxy,並將
-enable_iam_login
或 Oauth 2.0 權杖做為資料庫密碼? - 如果您使用服務帳戶,是否使用縮短的電子郵件名稱?
- 進一步瞭解 PostgreSQL 中的 IAM 資料庫驗證機制。
錯誤訊息
如需特定 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 驗證 Proxy。非 RFC 1918 位址範圍必須設為授權網路。
根據預設,Cloud SQL 不會從 VPC 學習非 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 中執行這項指令,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 驗證 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 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
使用 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,請前往 ipv6.google.com。如果網頁無法載入,表示您無法使用 IPv6。請改為連線至 IPv4 位址或 Cloud SQL 執行個體。您可能需要先將 IPv4 位址新增至您的執行個體。
偶爾發生連線失敗 (舊版 HA)
當 Cloud SQL 因維護事件重新啟動執行個體時,連線可能會轉送至容錯備援複本。連線至備援複本時:
- 使用未加密連線的用戶端讀取要求會正常成功。不過,寫入要求會失敗並傳回錯誤訊息,例如「Error 1290:MySQL 伺服器以 --read-only 選項執行,因此無法執行此陳述式」。
- 使用加密連線的用戶端讀取和寫入要求失敗,並傳回錯誤訊息,例如「x509:憑證只對主例項有效,不適用於備援例項」。
事件結束後,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
,查看網路介面的狀態。
使用連線能力測試進行測試
連線能力測試是一種診斷工具,可讓您檢查網路端點之間的連線。系統會分析設定,在某些情況下還會執行執行階段驗證。目前支援 Cloud SQL。請按照這些操作說明,使用 Cloud SQL 執行個體執行測試。
測試連線
您可以使用 mysql 用戶端測試從本機環境建立連線的功能。詳情請參閱「使用 IP 位址連線 mysql 用戶端」和「使用 Cloud SQL 驗證 Proxy 連線 mysql 用戶端」。
確認應用程式的 IP 位址
如要確認執行應用程式的電腦所使用的 IP 位址,以便您能夠授權該位址存取 Cloud SQL 執行個體,請使用下列一項選項:
- 如果電腦並非位於 Proxy 或防火牆後端,請登入電腦並使用「What is my IP?」網站,判斷該網站的 IP 位址。
- 如果電腦位於 Proxy 或防火牆後端,請登入該電腦,並使用 whatismyipaddress.com 等工具或服務來確認電腦真正的 IP 位址。
開啟本機通訊埠
如要確認主機是否在您認為的通訊埠上監聽,請執行 ss -tunlp4
指令。這會告訴您哪些埠已開啟並處於偵聽狀態。舉例來說,如果您有執行中的 MySQL 資料庫,則通訊埠 3306 應處於啟用及偵聽狀態。針對 SSH,您應該會看到連接埠 22。
所有本機通訊埠活動
使用 netstat
指令查看所有本機埠活動。例如,netstat -lt
會顯示所有目前處於活動狀態的連接埠。
使用 telnet 連線至 Cloud SQL 執行個體
如要確認您能否使用 TCP
連線至 Cloud SQL 執行個體,請執行 telnet
指令。Telnet 會嘗試連線至您提供的 IP 位址和通訊埠。
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 SQL 會使用 Cloud Logging。如需完整資訊,請參閱 Cloud Logging 說明文件,並查看 Cloud SQL 查詢範例。
查看記錄
您可以查看 Cloud SQL 執行個體和其他 Google Cloud專案的記錄,例如 Cloud VPN 或 Compute Engine 執行個體。如要查看 Cloud SQL 執行個體記錄項目的記錄,請按照下列步驟操作:
控制台
-
在 Google Cloud 控制台中,前往「Cloud Logging」頁面。
- 在頁面頂端選取現有的 Cloud SQL 專案。
- 在查詢建立工具中加入以下內容:
- 資源:選取「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
VPN 疑難排解
請參閱 Cloud VPN 疑難排解頁面。