エラー メッセージ
このドキュメントでは、BigQuery の使用中に表示される可能性のあるエラー メッセージについて、HTTP エラーコードや推奨されるトラブルシューティングの手順も含めて説明します。
クエリエラーの詳細については、クエリに関する問題のトラブルシューティングをご覧ください。
ストリーミング挿入エラーの詳細については、ストリーミング挿入のトラブルシューティングをご覧ください。
エラーの表
BigQuery API からのレスポンスでは、レスポンス本文内に HTTP エラーコードとエラー オブジェクトが含まれます。通常、エラー オブジェクトは次のいずれかになります。
errorsオブジェクト。これには、ErrorProtoオブジェクトの配列が含まれます。errorResultsオブジェクト。これには、単一のErrorProtoオブジェクトが含まれます。
次の表の「エラー メッセージ」列は、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 ツールのトラブルシューティングの詳細については、デバッグをご覧ください。
| エラー メッセージ | HTTP コード | 説明 | トラブルシューティング |
|---|---|---|---|
| accessDenied | 403 |
このエラーは、アクセス権限のないリソース(データセット、テーブル、ビュー、ジョブなど)にアクセスしようとしたときに返されます。また、読み取り専用オブジェクトを変更しようとしたときにも返されます。 |
リソースのオーナーに連絡し、エラーの監査ログの |
| attributeError | 400 |
このエラーは、ユーザーコードから存在しないオブジェクト属性が呼び出された場合に返されます。 |
対象のオブジェクトに、アクセスしようとしている属性があることを確認します。このエラーの詳細については、AttributeError をご覧ください。 |
| backendError | 500、503、または 504 |
このエラーは、サービスが現在利用できないことを示します。これは、次のような一時的な問題が原因で発生する可能性があります。
|
5xx エラーはサービス側の問題であり、クライアントが修正または制御することはできません。クライアント側では、5xx エラーの影響を軽減するために、切り捨て型指数バックオフを使用してリクエストを再試行する必要があります。指数バックオフについて詳しくは、指数バックオフをご覧ください。ただし
再試行が効果的でなく、問題が解決しない場合は、リクエストの失敗率を計算して、サポートにお問い合わせください。 |
| badRequest | 400 |
|
数分待ってからもう一度試すか、ストリーミング バッファ外の古いデータのみを処理するようにステートメントをフィルタします。テーブルの DML オペレーションでデータを使用できるかどうかを調べるには、 別の方法として、この制限がない BigQuery Storage Write API を使用してデータをストリーミングすることも検討できます。 |
| billingNotEnabled | 403 |
プロジェクトで課金が有効になっていないときに返されます。 |
Google Cloud コンソールでプロジェクトの課金を有効にします。 |
| billingTierLimitExceeded | 400 |
このエラーは、オンデマンド ジョブの |
このエラーは多くの場合、厳密でない結合条件などにより、非効率なクロス結合が明示的または暗黙的に実行されたことが原因で発生します。この種のクエリはリソースの消費量が多いため、オンデマンド料金の使用には適していません。また、適切にスケーリングされない可能性があります。このエラーを解決するには、クエリを最適化するか、容量ベース(スロット)料金モデルに切り替えます。クエリの最適化については、SQL アンチパターンの回避をご覧ください。 |
| blocked | 403 |
このエラーは、実行しようとしたオペレーションが BigQuery で一時的に拒否リストに追加されているとき(通常、サービスの停止を防ぐためなどに行われます)に返されます。 |
詳細をサポートにお問い合わせください。 |
| duplicate | 409 |
すでに存在するジョブ、データセット、テーブルを作成しようとしたときに返されます。また、ジョブの |
作成しようとしているリソースの名前を変更するか、ジョブの |
| internalError | 500 |
BigQuery で内部エラーが発生したときに返されます。 |
BigQuery サービスレベル契約に記載されているバックオフ要件に沿って待機した後、オペレーションを再試行してください。エラーが続く場合は、サポートに問い合わせるか、BigQuery Issue Tracker を使用してバグを報告してください。また、予約を使用することでこのエラーの頻度を低減できます。 |
| invalid | 400 |
このエラーは、無効なクエリ以外のなんらかの無効な入力(必須フィールドの欠落、無効なテーブル スキーマなど)があると返されます。無効なクエリは |
|
| invalidQuery | 400 |
このエラーは、無効なクエリを実行しようとしたときに返されます。 |
クエリに構文エラーがないか確認してください。クエリ リファレンスに、有効なクエリの作成方法についての説明と例があります。 |
| invalidUser | 400 |
無効なユーザー認証情報でクエリをスケジュールしようとしたときに返されます。 |
クエリのスケジューリングの説明に従ってユーザー認証情報を更新してください。 |
| jobBackendError | 400 |
このエラーは、ジョブが正常に作成されたものの、内部エラーで失敗したときに返されます。このエラーは、 |
新しい |
| jobInternalError | 400 |
このエラーは、ジョブが正常に作成されたものの、内部エラーで失敗したときに返されます。このエラーは、 |
新しい |
| jobRateLimitExceeded | 400 |
このエラーは、ジョブが正常に作成されたものの、rateLimitExceeded エラーで失敗したときに返されます。このエラーは、 |
指数バックオフを使用してリクエスト レートを減らし、新しい |
| notFound | 404 |
このエラーは、存在しないリソース(データセット、テーブル、またはジョブ)を参照した場合、またはリクエストのロケーションがリソースのロケーション(たとえば、ジョブが実行されているロケーション)と一致しない場合に返されます。また、最近ストリーミングされて削除されたテーブルをテーブル デコレータで参照する場合にも発生することがあります。 |
リソース名を修正するか、正しいロケーションを指定してください。または、ストリーミング後 6 時間以上経過してから、削除されたテーブルのクエリを実行してください。 |
| notImplemented | 501 |
このジョブエラーは、実装されていない機能にアクセスしようとしたときに返されます。 |
詳細をサポートにお問い合わせください。 |
| proxyAuthenticationRequired | 407 |
このエラーは、リクエストにプロキシ サーバーの有効な認証情報がない場合に、クライアント環境とプロキシ サーバー間で返されます。詳細については、407 プロキシ認証が必要ですをご覧ください。 |
トラブルシューティングは環境によって異なります。Java で作業中にこのエラーが発生した場合は、等号の後に値を指定せずに |
| quotaExceeded | 403 |
プロジェクトが BigQuery の割り当てまたはカスタム割り当てを超過したか、課金の設定なしでクエリの無料枠を超過したときに返されます。 |
超過した割り当ての詳細をエラー オブジェクトの |
| rateLimitExceeded | 403 |
プロジェクトで多数のリクエストを短時間で送信して、短期のレート上限を超過した場合にこのエラーが返されます。たとえば、クエリジョブのレート制限と API リクエストのレート制限をご覧ください。 |
リクエストのレートを下げます。 |
| resourceInUse | 400 |
テーブルを含むデータセットを削除しようとしたとき、または現在実行中のジョブを削除しようとしたときに返されます。 |
データセットを空にしてから削除するか、ジョブが完了するのを待ってから削除します。 |
| resourcesExceeded | 400 |
このエラーは、ジョブで使用するリソースの数が多すぎるときに返されます。 |
このエラーは、ジョブで使用するリソースの数が多すぎるときに返されます。トラブルシューティング情報については、リソース超過エラーのトラブルシューティングをご覧ください。 |
| responseTooLarge | 403 |
クエリの結果が最大レスポンス サイズよりも大きいときに返されます。クエリによっては複数のステージで実行されますが、このエラーは、いずれかのステージで返されるレスポンス サイズが大きすぎるときに返されます(最終的な結果が最大レスポンス サイズより小さい場合でもエラーとなります)。このエラーは、クエリで |
|
| 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_accessDATASET_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 プロキシ |
クライアント ライブラリ | プロキシのステータスと設定のトラブルシューティングを行います。再試行メカニズムを実装し、タイムアウト値を大きくして設定します。 |
| トランスポート ストリームから予期しない EOF または 0 バイトを受信した | クライアント ライブラリ | 再試行メカニズムを実装し、タイムアウト値を大きくして設定します。 |
Google Cloud コンソールのエラー メッセージ
次の表に、Google Cloud コンソールで作業中に表示される可能性があるエラー メッセージを示します。
| エラー メッセージ | 説明 | トラブルシューティング |
|---|---|---|
| サーバーから不明なエラー レスポンスが返されました。 | このエラーは、 Google Cloud コンソールがサーバーから不明なエラーを受け取った場合に発生します。たとえば、データセットや他のタイプのリンクをクリックしてもページが表示されない場合に発生します。 | ブラウザのシークレット モード(非公開モード)に切り替えて、エラーの原因となった操作を繰り返してください。シークレット モードでエラーが発生しない場合は、広告ブロッカーなどのブラウザ拡張機能が原因である可能性があります。通常モードでブラウザの拡張機能を無効にして、問題が解決するかどうか確認してください。 |