エラー メッセージ

このドキュメントでは、BigQuery の使用中に表示される可能性のあるエラー メッセージについて、HTTP エラーコードや推奨されるトラブルシューティングの手順も含めて説明します。

クエリエラーの詳細については、クエリに関する問題のトラブルシューティングをご覧ください。

ストリーミング挿入エラーの詳細については、ストリーミング挿入のトラブルシューティングをご覧ください。

エラーの表

BigQuery API からのレスポンスでは、レスポンス本文内に HTTP エラーコードとエラー オブジェクトが含まれます。通常、エラー オブジェクトは次のいずれかになります。

次の表の「エラー メッセージ」列は、ErrorProto オブジェクトの reason プロパティに対応しています。

この表は、すべての HTTP エラーやその他のネットワーク エラーを網羅したものではありません。そのため、BigQuery からのすべてのエラー レスポンスにエラー オブジェクトが存在するとは限りません。また、BigQuery API の Cloud クライアント ライブラリを使用すると、別のエラーまたはエラー オブジェクトが返されることがあります。詳細については、BigQuery API クライアント ライブラリをご覧ください。

下の表にない HTTP レスポンス コードを受け取った場合、そのレスポンス コードは HTTP リクエストの問題または予想される結果を示します。5xx の範囲のレスポンス コードは、サーバー側のエラーを示します。5xx レスポンス コードを受け取った場合は、しばらくしてからリクエストを再試行してください。場合によっては、プロキシなどの中間サーバーによって 5xx レスポンス コードが返されることがあります。レスポンス本文とレスポンス ヘッダーを調べて、エラーの詳細を確認してください。HTTP レスポンス コードの一覧については、HTTP レスポンス コードをご覧ください。

bq コマンドライン ツールを使用してジョブ ステータスを確認した場合、デフォルトではエラー オブジェクトが返されません。次の表に対応するエラー オブジェクトと reason プロパティを表示するには、--format=prettyjson フラグを使用します。たとえば、bq --format=prettyjson show -j *<job id>* のようにします。bq ツールの詳細ログを表示するには、--apilog=stdout を使用します。bq ツールのトラブルシューティングの詳細については、デバッグをご覧ください。

<trid="jobratelimitexceeded"> </trid="jobratelimitexceeded">
エラー メッセージ HTTP コード 説明 トラブルシューティング
accessDenied 403

このエラーは、アクセス権限のないリソース(データセットテーブルビュージョブなど)にアクセスしようとしたときに返されます。また、読み取り専用オブジェクトを変更しようとしたときにも返されます。

リソースのオーナーに連絡し、エラーの監査ログの principalEmail 値で特定されるユーザーに対してリソースへのアクセス権を付与するようリクエストします。

attributeError 400

このエラーは、ユーザーコードから存在しないオブジェクト属性が呼び出された場合に返されます。

対象のオブジェクトに、アクセスしようとしている属性があることを確認します。このエラーの詳細については、AttributeError をご覧ください。

backendError 500、503、または 504

このエラーは、サービスが現在利用できないことを示します。これは、次のような一時的な問題が原因で発生する可能性があります。

  • サービス需要の急増: 使用量のピーク時など、需要が急増すると、すべての BigQuery ユーザーのサービス品質を保護するために負荷制限が発生する可能性があります。システムが過負荷にならないように、BigQuery はリクエストの一部に対して 500 または 503 エラーを返すことがあります。
  • ネットワークの問題: BigQuery は分散型であるため、システム内のさまざまなコンポーネントやマシン間でデータが転送されることがよくあります。断続的なネットワーク接続の問題が原因で、BigQuery が 5xx エラーを返すことがあります。たとえば、SSL handshake の失敗や、ユーザーとGoogle Cloudの間のネットワーク インフラストラクチャの問題などです。
  • リソースの枯渇: BigQuery には、単一のユーザーまたは単一のジョブが過剰なリソースを消費しないように、サービス全体のパフォーマンスを保護するためのさまざまな内部リソース制限が設けられています。BigQuery は、リソースの枯渇に対処するために負荷制限を実装します。
  • バックエンド エラー: まれに、BigQuery コンポーネントのいずれかで内部的な問題が発生し、クライアントに 500 または 503 エラーが返されることがあります。

5xx エラーはサービス側の問題であり、クライアントが修正または制御することはできません。クライアント側では、5xx エラーの影響を軽減するために、切り捨て型指数バックオフを使用してリクエストを再試行する必要があります。指数バックオフについて詳しくは、指数バックオフをご覧ください。ただし jobs.get 呼び出しと jobs.insert 呼び出しは特殊なケースで、トラブルシューティング手法が異なります。

jobs.get 呼び出し

  • jobs.get のポーリング中に 503 エラーを受け取った場合は、数秒待ってから再度ポーリングします。
  • ジョブが完了しても backendError を含むエラー オブジェクトが含まれる場合、ジョブは失敗しています。データ整合性の問題を心配することなく、ジョブを再試行できます。

jobs.insert 呼び出し
jobs.insert 呼び出しの実行中にこのエラーを受け取った場合、ジョブが成功しているかどうかは不明です。この場合は、ジョブを再試行する必要があります。

再試行が効果的でなく、問題が解決しない場合は、リクエストの失敗率を計算して、サポートにお問い合わせください。
また、複数のワークフロー再起動試行で指数バックオフを使用して再試行しても、BigQuery への特定のリクエストが 5xx エラーで継続的に失敗する場合は、全体的なエラー率に関係なく、サポートにエスカレーションして、BigQuery 側から問題をトラブルシューティングする必要があります。問題が適切に優先順位付けされるように、ビジネスへの影響を明確に伝えてください。

badRequest 400

'UPDATE or DELETE statement over table project.dataset.table would affect rows in the streaming buffer, which is not supported' エラーは、最近ストリーミングされたテーブル内の行の一部が DML オペレーション(DELETEUPDATEMERGE)で使用できない場合に発生することがあります。使用できない状態となるのは通常は数分ほどですが、まれに 90 分ほど続く場合があります。詳細については、ストリーミング データの可用性DML の制限事項をご覧ください。

数分待ってからもう一度試すか、ストリーミング バッファ外の古いデータのみを処理するようにステートメントをフィルタします。テーブルの DML オペレーションでデータを使用できるかどうかを調べるには、tables.get レスポンスstreamingBuffer セクションの有無を確認します。streamingBuffer セクションが存在しない場合、テーブルデータは DML オペレーションで使用できます。streamingBuffer.oldestEntryTime フィールドを使用して、ストリーミング バッファ内のレコードの経過時間を特定することもできます。

別の方法として、この制限がない BigQuery Storage Write API を使用してデータをストリーミングすることも検討できます。

billingNotEnabled 403

プロジェクトで課金が有効になっていないときに返されます。

Google Cloud コンソールでプロジェクトの課金を有効にします。

billingTierLimitExceeded 400

このエラーは、オンデマンド ジョブの statistics.query.billingTier の値が 100 を超えると返されます。これは、スキャンされたデータの量と比べてオンデマンド クエリが使用する CPU が多すぎる場合に発生します。ジョブの詳細を調べる方法については、ジョブの管理をご覧ください。

このエラーは多くの場合、厳密でない結合条件などにより、非効率なクロス結合が明示的または暗黙的に実行されたことが原因で発生します。この種のクエリはリソースの消費量が多いため、オンデマンド料金の使用には適していません。また、適切にスケーリングされない可能性があります。このエラーを解決するには、クエリを最適化するか、容量ベース(スロット)料金モデルに切り替えます。クエリの最適化については、SQL アンチパターンの回避をご覧ください。

blocked 403

このエラーは、実行しようとしたオペレーションが BigQuery で一時的に拒否リストに追加されているとき(通常、サービスの停止を防ぐためなどに行われます)に返されます。

詳細をサポートにお問い合わせください。

duplicate 409

すでに存在するジョブ、データセット、テーブルを作成しようとしたときに返されます。また、ジョブの writeDisposition プロパティが WRITE_EMPTY に設定されていて、ジョブがアクセスする書き込み先のテーブルがすでに存在するときにも返されます。

作成しようとしているリソースの名前を変更するか、ジョブの writeDisposition 値を変更します。

internalError 500

BigQuery で内部エラーが発生したときに返されます。

BigQuery サービスレベル契約に記載されているバックオフ要件に沿って待機した後、オペレーションを再試行してください。エラーが続く場合は、サポートに問い合わせるか、BigQuery Issue Tracker を使用してバグを報告してください。また、予約を使用することでこのエラーの頻度を低減できます。

invalid 400

このエラーは、無効なクエリ以外のなんらかの無効な入力(必須フィールドの欠落、無効なテーブル スキーマなど)があると返されます。無効なクエリは invalidQuery エラーを返します。

invalidQuery 400

このエラーは、無効なクエリを実行しようとしたときに返されます。

クエリに構文エラーがないか確認してください。クエリ リファレンスに、有効なクエリの作成方法についての説明と例があります。

invalidUser 400

無効なユーザー認証情報でクエリをスケジュールしようとしたときに返されます。

クエリのスケジューリングの説明に従ってユーザー認証情報を更新してください。

jobBackendError 400

このエラーは、ジョブが正常に作成されたものの、内部エラーで失敗したときに返されます。このエラーは、jobs.query または jobs.getQueryResults で表示される場合があります。

新しい jobId でジョブを再試行します。エラーが引き続き発生する場合は、サポートにお問い合わせください。

jobInternalError 400

このエラーは、ジョブが正常に作成されたものの、内部エラーで失敗したときに返されます。このエラーは、jobs.query または jobs.getQueryResults で表示される場合があります。

新しい jobId でジョブを再試行します。エラーが引き続き発生する場合は、サポートにお問い合わせください。

jobRateLimitExceeded 400

このエラーは、ジョブが正常に作成されたものの、rateLimitExceeded エラーで失敗したときに返されます。このエラーは、jobs.query または jobs.getQueryResults で表示される場合があります。

指数バックオフを使用してリクエスト レートを減らし、新しい jobId でジョブを再試行します。

notFound 404

このエラーは、存在しないリソース(データセット、テーブル、またはジョブ)を参照した場合、またはリクエストのロケーションがリソースのロケーション(たとえば、ジョブが実行されているロケーション)と一致しない場合に返されます。また、最近ストリーミングされて削除されたテーブルをテーブル デコレータで参照する場合にも発生することがあります。

リソース名を修正するか、正しいロケーションを指定してください。または、ストリーミング後 6 時間以上経過してから、削除されたテーブルのクエリを実行してください。

notImplemented 501

このジョブエラーは、実装されていない機能にアクセスしようとしたときに返されます。

詳細をサポートにお問い合わせください。

proxyAuthenticationRequired 407

このエラーは、リクエストにプロキシ サーバーの有効な認証情報がない場合に、クライアント環境とプロキシ サーバー間で返されます。詳細については、407 プロキシ認証が必要ですをご覧ください。

トラブルシューティングは環境によって異なります。Java で作業中にこのエラーが発生した場合は、等号の後に値を指定せずに jdk.http.auth.tunneling.disabledSchemes= プロパティと jdk.http.auth.proxying.disabledSchemes= プロパティの両方を設定していることを確認してください。

quotaExceeded 403

プロジェクトが BigQuery の割り当てまたはカスタム割り当てを超過したか、課金の設定なしでクエリの無料枠を超過したときに返されます。

超過した割り当ての詳細をエラー オブジェクトの message プロパティで確認します。BigQuery の割り当てをリセットしたり増やしたりするには、サポートにお問い合わせください。カスタム割り当てを変更するには、[割り当て] ページからリクエストを送信します。このエラーが BigQuery サンドボックスの使用時に発生した場合は、サンドボックスからアップグレードできます。
詳細については、BigQuery 割り当てエラーのトラブルシューティングをご覧ください。

rateLimitExceeded 403

プロジェクトで多数のリクエストを短時間で送信して、短期のレート上限を超過した場合にこのエラーが返されます。たとえば、クエリジョブのレート制限API リクエストのレート制限をご覧ください。

リクエストのレートを下げます。
プロジェクトがどの制限も超過していないと思われる場合は、サポートにお問い合わせください。
詳細については、BigQuery 割り当てエラーのトラブルシューティングをご覧ください。

resourceInUse 400

テーブルを含むデータセットを削除しようとしたとき、または現在実行中のジョブを削除しようとしたときに返されます。

データセットを空にしてから削除するか、ジョブが完了するのを待ってから削除します。

resourcesExceeded 400

このエラーは、ジョブで使用するリソースの数が多すぎるときに返されます。

このエラーは、ジョブで使用するリソースの数が多すぎるときに返されます。トラブルシューティング情報については、リソース超過エラーのトラブルシューティングをご覧ください。

responseTooLarge 403

クエリの結果が最大レスポンス サイズよりも大きいときに返されます。クエリによっては複数のステージで実行されますが、このエラーは、いずれかのステージで返されるレスポンス サイズが大きすぎるときに返されます(最終的な結果が最大レスポンス サイズより小さい場合でもエラーとなります)。このエラーは、クエリで ORDER BY 句を使用しているときによく返されます。

LIMIT 句を追加するとエラーが解消されることがあります。または ORDER BY 句を削除します。サイズの大きい結果を返せるようにする場合は、allowLargeResults プロパティを true に設定し、宛先テーブルを指定します。詳細については、サイズの大きいクエリ結果の書き込みをご覧ください。

stopped 200

このステータス コードは、ジョブがキャンセルされた場合に返されます。

tableUnavailable 400

一部の BigQuery テーブルでは、他の Google プロダクト チームによって管理されているデータが使用されます。このエラーは、そのようなテーブルのいずれか 1 つが使用不可であることを示します。

このエラー メッセージが出た場合は、リクエストを再試行する(internalError のトラブルシューティング ヒントを参照)か、データへのアクセス権を付与した Google プロダクト チームに問い合わせてください。

timeout 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 日間のリクエストの失敗率を計算するには、過去 30 日間の特定 API 呼び出しまたはメソッドのリクエストの失敗数を、過去 30 日間のその API 呼び出しまたはメソッドのリクエストの合計数で割ります。この値に 100 を掛けると、30 日間のリクエスト失敗率の平均値が得られます。

たとえば、Cloud Logging データをクエリして、jobs.insert リクエストの合計数と失敗した jobs.insert リクエストの数を取得し、計算します。エラー率の値は、API ダッシュボードまたは Cloud Monitoring の Metrics Explorer を使用して取得することもできます。これらのオプションには、クライアントと BigQuery の間で発生したネットワーキングやルーティングの問題に関するデータは含まれません。そのため、より正確な障害率を計算するには、クライアントサイドのロギングとレポート システムを使用することをおすすめします。

まず、100% からリクエストの失敗率を引きます。この値が BigQuery SLA に記載されている値以上の場合、稼働時間も BigQuery SLA を満たしています。ただし、この値が SLA に記載されている値を下回っている場合は、稼働時間を手動で計算します。

稼働時間を計算するには、サービスのダウンタイムと見なされる時間(分単位)を知る必要があります。サービスのダウンタイムとは、SLA の定義に従って計算されたエラー率が 10% を超える 1 分間の期間を意味します。稼働率を計算するには、過去 30 日間の合計時間(分)からサービスのダウンタイムの合計時間(分)を差し引きます。残りの時間を過去 30 日間の合計時間で割り、この値に 100 を掛けて、30 日間の稼働率を求めます。SLA に関連する定義と計算の詳細については、BigQuery サービスレベル契約(SLA)をご覧ください。

月間稼働率が BigQuery SLA に記載されている値以上の場合、エラーは一時的な問題が原因である可能性が高いため、指数バックオフを使用して再試行を続行できます。

稼働時間が SLA に示されている値を下回っている場合は、サポートにお問い合わせください。その際、観測された全体的なエラー率と稼働時間の計算結果をお知らせください。

認証エラー

OAuth トークン生成システムによってスローされたエラーは、次の JSON オブジェクトを返します。これは OAuth2 仕様で定義されています。

{"error" : "_description_string_"}

このエラーは HTTP 400 Bad Request エラーまたは HTTP 401 Unauthorized エラーを伴います。_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"
    

    PROJECT_ID は、リソースを含むプロジェクトの ID に置き換えます。

  • 認証に使用されている特定のユーザーまたはサービス アカウントを検索します。

    resource.type="bigquery_resource"
    protoPayload.authenticationInfo.principalEmail="EMAIL"
    

    EMAIL は、ユーザーまたはサービス アカウントのメールアドレスに置き換えます。

  • 管理アクティビティ監査ログで Identity and Access Management ポリシーの変更を検索します。

    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
    

    DATASET_ID は、リソースを含むデータセットの ID に置き換えます。

接続エラー メッセージ

次の表に、クライアント ライブラリの使用時や、コードから BigQuery API を呼び出したときに、断続的な接続の問題が原因で表示される可能性のあるエラー メッセージを示します。

エラー メッセージ クライアント ライブラリまたは API トラブルシューティング
com.google.cloud.bigquery.BigQueryException: 読み取りがタイムアウトしました Java タイムアウト値を大きくして設定します。
接続がシャットダウンされました: javax.net.ssl.SSLException: java.net.SocketException: com.google.cloud.bigquery.spi.v2.HttpBigQueryRpc.translate(HttpBigQueryRpc.java:115) で接続がリセットされました Java 再試行メカニズムを実装し、タイムアウト値を大きくして設定します。
javax.net.ssl.SSLHandshakeException: リモートホストがハンドシェイクを終了しました Java 再試行メカニズムを実装し、タイムアウト値を大きくして設定します。
BrokenPipeError: [Errno 32] パイプが無効です Python 再試行メカニズムを実装します。このエラーの詳細については、BrokenPipeError をご覧ください。
接続が中断されました。RemoteDisconnected('リモートエンドが応答なしで接続を閉じました' 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 プロキシ :8080 への接続中にエラーが発生しました: [Errno 110] 接続がタイムアウトしました クライアント ライブラリ プロキシのステータスと設定のトラブルシューティングを行います。再試行メカニズムを実装し、タイムアウト値を大きくして設定します。
トランスポート ストリームから予期しない EOF または 0 バイトを受信した クライアント ライブラリ 再試行メカニズムを実装し、タイムアウト値を大きくして設定します。

Google Cloud コンソールのエラー メッセージ

次の表に、Google Cloud コンソールで作業中に表示される可能性があるエラー メッセージを示します。

エラー メッセージ 説明 トラブルシューティング
サーバーから不明なエラー レスポンスが返されました。 このエラーは、 Google Cloud コンソールがサーバーから不明なエラーを受け取った場合に発生します。たとえば、データセットや他のタイプのリンクをクリックしてもページが表示されない場合に発生します。 ブラウザのシークレット モード(非公開モード)に切り替えて、エラーの原因となった操作を繰り返してください。シークレット モードでエラーが発生しない場合は、広告ブロッカーなどのブラウザ拡張機能が原因である可能性があります。通常モードでブラウザの拡張機能を無効にして、問題が解決するかどうか確認してください。