接続の問題のデバッグ

はじめに

通常、接続の問題は次の 3 つの領域のいずれかに分類されます。

  • 接続 - ネットワーク経由でご自身のインスタンスにアクセスできますか?
  • 認可 - インスタンスへの接続を認可されていますか?
  • 認証 - データベースはご自身のデータベースの認証情報を受け入れていますか?

調査では、それぞれの領域がさらに細かく別の項目にわかれます。次のセクションでは、問題をさらに絞り込むために自問できる質問の例を示します。

接続の問題のチェックリスト

エラー メッセージ

特定の API エラー メッセージについては、エラー メッセージのリファレンス ページをご覧ください。

その他の接続に関するトラブルシューティング

その他の問題については、トラブルシューティング ページの接続のセクションをご覧ください。

接続に関する一般的な問題

アプリケーションが実行中であることを確認する

Aborted connection nnnn to db:」というエラーが表示された場合は、通常、アプリケーションの接続が正しく終了されていないことを示します。ネットワークの問題もこのエラーの原因になる可能性があります。このエラーは、Cloud SQL インスタンスに問題があることを意味するものではありません。また、tcpdump を実行してパケットを調べ、問題の原因を突き止めることをおすすめします。

接続を管理する際のおすすめの方法の例については、データベース接続の管理をご覧ください。

証明書が期限切れではないことを確認する

SSL を使用するようにインスタンスを構成している場合は、Cloud Console で Cloud SQL インスタンス ページに移動して、インスタンスを開きます。[接続] ページを開き、[セキュリティ] タブを選択して、サーバー証明書が有効であることを確認します。期限切れの場合は、新しい証明書を追加してローテーションする必要があります。

接続を許可されていることを確認する

接続が失敗する場合は、接続を許可されていることを確認します。

  • IP アドレスで接続できない場合(たとえば、MySQL クライアントを使用してオンプレミス環境から接続している場合)、接続元の IP アドレスに Cloud SQL インスタンスへの接続が承認されていることを確認します。

    プライベート IP アドレスを使用して Cloud SQL インスタンスへ接続すると、RFC 1918 アドレス範囲が自動的に承認されます。これにより、すべてのプライベート クライアントは、Cloud SQL Auth Proxy を経由せずにデータベースにアクセスできます。RFC 1918 以外のアドレス範囲は、承認済みネットワークとして構成する必要があります。

    Cloud SQL は、デフォルトでは VPC から RFC 1918 以外のサブネット ルートを学習しません。RFC 1918 以外のルートをエクスポートするには、Cloud SQL へのネットワーク ピアリングを更新する必要があります。次に例を示します。

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
    
  • こちらが現在の IP アドレスです。

  • gcloud sql connect コマンドでインスタンスに接続してみます。このコマンドは現在の IP アドレスを短時間だけ認可します。このコマンドは、Cloud SDK と MySQL クライアントがインストールされている環境で実行できます。このコマンドは Cloud Shell でも実行できます。Google Cloud Console で使用できる Cloud Shell には、Cloud SDK と MySQL クライアントがプリインストールされています。Cloud Shell で提供される Compute Engine インスタンスを使用して、Cloud SQL に接続できます。
  • 一時的に、すべての IP アドレスにインスタンスへの接続を許可します。IPv4 については、0.0.0.0/0 を認可します(IPv6 については、::/0 を認可します)。

接続方法を確認する

接続時に次のようなエラー メッセージが表示される場合:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)

パスワードを提供していることを確認します。

接続時に次のようなエラー メッセージが表示される場合:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)

正しいパスワードを使用していること、およびインスタンスで要求されている場合は SSL で接続していることを確認します。

接続の開始状態を確認する

データベースに接続して次のコマンドを実行すると、現在の接続に関する情報を確認できます。

SHOW PROCESSLIST;

接続に 1.2.3.4 のような IP アドレスが示されている場合、その接続では IP が使用されています。cloudsqlproxy~1.2.3.4 が示されている接続の場合は、Cloud SQL Auth Proxy が使用されているか、App Engine が送信元の接続です。localhost からの接続は、一部の内部 Cloud SQL プロセスで使用できます。

接続制限について

Cloud SQL インスタンスに QPS の制限はありません。ただし、接続数やサイズの制限および App Engine 固有の制限はあります。割り当てと上限をご覧ください。

データベース接続は、サーバーと接続元アプリケーションのリソースを消費します。アプリケーションのフットプリントを最小限に抑え、Cloud SQL の接続制限を超える可能性を少なくするには、常に適切な接続管理方法を採用してください。詳細については、データベース接続の管理をご覧ください。

接続数とスレッド数を表示する

「接続が多すぎる」というエラー メッセージが表示される場合、またはインスタンスで起きていることを確認する必要がある場合は、SHOW PROCESSLIST を使用して接続数とスレッド数を表示できます。

MySQL クライアントから、次のように実行します。

mysql> SHOW PROCESSLIST;

出力は次のようになります。

+----+-----------+--------------+-----------+---------+------+-------+----------------------+
| Id | User      | Host         | db        | Command | Time | State | Info                 |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
|  3 | user-name | client-IP    | NULL      | Query   |    0 | NULL  | SHOW processlist     |
|  5 | user-name | client-IP    | guestbook | Sleep   |    1 |       | SELECT * from titles |
| 17 | user-name | client-IP    | employees | Query   |    0 | NULL  | SHOW processlist     |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
3 rows in set (0.09 sec)

PROCESSLIST から返される列の解釈方法については、MySQL リファレンスをご覧ください。

スレッド数を取得するには、次のコマンドを使用します。

mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';

出力は次のようになります。

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 7     |
+-------------------+-------+
1 row in set (0.08 sec)

接続タイムアウト(Compute Engine)

Compute Engine インスタンスとの接続は、アクティブでない状態で 10 分経過するとタイムアウトします。これは、Compute Engine インスタンスと Cloud SQL インスタンスの間の長期間使用されない接続に影響します。詳細については、Compute Engine のドキュメントのネットワークとファイアウォールをご覧ください。

長時間使用されない接続がタイムアウトしないようにするには、TCP keep-alive を設定できます。次のコマンドは TCP keep-alive の値を 1 分に設定し、インスタンスが再起動しても構成が変わらないようにします。

現在の tcp_keepalive_time の値を表示します。

cat /proc/sys/net/ipv4/tcp_keepalive_time

tcp_keepalive_time を 60 秒に設定し、再起動しても変わらないようにします。

echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

変更を適用します。

sudo /sbin/sysctl --load=/etc/sysctl.conf

tcp_keepalive_time の値を表示して、変更が適用されたことを確認します。

cat /proc/sys/net/ipv4/tcp_keepalive_time

IPv6 との接続

接続時に次のようなエラー メッセージが表示される場合があります。

Can't connect to MySQL server on '2001:1234::4321' (10051)
Can't connect to MySQL server on '2001:1234::4321' (101)

このような場合は、インスタンスの IPv6 アドレスに接続を試みているのに、ワークステーションでは IPv6 を使用できない可能性があります。ワークステーションで IPv6 を使用できるかどうかを確認するには、ipv6.google.com にアクセスします。このサイトを読み込めない場合は、IPv6 を使用できません。この場合は IPv4 アドレスまたは Cloud SQL インスタンスに接続します。先に、IPv4 アドレスをインスタンスに追加することが必要な場合があります。

ときどき発生する接続障害(レガシー HA)

メンテナンス イベントによって Cloud SQL でインスタンスが再起動されると、接続はフェイルオーバー レプリカにルーティングされる可能性があります。フェイルオーバー レプリカに接続すると、次のようになります。

  • 暗号化されていない接続を使用したクライアントからの読み取りリクエストは、通常どおり成功します。ただし、書き込みリクエストは失敗し、「Error 1290: The MySQL server is running with the --read-only option so it cannot execute this statement」(エラー 1290: MySQL サーバーは読み取り専用オプションで実行しているので、このステートメントを実行できません)などのエラー メッセージが返されます。
  • 暗号化された接続を使用したクライアントからの読み取りと書き込みのリクエストは失敗し、「x509: certificate is valid for master-instance, not failover-instance」(x509: 証明書はフェイルオーバー インスタンスではなく、マスター インスタンスに対して有効です)などのエラー メッセージが返されます。

イベントが終了すると、Cloud SQL によって接続はリセットされます。接続を再試行します。アプリケーションを設計するとき、ときどき発生する接続障害を処理するために指数バックオフのようなエラー処理方法を実装することをおすすめします。詳細については、アプリケーションの実装をご覧ください。

接続をデバッグするツール

tcpdump

tcpdump は、パケットをキャプチャするツールです。接続の問題をデバッグする際、tcpdump を実行して、ホストと CloudSQL インスタンス間のパケットをキャプチャして検査することを強くおすすめします。

ローカル IP アドレスを確認する

ホストのローカル アドレスがわからない場合は、ip -br address show コマンドを実行します。Linux では、ネットワーク インターフェース、インターフェースのステータス、ローカル IP、MAC アドレスが表示されます。例: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64

あるいは、ipconfigifconfig を実行して、ネットワーク インターフェースのステータスを確認することもできます。

接続テストによるテスト

接続テストは、ネットワーク内のエンドポイント間の接続を確認できる診断ツールです。構成を分析し、場合によってはランタイム検証を行います。Cloud SQL がサポートされるようになりました。Cloud SQL インスタンスでテストを行うには、こちらの手順を行ってください。

接続をテストする

mysql クライアントを使用して、ローカル環境からの接続状況をテストできます。詳細については、IP アドレスを使用して mysql クライアントを接続するCloud SQL Auth Proxy を使用して mysql クライアントを接続するをご覧ください。

アプリケーションの IP アドレスを確認する

アプリケーションを実行しているパソコンの IP アドレスから Cloud SQL インスタンスへのアクセスを承認できるようにするため、そのパソコンの IP アドレスを確認するには、次のいずれかのオプションを使用します。

  • パソコンがプロキシやファイアウォールの背後にない場合は、パソコンにログインし、What is my IP? サイトを使用してIP アドレスを確認します。
  • パソコンがプロキシやファイアウォールの背後にある場合は、パソコンにログインし、ツールや whatismyipaddress.com などのサービスを使用して実際の IP アドレスを確認します。

開いているローカルポート

ホストがリッスンしていると思われるポートを確認するには、ss -tunlp4 コマンドを実行します。これにより、開いているポートとリッスンしているポートがわかります。たとえば、動作している MySQL データベースがある場合は、ポート 3306 が開いており、リッスンしています。SSH の場合は、ポート 22 が表示されます。

すべてのローカルポート アクティビティ

すべてのローカルポート アクティビティを表示するには、netstat コマンドを使用します。たとえば、netstat -lt を使用すると、現在アクティブなポートがすべて表示されます。

telnet を使用して Cloud SQL インスタンスに接続する

TCP を使用して Cloud SQL インスタンスに接続できることを確認するには、telnet コマンドを実行します。Telnet は、指定された IP アドレスとポートに接続しようとします。

たとえば、Cloud SQL インスタンスで MySQL データベースを実行している場合は、telnet 35.193.198.159 3306 と指定すると、ポート 3306 でインスタンスに telnet 接続できます。

成功すると、次のように表示されます。

Trying 35.193.198.159...

Connected to 35.193.198.159.

失敗すると、試行を強制終了するまで telnet がハングします。

Trying 35.193.198.159...

^C.

Cloud Logging

Cloud SQL と Cloud SQL は、Cloud Logging を使用します。詳細については、Cloud logging のドキュメントをご覧ください。また、Cloud SQL のサンプルクエリもご覧ください。

ログを表示

Cloud SQL インスタンスと、Cloud VPN や Compute Engine インスタンスなどのその他の Google Cloud プロジェクトのログを表示できます。Cloud SQL インスタンスのログエントリのログを表示するには:

Console

  1. Google Cloud Console で、[Cloud Logging] ページに移動します。

    Cloud Logging に移動

  2. ページの上部で既存の Cloud SQL プロジェクトを選択します。
  3. クエリビルダーに以下のクエリを追加します。
    • リソース: [Cloud SQL データベース] を選択します。ダイアログで、Cloud SQL インスタンスを選択します。
    • ログ名: Cloud SQL セクションまでスクロールし、インスタンスに適したログファイルを選択します。例:
      • cloudsql.googlapis.com/mysql-general.log
      • cloudsql.googleapis.com/mysql.err
    • 重大度: ログレベルを選択します。
    • 時間範囲: プリセットを選択するか、カスタム範囲を作成します。

gcloud

gcloud logging コマンドを使用して、ログエントリを表示します。次の例では、PROJECT_ID を置き換えます。 limit フラグは、返されるエントリの最大数を示すオプションのパラメータです。

gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/mysql-general.log" \
--limit=10

プライベート IP アドレス

プライベート IP アドレスを使用して Cloud SQL インスタンスへ接続すると、RFC 1918 アドレス範囲が自動的に承認されます。RFC 1918 以外のアドレス範囲は、Cloud SQL で認可済みネットワークとして構成される必要があります。また、RFC 1918 以外のルートをエクスポートするには、Cloud SQL へのネットワーク ピアリングを更新する必要もあります。次に例を示します。

gcloud compute networks peerings update cloudsql-mysql-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID

IP 範囲 172.17.0.0/16 は、Docker ブリッジ ネットワーク用に予約されています。この範囲内の IP アドレスで作成された Cloud SQL インスタンスはすべて到達不能になります。プライベート IP アドレスを使用して、この範囲内の IP アドレスから Cloud SQL インスタンスに接続することもできません。

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

Cloud VPN のトラブルシューティングのページをご覧ください。