Cloud SQL のトラブルシューティング

このページでは、サポートされているデータベース エンジンで発生する Cloud SQL に関する問題のトラブルシューティングを行う際のヒントを紹介します。これらのヒントには特定のデータベース エンジンだけに適用されるものと、データベース エンジン全般に共通なものがあります。

特定のデータベース エンジンのトラブルシューティングのヒントについては、該当する各ページをご覧ください。

次のいずれかのページで、質問や問題がすでに解決されていないかを確認してください。

このページには次のトピックが含まれています。

バックアップとリカバリ

問題 トラブルシューティング
現在のオペレーションのステータスを確認できない。 Google Cloud コンソールでは、オペレーションの完了時に成功または失敗のみが表示されます。警告やその他の情報を表示するように設計されていません。

特定の Cloud SQL インスタンスのすべてのオペレーションを確認するには、gcloud sql operations list コマンドを実行します。

オンデマンド バックアップ オペレーションを開始したユーザーを確認したい。 オペレーションを開始したユーザーはユーザー インターフェースに表示されません。

ユーザーを特定するには、ログを表示してテキストでフィルタします。個人情報の監査ログが必要になる場合があります。関連するログファイルは次のとおりです。

  • Cloud Audit Logs が有効で、表示に必要な権限がある場合は、cloudaudit.googleapis.com/activity を使用できる場合があります。
インスタンスを削除すると、その後インスタンスのバックアップを作成できない。

データの最終バックアップを作成せずにインスタンスを削除すると、データを復元できなくなります。ただし、インスタンスを復元すると、Cloud SQL はバックアップも復元します。削除されたインスタンスの復元について詳しくは、インスタンスの削除後もバックアップを保持するをご覧ください。

エクスポートを行っていれば、新しいインスタンスを作成してインポートを行い、データベースを再作成できます。エクスポートでは Cloud Storage への書き込みが行われ、インポートでは Cloud Storage からの読み取りが行われます。

自動バックアップが長時間停止していて、キャンセルできない。 データベースのサイズによっては、バックアップに時間がかかる可能性があります。

オペレーションをキャンセルする必要がある場合は、カスタマー サポートにインスタンスの force restart を依頼できます。

SQL ダンプファイルで参照されているユーザーが存在しない場合、復元オペレーションが失敗する可能性があります。 SQL ダンプを復元する前に、オブジェクトを所有しているデータベース ユーザーか、ダンプされたデータベース内のオブジェクトに対する権限が付与されているデータベース ユーザーが、ターゲット データベース内に存在している必要があります。そうでない場合、復元オペレーションを実行すると、元の所有権または権限でのオブジェクトの再作成に失敗します。

SQL ダンプを復元する前に、データベース ユーザーを作成します。

自動バックアップの保持日数を 7 日から 30 日以上に増やしたい。 保持する自動バックアップ数を構成できます。自動バックアップは、構成された保持値に基づいて定期的に削除されます。復元可能な自動バックアップは、現在表示されているバックアップだけです。

バックアップを無期限に保持する場合は、オンデマンド バックアップを作成します。オンデマンド バックアップは、自動バックアップと同じ方法では削除されません。オンデマンド バックアップは無期限に維持されます。つまり、削除されるか、所属するインスタンスが削除されるまで保持されます。このタイプのバックアップは自動的に削除されないため、課金に影響する可能性があります。

自動バックアップが失敗したときにメール通知を受信できない。 Cloud SQL からバックアップのステータスの通知を受信するには、ログベースのアラートを構成します。
インスタンスがエラー状態とバックアップ復元状態の間でループしているため、インスタンスが繰り返し失敗する。復元後にデータベースに接続して使用しようとすると失敗する。
  • オープン接続が多すぎる可能性があります。接続数が多すぎる原因として、切断された接続をクリーンアップする autovacuum 設定が存在しないために接続の途中でエラーが発生していることが考えられます。
  • カスタムコードで数回エラーが起きても停止しない再試行ロジックが使用されているため、ループが発生している可能性があります。
  • トラフィックが多すぎる可能性があります。接続プーリングなどの接続のベスト プラクティスを使用します。

次の方法をお試しください。

  1. データベースが autovacuum を使用する設定になっていることを確認します。
  2. カスタムコードに接続再試行ロジックが設定されているかを確認します。
  3. データベースが復旧するまでトラフィックを減らし、復旧後に徐々にトラフィックを増やします。
バックアップ / 復元オペレーションを実行したときにデータの欠落が見つかることがあります。 テーブルがログに記録されずに作成されました。次に例を示します。

CREATE UNLOGGED TABLE ....

これらのテーブルはバックアップからの復元には含まれません。

  • ログに記録されていないテーブルの内容は、HA インスタンスのフェイルオーバー後に保持されません。
  • ログに記録されていないテーブルは、Postgres のクラッシュ後に保持されません。
  • ログに記録されないテーブルはリードレプリカに複製されません。
  • ログに記録されていないテーブルは、バックアップの復元中に自動的にワイプされます。

解決策としては、バックアップを使用してテーブルを復元する場合に、ログに記録されていないテーブルを使用しないことです。すでにログに記録されていないテーブルがあるデータベースから復元する場合は、データベースをファイルにダンプし、これらのテーブルのダンプ済みファイルを ALTER TABLE から SET LOGGED に変更した後にデータを再読み込みできます。

インスタンスの削除時に最終バックアップを作成することを選択した場合に、インスタンスを削除できない。 インスタンスを削除する際は、削除前にインスタンスの最終バックアップを取得するかどうかを確認する必要があります。final-backup インスタンス設定を使用して最終バックアップを有効にした場合、インスタンスを削除するときに選択する内容は、インスタンスの最終バックアップを有効にしたときに設定した最終バックアップ インスタンス構成と一致する必要があります。この問題を軽減するには、次のいずれかを行います。
  • インスタンスの既存のバックアップ構成と一致するように最終バックアップ値を設定します。
  • インスタンスを削除するときは、最終バックアップ フィールドを空のままにします。このフィールドを空のままにすると、Cloud SQL はインスタンス設定で設定された最終バックアップ構成を受け取って最終バックアップを取得し、その保持期間を定義します。
インスタンスの最終バックアップ インスタンス構成を表示するには、インスタンスの情報を表示するをご覧ください。
最終バックアップ設定でプライマリ インスタンスを正常に作成した後、レプリカ インスタンスを作成できない。 最終バックアップ インスタンスの設定を有効にして新しいインスタンスを作成する場合は、最終バックアップの組織のポリシーを更新して、バックアップ構成をプライマリ インスタンスにのみ適用する必要があります。レプリカ インスタンスでは最終バックアップはサポートされていません。
詳細については、Cloud SQL の組織のポリシーをご覧ください。

クローンの作成

問題 トラブルシューティング
constraints/sql.restrictAuthorizedNetworks エラーでクローンの作成に失敗する。 クローン作成のオペレーションが、Authorized Networks 構成によってブロックされている。Authorized Networks は、 Google Cloud コンソールの [接続性] セクションでパブリック IP アドレスに構成されており、セキュリティに関する考慮事項により、クローン作成が許可されていません。

可能であれば、Cloud SQL インスタンスからすべての Authorized Networks エントリを削除します。それができない場合は、Authorized Networks エントリなしでレプリカを作成します。

エラー メッセージ: Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider. Help Token: [help-token-id].

Google Cloud コンソールを使用して、プライベート IP アドレスを持つインスタンスのクローンを作成しようとしていますが、割り振られた IP 範囲を指定しなかったため、ソース インスタンスが指定した範囲で作成されていません。その結果、クローニングされたインスタンスはランダムな範囲に作成されます。

gcloud を使用してインスタンスのクローンを作成し、
--allocated-ip-range-name パラメータの値を指定します。詳細については、プライベート IP を使用したインスタンスのクローン作成をご覧ください。

接続

問題 トラブルシューティング
Aborted connection. 次のような問題が考えられます。
  • ネットワークが不安定。
  • TCP keep-alive コマンドに応答しない(クライアントまたはサーバーのいずれかが応答しないか、過負荷の可能性があります)。
  • データベース エンジン接続の存続期間を超えたため、サーバーが接続を終了している。

アプリケーションは、接続プールや再試行などのベスト プラクティスに従ってネットワーク障害に対応する必要があります。通常、可能であれば、これらのエラーが接続プーラーによって検出されます。エラーが検出されない場合、アプリケーションは、再試行するか安全に失敗する必要があります。

接続の再試行には、次の方法をおすすめします。

  1. 指数バックオフ。再試行の間隔を指数関数的に増やします。
  2. ランダム化されたバックオフも追加します。

これらの方法を組み合わせると、スロットリングが減ります。

エラー メッセージ: Login failed for user "" このログインエラーは、Microsoft Entra ID 認証中に発生することがあります。この問題を解決するには、当該 Microsoft Entra ID ユーザーの SQL Server ログインが存在することを確認します。
プライベート IP インスタンスのネットワーク接続に関する問題 統合のセットアップ中に、次の問題が発生することがあります。
  • Microsoft Entra ID ログインの作成オペレーションに時間がかかる
  • Microsoft Entra ID ログインを作成できない
  • Microsoft Entra ID 認証を使用してインスタンスに接続できない

これらの問題の解決方法について詳しくは、Microsoft Entra ID 統合のトラブルシューティングをご覧ください。

FATAL: database 'user' does not exist. gcloud sql connect --user はデフォルトの postgres ユーザーでのみ機能します。

デフォルト ユーザーで接続してから、ユーザーを変更します。

接続されているユーザーを確認する必要があります。 データベースにログインし、次のコマンドを実行します。

SELECT datname,
usename,
application_name as appname,
client_addr,
state,
now() - backend_start as conn_age,
now() - state_change as last_activity_age
FROM pg_stat_activity
WHERE backend_type = 'client backend'
ORDER BY 6 DESC
LIMIT 20
   

インスタンスの作成

問題 トラブルシューティング
エラー メッセージ: The zone or region does not have sufficient resources to handle the request at the moment.

インスタンスの作成をリクエストした時点で、選択したゾーンに、リクエストされたリソースまたは VM タイプに対応できるだけの容量がなかったことを意味します。リクエストを行ったのと同じ時点で、その特定のリージョン ロケーションで運用上の需要が高まっていた可能性があります。

この問題を解決するには、別のゾーンでインスタンスの作成を再試行するか、このエラーが発生したゾーンで別の時間にインスタンスの作成を再試行します。

エラー メッセージ: Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges. Please allocate new ranges for this service provider 割り振り済みの IP 範囲にこれ以上使用可能なアドレスがありません。次のシナリオが考えられます。
  • Private Service Connect に割り振られた IP 範囲のサイズが /24 より小さい。
  • プライベート サービス接続に割り振られた IP 範囲のサイズが、Cloud SQL インスタンスの数に対して小さすぎる。
  • インスタンスを複数のリージョンで作成すると、割り振られた IP 範囲のサイズに関する要件が大きくなります。割り振られた範囲のサイズをご覧ください。

この問題を解決するには、既存の割り振られた IP 範囲を拡張するか、プライベート サービス接続に追加の IP 範囲を割り振ります。詳細については、IP アドレス範囲を割り振るをご覧ください。

Cloud SQL インスタンスの作成時に --allocated-ip-range-name フラグを使用した場合は、指定した IP 範囲のみ拡張できます。

新しい範囲を割り当てる場合は、割り当てが既存の割り当てと重複しないように注意してください。

新しい IP 範囲を作成した後、次のコマンドを使用して VPC ピアリングを更新します。

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com \
--ranges=OLD_RESERVED_RANGE_NAME,NEW_RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID \
--force
    

既存の割り振りを拡張する場合は、割り振り範囲を増やすのみとし、減らさないように注意してください。たとえば、元の割り振りが 10.0.10.0/24 だった場合、新しい割り振りを少なくとも 10.0.10.0/23 に設定します。

一般的に、/24 の割り振りから開始する場合は、各条件(追加のインスタンス タイプのグループ、追加のリージョン)で /mask を 1 つずつ減らすのが基本的なルールです。たとえば、同じ割り振りで両方のインスタンス タイプのグループを作成しようとしている場合も、/24 から /23 にするだけで十分です。

既存の IP 範囲を拡張した後、次のコマンドを使用して vpc ピアリングを更新します。

gcloud services vpc-peerings update \
--service=servicenetworking.googleapis.com \
--ranges=RESERVED_RANGE_NAME \
--network=VPC_NETWORK \
--project=PROJECT_ID
    
エラー メッセージ: Failed to create subnetwork. Router status is temporarily unavailable. Please try again later. Help Token: [token-ID] Cloud SQL インスタンスをもう一度作成してみてください。
エラー メッセージ: HTTPError 400: Invalid request: Incorrect Service Networking config for instance: PROJECT_ID:INSTANCE_NAME:SERVICE_NETWORKING_NOT_ENABLED.

次のコマンドを使用して Service Networking API を有効にし、Cloud SQL インスタンスをもう一度作成してみてください。

gcloud services enable servicenetworking.googleapis.com \
--project=PROJECT_ID
    
エラー メッセージ: Failed to create subnetwork. Required 'compute.projects.get' permission for PROJECT_ID プライベート IP アドレスを使用してインスタンスを作成すると、Service Networking API を使用してサービス アカウントがジャスト イン タイムで作成されます。Service Networking API を最近有効にしたばかりの場合は、サービス アカウントが作成されず、インスタンスの作成が失敗する可能性があります。この場合は、サービス アカウントがシステム全体に伝播するのを待つか、必要な権限を使用して手動で追加する必要があります。
エラー メッセージ: More than 3 subject alternative names are not allowed. カスタム SAN を使用して、4 つ以上の DNS 名を Cloud SQL インスタンスのサーバー証明書に追加しようとしています。インスタンスに追加できる DNS 名は 3 つまでです。
エラー メッセージ: Subject alternative names %s is too long. The maximum length is 253 characters. Cloud SQL インスタンスのサーバー証明書に追加する DNS 名が 253 文字を超えないようにします。
エラー メッセージ: Subject alternative name %s is invalid.

Cloud SQL インスタンスのサーバー証明書に追加する DNS 名が次の条件を満たしていることを確認します。

  • ワイルドカード文字が含まれていない。
  • 末尾にピリオドがない。
  • RFC 1034 の仕様に適合している。

エクスポート

問題 トラブルシューティング
HTTP Error 409: Operation failed because another operation was already in progress. 保留中のオペレーションがインスタンスにすでに存在しています。一度に実行できるオペレーションは 1 つだけです。現在のオペレーションが完了してからリクエストを試してください。
HTTP Error 403: The service account does not have the required permissions for the bucket. バケットが存在し、バケットへのエクスポートを許可する Storage Object Creator ロール(roles/storage.objectCreator)が Cloud SQL インスタンス用のサービス アカウント(エクスポートを行っているアカウント)に付与されていることを確認します。Cloud Storage に適用される IAM ロールをご覧ください。
CSV のエクスポートは機能したが、SQL エクスポートに失敗した。 CSV 形式と SQL 形式ではエクスポート方法が異なります。SQL 形式ではデータベース全体がエクスポートされるため、完了までに時間がかかります。CSV 形式ではエクスポートに含めるデータベースの要素を定義できます。

CSV エクスポートを使用して必要なものだけをエクスポートします。

エクスポートに時間がかかりすぎる。 Cloud SQL では同時実行オペレーションの同期がサポートされません。

エクスポートをオフロードします。エクスポートをオフロードするときに、Cloud SQL はソース インスタンスでエクスポートを発行するのではなく、オフロード インスタンスを起動してエクスポートを実行します。エクスポート オフロードには、ソース インスタンスでのパフォーマンス向上、エクスポート実行中の管理オペレーションのブロック解除などの利点があります。エクスポート オフロードでは、合計レイテンシがオフロード インスタンスの起動時間まで増加する可能性があります。一般に、適当なサイズのエクスポートでは、レイテンシは重要ではありません。ただし、エクスポートが小さい場合、レイテンシが増加することがあります。

拡張機能の作成のエラー。 ダンプファイルに、サポートされていない拡張機能への参照が含まれています。

ダンプファイルを編集して参照を削除します

pg_dumpall の使用中にエラーが発生した。 --global フラグを持つ pg_dumpall ユーティリティを使用するには、スーパーユーザー ロールが必要ですが、このロールは Cloud SQL ではサポートされていません。ユーザー名を含むエクスポート オペレーションの実行中にエラーが発生しないようにするには、--no-role-passwords フラグも使用します。
エクスポートが完了する前にオペレーションがタイムアウトすると、Could not receive data from client: Connection reset by peer. というエラー メッセージが表示されます。 Cloud Storage が所定の時間(通常は約 7 分)内にデータを受信しないと、接続はリセットされます。最初のエクスポート クエリは、非常に時間がかかる可能性があります。

pg_dump ツールを使用して、手動でエクスポートします。

エクスポートを自動化したい。 Cloud SQL には、エクスポートを自動化する方法がありません。

バックアップの自動化に関する記事のように、 Google Cloudプロダクト(Cloud Scheduler、Pub/Sub、Cloud Run functions)を使用して、独自の自動エクスポート システムを構築できます。

外部プライマリ

問題 トラブルシューティング
Lost connection to MySQL server during query when dumping table. ソースが使用不能か、ダンプに含まれているパケットが大きすぎる可能性があります。

外部プライマリが接続できることを確認します。また、ソース インスタンスの net_read_timeout フラグと net_write_timeout フラグの値を変更して、エラーを防ぐこともできます。これらのフラグに使用可能な値の詳細については、データベース フラグを構成するをご覧ください。

マネージド インポート移行の mysqldump フラグの使用方法については、使用可能な初期同期フラグとデフォルトの初期同期フラグをご覧ください。

最初のデータの移行は成功したが、データが複製されていない。 根本原因の一つとして、ソース データベースでレプリケーション フラグが定義されているため、データベースの一部またはすべての変更が複製されていない可能性があります。

binlog-do-dbbinlog-ignore-dbreplicate-do-dbreplicate-ignore-db などのレプリケーション フラグが競合する方法で設定されていないことを確認します。

プライマリ インスタンスで show master status コマンドを実行して、現在の設定を確認します。

最初のデータ移行は成功したが、しばらくするとデータ レプリケーションが機能しなくなる。 次の方法をお試しください。

  • Google Cloud コンソールの [Cloud Monitoring] セクションで、レプリカ インスタンスのレプリケーション指標を確認します。
  • MySQL IO スレッドまたは SQL スレッドのエラーは、mysql.err log ファイルの Cloud Logging で確認できます。
  • このエラーは、レプリカ インスタンスに接続するときにも発生する場合があります。SHOW SLAVE STATUS コマンドを実行して、出力で次のフィールドを確認します。
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full. レプリカ インスタンスのデータディスクに空き容量がありません。

レプリカ インスタンスのディスクサイズを増やします。ディスクサイズを手動で増やすか、自動ストレージ増加を有効にします。

外部レプリカ

問題 トラブルシューティング
エラー メッセージ: The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires プライマリ Cloud SQL インスタンスで自動バックアップ、バイナリログ、ポイントインタイム リカバリが有効になっているため、レプリカが追いつくまで必要なログが保持されていなければなりません。しかし、この場合、バイナリログは存在しますが、読み取りを開始する行がレプリカで認識されません。

正しいフラグを設定して新しいダンプファイルを作成し、そのファイルを使用して外部レプリカを構成します。

  1. Compute Engine インスタンスを介して mysql クライアントに接続します。
  2. mysqldump を実行し、--master-data=1 フラグと --flush-privileges フラグを使用します。

    重要: --set-gtid-purged=OFF フラグを含めないでください

    詳細

  3. 作成したダンプファイルに SET @@GLOBAL.GTID_PURGED='...' 行が含まれていることを確認します。
  4. ダンプファイルを Cloud Storage バケットにアップロードし、ダンプファイルを使用してレプリカを構成します。

フラグ

問題 トラブルシューティング

高可用性

問題 トラブルシューティング
手動フェイルオーバーの指標が表示されない。 自動フェイルオーバーの指標のみが表示されます。
Cloud SQL インスタンス リソース(CPU と RAM)の使用率が 100% に近いため、高可用性インスタンスが停止する。 インスタンスのマシンサイズが負荷に対して小さすぎます。

インスタンスを編集してより大きなマシンサイズにアップグレードし、CPU とメモリのサイズを大きくします。

インポート

問題 トラブルシューティング
HTTP Error 409: Operation failed because another operation was already in progress. 保留中のオペレーションがインスタンスにすでに存在しています。一度に実行できるオペレーションは 1 つだけです。現在のオペレーションが完了してからリクエストを試してください。
インポート オペレーションに時間がかかりすぎる。 アクティブな接続が多すぎると、インポート オペレーションが妨げられる可能性があります。