Spanner 錯誤代碼

本頁面說明 Spanner 錯誤代碼,以及處理這些錯誤的建議做法。Google API (包括 Spanner) 會使用由 google.rpc.Code 定義的標準錯誤代碼。

Spanner 要求若成功,API 會在回應本文中傳回 HTTP 200 OK 狀態碼及所要求的資料。

若要求失敗,Spanner API 會傳回 HTTP 4xx5xx 狀態碼,此狀態碼通常能識別失敗,也能識別回應,此回應針對導致失敗的錯誤提供更多具體資訊。

回應物件包含單一欄位 error,其值包含以下元素:

元素 說明
code HTTP 狀態碼,通常用於識別要求失敗情形。
message 要求失敗的相關具體資訊。
status Google API 的標準化錯誤代碼 (google.rpc.Code)。Spanner API 可能會傳回的代碼列於「錯誤代碼」一節中。

如果以 application/x-protobuf 內容類型提出的要求發生錯誤,會傳回序列化的 google.rpc.Status 訊息做為酬載。

錯誤代碼

如要分類錯誤,建議檢查標準化錯誤代碼 (google.rpc.Code) 的值。在 JSON 錯誤中,此代碼會出現在 status 欄位。在 application/x-protobuf 錯誤中,則出現在 code 欄位。

錯誤代碼 說明 建議做法
ABORTED 作業已取消,原因通常是排序器檢查失敗或交易取消等並行問題。表示該項要求與另一項要求衝突。 非交易型修訂:
重試一次要求,或是調整實體結構以解決衝突。

若要求屬於交易型修訂:
重試整筆交易,或者以減少內容的方式調整實體架構。
ALREADY_EXISTS 用戶端嘗試建立的實體已存在 (例如,插入具有現有主鍵的資料列)。 未修正問題前請勿重試。
CANCELLED 作業已取消,一般由呼叫者取消。 請重試作業。
DEADLINE_EXCEEDED 在作業完成前已過期。 調查是否有足夠的時間完成作業。請使用與實際回應時間相對應的期限。請注意,針對會變更系統狀態的作業,即使作業順利完成也有可能會傳回錯誤,

如需提示,請參閱「排解逾時錯誤」。
FAILED_PRECONDITION 作業已遭拒絕,因為未達到該項要求的先決條件。錯誤回應中的訊息欄位說明未達到的先決條件。舉例來說,從已超過最大時間戳記過時程度的時間戳記讀取或查詢。 未修正問題前請勿重試。
INTERNAL 伺服器傳回錯誤。基礎系統預期的某些不變量已損毀。 除非您瞭解錯誤的具體情況和原因,否則請勿重試。
INVALID_ARGUMENT 用戶端指定的值無效。錯誤回應中的訊息欄位說明無效值的相關資訊。 未修正問題前請勿重試。
NOT_FOUND 表示某些要求的實體 (例如更新實體或查詢資料表或資料欄) 不存在。 未修正問題前請勿重試。
OUT_OF_RANGE 嘗試執行的作業超出有效範圍。 未修正問題前請勿重試。
PERMISSION_DENIED 使用者沒有提出要求的權限。 未修正問題前請勿重試。
RESOURCE_EXHAUSTED 已耗盡某些資源。

在管理員層面,專案可能已超過配額,或整個檔案系統的空間不足。

在資料層面,如果 Spanner 節點超載,就可能發生這種情況。
針對管理員平面,請確認您未超過 Spanner 或專案配額。如果您已超出配額,請申請提高配額,或是等待配額重設後再試一次。請將重試次數設為使用指數型退避。

針對資料層,請確認 Spanner 節點未超出容量。Spanner 會在用戶端程式庫中重試這些錯誤。如果所有重試都失敗,請參閱「流程控制機制錯誤」。

一般來說,如果應用程式發生 RESOURCE_EXHAUSTED 錯誤,請將情況視為 UNAVAILABLE 錯誤,並透過指數輪詢重試。
UNAUTHENTICATED 要求中不含作業的有效驗證憑證。 未修正問題前請勿重試。
UNAVAILABLE 伺服器無法使用。 使用指數輪詢重試。請注意,重試非冪等操作不一定安全。
UNIMPLEMENTED 未實作作業或作業在此服務中不受支援/未啟用。 未修正問題前請勿重試。
UNKNOWN 伺服器傳回不明錯誤。由 API 發出但未傳回充分錯誤資訊的錯誤,也可能會轉換為此錯誤。 請確認您的要求安全無虞。然後以指數輪詢方式重試。

流量控制機制錯誤

在下列情況下,Spanner 可能會啟用流量控制機制,以免過載:

  • Spanner 節點的 CPU 使用率偏高。如果您懷疑要求會導致 CPU 使用率升高,可以使用 CPU 使用率指標來調查問題。
  • 可能會出現熱點,導致要求的處理時間增加。如果您懷疑要求會造成熱點,請參閱「在資料庫中找出熱點」一文,瞭解問題所在。詳情請參閱「按鍵視覺化工具」。

下列用戶端程式庫支援流程控制機制:

使用流量控制機制後,要求完成的整體時間不會增加。如果沒有這項機制,Spanner 會在處理要求前等待,並最終傳回 DEADLINE_EXCEEDED 錯誤。

當流量控制機制啟用時,Spanner 會將要求推送回用戶端以便重試。如果重試耗用使用者提供的整個期限,用戶端就會收到 RESOURCE_EXHAUSTED 錯誤。如果 Spanner 預估要求的處理時間過長,就會傳回這個錯誤。錯誤會傳播流量控制,而 Spanner 會重試傳送至用戶端的要求,而不是在內部累積重試次數。這可讓 Spanner 避免累積額外的資源耗用量。