錯誤訊息

本文說明您在使用 BigQuery 時可能會遇到的錯誤訊息,包括 HTTP 錯誤代碼和建議的疑難排解步驟。

如要進一步瞭解查詢錯誤,請參閱「排解查詢錯誤」一文。

如要進一步瞭解串流資料插入錯誤,請參閱「排解串流資料插入疑難」。

錯誤表格

BigQuery API 的回應會在回應主體中加入 HTTP 錯誤代碼和錯誤物件。錯誤物件通常為下列其中一種:

下表中的「錯誤訊息」欄會對應至 ErrorProto 物件中的 reason 屬性。

這份表格並未列出所有可能的 HTTP 錯誤或其他網路錯誤。因此,請勿假設 BigQuery 的每個錯誤回應都會包含錯誤物件。此外,如果您使用 BigQuery API 的 Cloud 用戶端程式庫,可能會收到不同的錯誤或錯誤物件。詳情請參閱「BigQuery API 用戶端程式庫」。

如果您收到的 HTTP 回應代碼沒有出現在下表中,代表 HTTP 要求發生問題,或是產生符合預期的結果。5xx 範圍內的回應代碼表示伺服器端錯誤。如果您收到 5xx 回應代碼,請稍後再重試要求。在某些情況下,中繼伺服器 (例如 Proxy) 可能會傳回 5xx 回應碼。請檢查回應主體和回應標頭,瞭解錯誤的詳細資訊。如需完整的 HTTP 回應代碼清單,請參閱「HTTP 回應代碼」。

當您使用 bq 指令列工具查看工作狀態時,系統預設不會傳回錯誤物件。如要查看錯誤物件,以及與下表對應的 reason 屬性,請使用 --format=prettyjson 標記。例如:bq --format=prettyjson show -j <job id>。如要查看 bq 工具的詳細記錄,請使用 --apilog=stdout。如要進一步瞭解如何排解 bq 工具的問題,請參閱「偵錯」一文。

錯誤訊息 HTTP 代碼 說明 疑難排解
accessDenied 403 當您嘗試存取您沒有存取權限的資源 (例如資料集資料表檢視畫面工作) 時,系統就會傳回這個錯誤。如果您嘗試修改唯讀物件,系統也會傳回這個錯誤。 請與資源擁有者聯絡,並為錯誤稽核記錄中 principalEmail 值所識別的使用者要求存取資源
attributeError 400 當使用者程式碼發生問題,且呼叫特定物件屬性但不存在時,系統就會傳回這個錯誤。 請確認您使用的物件具有您要存取的屬性。如要進一步瞭解這項錯誤,請參閱「AttributeError」。
backendError 500、503 或 504

這個錯誤表示服務目前無法使用。這可能是因為許多暫時性問題造成,包括:

  • 服務需求激增:當需求突然激增 (例如在使用率高峰時段),系統可能會進行負載分散,以保護所有 BigQuery 使用者的服務品質。為避免系統負荷過重,BigQuery 可能會針對少部分要求傳回 500 或 503 錯誤。
  • 網路問題:BigQuery 具有分散式架構,因此資料經常會在系統中的不同元件或機器之間傳輸。各種間歇性網路連線問題都可能導致 BigQuery 傳回 5xx 錯誤,包括 SSL 握手失敗,或使用者與 Google Cloud之間的其他網路基礎架構問題。
  • 資源耗盡:BigQuery 設有各種內部資源限制,可防止單一使用者或單一工作耗用過多資源,進而影響整體服務效能。BigQuery 會實作負載移轉功能,以解決資源耗盡的問題。
  • 後端錯誤:在極少數情況下,BigQuery 某個元件發生內部問題,可能會導致傳回給用戶端的錯誤代碼為 500 或 503。
5xx 錯誤是服務端問題,用戶端無法修正或控制這些問題。在用戶端方面,為減輕 5xx 錯誤的影響,您需要使用部分指數輪詢重試要求。如需指數輪詢的詳細資訊,請參閱「指數輪詢」。不過,排解這個錯誤時有兩種特殊情況:jobs.get 呼叫和 jobs.insert 呼叫。

jobs.get 呼叫

  • 如果您在輪詢 jobs.get 時收到 503 錯誤,請稍候片刻,然後再輪詢一次。
  • 如果工作執行完畢,但出現包含 backendError 的錯誤物件,代表工作執行失敗。您可以安全地重試工作,不必擔心資料一致性的問題。

jobs.insert 呼叫

如果您在執行 jobs.insert 呼叫時收到這個錯誤,我們無法得知工作是否已成功執行。在這種情況下,您必須重試工作。

如果重試無效且問題持續發生,您可以計算失敗要求的發生率,並與支援團隊聯絡

此外,如果您發現 BigQuery 的特定要求持續失敗,並且在多次嘗試重新啟動工作流程時,即使使用指數輪詢也無法成功,則應將此問題提報給支援團隊,請他們從 BigQuery 方面排解問題,無論整體計算的錯誤率為何。請務必清楚說明對業務的影響,以便正確分類問題。

badRequest 400 如果資料表中最近串流的部分資料列無法用於 DML 作業 (DELETEUPDATEMERGE),就可能發生 'UPDATE or DELETE statement over table <project.dataset.table> would affect rows in the streaming buffer, which is not supported' 錯誤,通常會持續幾分鐘,但在少數情況下,可能會持續 90 分鐘。詳情請參閱「串流資料可用性」和「 DML 限制」。 如要查看資料是否可用於資料表 DML 作業,請檢查 streamingBuffer 部分tables.get 回應。如果缺少 streamingBuffer 部分,則資料表資料可供 DML 作業使用。您也可以使用 streamingBuffer.oldestEntryTime 欄位,識別串流緩衝區中的記錄存續時間。
billingNotEnabled 403 當專案的計費功能沒有啟用時,系統就會傳回這個錯誤。 請在 Google Cloud 主控台中啟用專案的計費功能。
billingTierLimitExceeded 400 當隨選工作 statistics.query.billingTier 的值超過 100 時,系統就會傳回這個錯誤。當按需查詢的 CPU 使用量相對於掃描的資料量過高時,就會發生這種情況。如需檢查工作詳細資料的操作說明,請參閱「管理工作」。 這類錯誤最常見的原因是執行效率不佳的跨資料表彙整作業,例如因不精確的彙整條件而執行。這類查詢的資源消耗量高,因此不太適合採用隨選定價,而且通常無法順利擴充。您可以最佳化查詢,或是改用以運算資源 (運算單元) 為基礎的計價模式來解決這個錯誤。如要進一步瞭解如何最佳化查詢,請參閱「避免 SQL 反面模式」。
已封鎖 403 當 BigQuery 暫時將您嘗試執行的作業加入拒絕清單時 (通常是為了避免服務中斷),就會傳回這個錯誤。 詳情請洽詢支援小組
duplicate 409 當您嘗試建立已經存在的工作、資料集或資料表時,系統就會傳回這個錯誤。當工作的 writeDisposition 屬性設定為 WRITE_EMPTY,且該工作存取的目的地資料表已經存在時,系統也會傳回這個錯誤。 請將您嘗試建立的資源重新命名,或是變更工作中的 writeDisposition 值。
internalError 500 當 BigQuery 發生內部錯誤時,系統就會傳回這個錯誤。 請根據 BigQuery 服務水準協議中所述的回退要求等待,然後再嘗試執行操作。如果錯誤持續發生,請與支援團隊聯絡,或是使用 BigQuery 問題追蹤工具回報錯誤。您也可以使用預留功能,減少發生此錯誤的頻率。
無效 400 除了無效查詢以外的任何無效輸入類型都會傳回這個錯誤,例如未填妥必填欄位或資料表結構定義無效。無效的查詢會傳回 invalidQuery 錯誤。
invalidQuery 400 當您嘗試執行無效的查詢時,系統就會傳回這個錯誤。 請檢查查詢是否有語法錯誤。如需如何建立有效查詢的說明和範例,請參閱查詢參考資料
invalidUser 400 當您嘗試使用無效的使用者憑證排定查詢時,系統就會傳回這個錯誤。 請參閱「排定查詢」一節,重新整理使用者憑證。
jobBackendError 400 當工作建立成功,但因內部錯誤而失敗時,系統會傳回這個錯誤。您可能會在 jobs.queryjobs.getQueryResults 中看到這則錯誤訊息。 請使用新的 jobId 重試工作。如果錯誤持續發生,請與支援團隊聯絡。
jobInternalError 400 當工作建立成功,但因內部錯誤而失敗時,系統會傳回這個錯誤。您可能會在 jobs.queryjobs.getQueryResults 中看到這則錯誤訊息。 請使用新的 jobId 重試工作。如果錯誤持續發生,請與支援團隊聯絡。
jobRateLimitExceeded 400 當工作已成功建立,但因 rateLimitExceeded 錯誤而失敗時,系統會傳回這個錯誤。您可能會在 jobs.queryjobs.getQueryResults 中看到這則錯誤訊息。 使用指數輪詢來降低要求率,然後使用新的 jobId 重試工作。
notFound 404 當您參照的資源 (資料集、資料表或工作) 不存在,或是要求中的位置與資源的位置不相符 (例如工作執行的位置) 時,系統就會傳回這個錯誤。如果使用資料表修飾符參照最近串流的已刪除資料表,也會發生這個錯誤。 請修正資源名稱、正確指定位置,或是在串流結束至少 6 小時之後,再查詢已刪除的資料表。
notImplemented 501 當您嘗試存取未實作的功能時,就會傳回這個錯誤。 詳情請洽詢支援小組
proxyAuthenticationRequired 407 如果要求缺少 Proxy 伺服器的有效驗證憑證,系統就會在用戶端環境和 Proxy 伺服器之間傳回這項錯誤。詳情請參閱「407 需要 Proxy 驗證」。 疑難排解作業會根據您的環境進行。如果您在使用 Java 時收到此錯誤,請確認您已設定 jdk.http.auth.tunneling.disabledSchemes=jdk.http.auth.proxying.disabledSchemes= 屬性,且等號後沒有任何值。
quotaExceeded 403 如果您的專案超出 BigQuery 配額自訂配額,或是您未設定帳單資訊,且超出查詢的免費方案配額,系統就會傳回這個錯誤。 請查看錯誤物件的 message 屬性,以便進一步瞭解專案超出了哪個配額。如要重設或調高 BigQuery 配額,請與支援小組聯絡。如要修改自訂配額,請前往 Google Cloud 主控台頁面提交要求。如果您是在採用 BigQuery 沙箱機制時收到這個錯誤,則可以從沙箱升級

詳情請參閱「排解 BigQuery 配額錯誤」。

rateLimitExceeded 403 如果您的專案在短時間內傳送的要求過多,超過短期頻率限制,就會傳回這個錯誤。例如,請參閱查詢工作頻率限制API 要求頻率限制 請降低要求的傳送頻率。

如果您確定專案並沒有超出上述的任何限制,請與支援團隊聯絡

詳情請參閱「排解 BigQuery 配額錯誤」。

resourceInUse 400 當您嘗試刪除含有資料表的資料集或目前正在執行的工作時,就會傳回這個錯誤。 先清空資料集再予以刪除,或等待工作完成再予以刪除。
resourcesExceeded 400 當工作使用過多資源時,系統就會傳回這個錯誤。 當工作使用過多資源時,系統就會傳回這個錯誤。如需疑難排解資訊,請參閱「排解資源超出錯誤」。
responseTooLarge 403 當您的查詢結果超過回應大小上限時,就會傳回這個錯誤。某些查詢會分成好幾個階段來執行,只要有任何一個階段傳回的回應大小超出上限,即使最終的結果並沒有超過大小上限,系統也會傳回這個錯誤。當查詢使用 ORDER BY 子句時,系統通常會傳回這個錯誤。 請新增 LIMIT 子句 (可能會有幫助),或是移除 ORDER BY 子句。如要確保大型結果能順利傳回,您可以將 allowLargeResults 屬性設為 true,並指定目的地資料表。詳情請參閱「 寫入大量查詢結果」。
已停止 200 工作遭到取消時會傳回這個狀態碼。
tableUnavailable 400 特定 BigQuery 資料表所含的資料是由其他 Google 產品小組負責管理。這個錯誤代表無法存取這類資料表。 當您收到這個錯誤訊息時,請重新提出要求 (請參閱 internalError 的疑難排解建議),或是與授予您資料存取權的 Google 產品小組聯絡。
逾時 400 工作逾時 建議您減少作業執行的作業量,以便在設定的限制內完成作業。請參閱「配額與限制」。

錯誤回應範例

GET https://bigquery.googleapis.com/bigquery/v2/projects/12345/datasets/foo
Response:
[404]
{
  "error": {
  "errors": [
  {
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found: Dataset myproject:foo"
  }],
  "code": 404,
  "message": "Not Found: Dataset myproject:foo"
  }
}

計算失敗要求的頻率和正常運作時間

大多數的 500 和 503 錯誤都可以透過以指數輪詢方式重試來解決。如果 500 和 503 錯誤仍持續發生,您可以計算失敗要求的整體比率和對應的上線時間,然後與 BigQuery 服務水準協議 (SLA) 進行比較,判斷服務是否正常運作。

如要計算過去 30 天內失敗要求的整體比率,請將特定 API 呼叫或方法在過去 30 天內的失敗要求數量,除以該 API 呼叫或方法在過去 30 天內的要求總數。將這個值乘以 100,即可算出 30 天內失敗要求的平均百分比。

舉例來說,您可以查詢 Cloud Logging 資料,取得 jobs.insert 要求的總數和失敗的 jobs.insert 要求數,然後執行計算。您也可以從 API 資訊主頁Cloud Monitoring 中的 Metrics Explorer 取得錯誤率值。這些選項不會納入用戶端和 BigQuery 之間的網路或路由問題資料,因此我們也建議使用用戶端記錄和報表系統,以便更精確地計算失敗率。

首先,請將 100% 減去失敗要求的整體比率。如果這個值大於或等於 BigQuery SLA 中所述的值,則運作時間也符合 BigQuery SLA。不過,如果這個值低於服務水準協議中所述的值,請手動計算正常運作時間。

如要計算正常運作時間,您必須知道系統中斷服務的時間長度。「服務停機時間」是指根據服務水準協議定義,錯誤率超過 10% 的一段時間。如要計算正常運作時間,請將過去 30 天的總分鐘數減去服務停機的總分鐘數。將剩餘時間除以過去 30 天的總分鐘數,然後將這個值乘以 100,即可算出 30 天內的正常運作時間百分比。如要進一步瞭解 SLA 的定義和計算方式,請參閱 BigQuery 服務水準協議 (SLA)

如果每月正常運作百分比大於或等於 BigQuery 服務水準協議中所述的值,則錯誤很可能是由暫時性問題造成,因此您可以繼續使用指數型退避,重新嘗試執行作業。

如果正常運作時間低於《服務水準協議》中顯示的值,請與支援團隊聯絡尋求協助,並提供觀察到的整體錯誤率和正常運作時間計算結果。

驗證錯誤

根據 OAuth2 規格的定義,OAuth 憑證產生系統所擲回的錯誤,會傳回以下 JSON 物件。

{"error" : "description_string"}

這個錯誤會與 HTTP 400「不正確的要求」錯誤或 HTTP 401「未授權」錯誤一起出現。description_string 是 OAuth2 規格所定義的其中一個錯誤代碼。例如:

{"error":"invalid_client"}

查看錯誤

您可以使用記錄瀏覽器查看特定工作、使用者或其他範圍的驗證錯誤。以下列舉幾個可用於查看驗證錯誤的記錄探索器篩選器範例。

在「政策遭拒」稽核記錄中搜尋權限問題導致失敗的工作:
    resource.type="bigquery_resource"
    protoPayload.status.message=~"Access Denied"
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access"
  
搜尋用於驗證的特定使用者或服務帳戶:
    resource.type="bigquery_resource"
    protoPayload.authenticationInfo.principalEmail="EMAIL"
  

EMAIL 替換為使用者或服務帳戶的電子郵件地址。

在管理員活動稽核記錄中搜尋 IAM 政策變更:
    protoPayload.methodName=~"SetIamPolicy"
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity"
  
在「資料存取」稽核記錄中搜尋特定 BigQuery 資料集的變更:
    resource.type="bigquery_resource"
    protoPayload.resourceName="projects/PROJECT_ID/datasets/DATASET_ID"
    logName=projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
  

取代下列內容:

  • PROJECT_ID:包含資源的專案 ID
  • DATASET_ID:包含資源的資料集 ID

連線錯誤訊息

下表列出使用用戶端程式庫或從程式碼呼叫 BigQuery API 時,可能因連線中斷而出現的錯誤訊息:

錯誤訊息 用戶端程式庫或 API 疑難排解
com.google.cloud.bigquery.BigQueryException:讀取作業逾時 Java 設定較大的逾時值。
連線已關閉:javax.net.ssl.SSLException: java.net.SocketException: Connection reset at com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:115) Java 實作重試機制,並設定較長的逾時值。
javax.net.ssl.SSLHandshakeException:遠端主機終止了握手 Java 實作重試機制,並設定較長的逾時值。
BrokenPipeError:[Errno 32] Broken pipe Python 實作重試機制。如要進一步瞭解這項錯誤,請參閱「BrokenPipeError」。
已中斷連線。RemoteDisconnected('Remote end closed connection without response' Python 設定較大的逾時值。
SSLEOFError (違反通訊協定而發生 EOF) Python 系統會傳回這項錯誤,而非 413 (ENTITY_TOO_LARGE) HTTP 錯誤。縮減要求的大小。
TaskCanceledException:工作已取消 .NET 程式庫 在用戶端增加逾時值。
google.api_core.exceptions.PreconditionFailed: 412 PATCH Python 嘗試使用 HTTP 要求更新資料表資源時,系統會傳回這個錯誤。確認 HTTP 標頭中的 ETag 並未過時。針對資料表或資料集層級作業,請確認資源自上次例項化後未變更,並視需要重新建立物件。
無法建立新連線:[Errno 110] 連線逾時 用戶端程式庫 當這項要求在從 BigQuery 串流或讀取資料時已達檔案結尾 (EOF),系統就會傳回這個錯誤。實作重試機制,並設定較長的逾時值。
socks.ProxyConnectionError:連線至 HTTP proxy xxx.xx.xxx.xx:8080 時發生錯誤:[Errno 110] 連線逾時 用戶端程式庫 排解 Proxy 狀態和設定問題。實作重試機制,並設定較長的逾時值。
從傳輸串流接收非預期的 EOF 或 0 位元組 用戶端程式庫 實作重試機制,並設定較長的逾時值。

Google Cloud 控制台錯誤訊息

下表列出您在Google Cloud 主控台中工作時可能會看到的錯誤訊息。

錯誤訊息 說明 疑難排解
伺服器傳回不明的錯誤回應。 當 Google Cloud 控制台從伺服器收到不明錯誤時,就會顯示這個錯誤,例如當您點選資料集或其他類型的連結,但無法顯示網頁時。 切換至瀏覽器的無痕模式或私密模式,然後重複執行導致錯誤的動作。如果無隱私瀏覽模式沒有錯誤結果,則錯誤可能是由於瀏覽器擴充功能 (例如廣告攔截器) 在非無痕模式下停用瀏覽器擴充功能,看看是否能解決問題。