MySQL 8.0 リファレンスマニュアル


B.3.2.2 [ローカルの] MySQL サーバーに接続できません

UNIX 上の MySQL クライアントは mysqld サーバーに 2 つの方法で接続できます。UNIX ソケットファイルを使用してファイルシステム内のファイル (デフォルトは /tmp/mysql.sock) を介して接続するか、TCP/IP を使用してポート番号を介して接続します。 UNIX ソケットファイルでの接続は TCP/IP よりも高速ですが、同じコンピュータ上にあるサーバーに接続するときにのみ使用できます。 UNIX ソケットファイルは、ホスト名を指定しない場合、または特殊なホスト名 localhost を指定する場合に使用されます。

MySQL サーバーが Windows 上で実行されている場合は、TCP/IP を使用して接続できます。 named_pipe システム変数を有効にしてサーバーを起動した場合、サーバーが実行されているホストでクライアントを実行していれば、名前付きパイプで接続することもできます。 デフォルトでは、名前付きパイプの名前は MySQL です。 mysqld に接続するときにホスト名を指定しない場合、MySQL クライアントは最初に名前付きパイプに接続しようとします。 接続できない場合は、TCP/IP ポートに接続します。 Windows で名前付きパイプの使用を強制するには、ホスト名として . を使用します。

エラー (2002) 「... に接続できません」 は、通常、サーバーに接続しようとしたときに、システムで MySQL サーバーが実行されていなかったこと、あるいは間違った UNIX ソケットファイル名または TCP/IP ポート番号を使用していることを意味しています。 使用している TCP/IP ポートがファイアウォールまたはポートブロックサービスによってブロックされていないことも確認してください。

エラー (2003) 「'server' の MySQL サーバーに接続できません (10061)」 は、ネットワーク接続が拒否されたことを示しています。 MySQL サーバーが実行されていること、ネットワーク接続が有効にされていること、および指定したネットワークポートがサーバーに構成されていることを確認してください。

サーバーのホストで mysqld という名前のプロセスが実行されているかどうかを確認することから始めます。 (UNIX では ps xa | grep mysqld、Windows ではタスクマネージャーを使用します。) プロセスがない場合は、サーバーを起動してください。 セクション2.10.2「サーバーの起動」を参照してください。

mysqld プロセスが実行されている場合は、次のコマンドを使用してチェックできます。 ポート番号または UNIX ソケットファイル名は、使用している環境では異なる場合があります。host_ip は、サーバーが実行されているマシンの IP アドレスを表しています。

shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h host_ip version
shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

hostname コマンドでは通常の引用符ではなく逆引用符が使用されています。これにより、hostname の出力 (つまり、現在のホスト名) が mysqladmin コマンドに渡されます。 hostname コマンドがないか、Windows 上で実行している場合は、-h オプションに続けて、マシンのホスト名を手動で入力できます (逆引用符なし)。 -h 127.0.0.1 を使用して、TCP/IP でローカルホストへの接続を試みることもできます。

サーバーがネットワーク接続を無視するように構成されていないこと、または (リモート側から接続しようとする場合に) サーバーのネットワークインタフェース上でローカル側でのみ待機するように構成されていないことを確認します。 skip_networking システム変数を有効にしてサーバーを起動した場合、TCP/IP 接続を受け入れることはできません。 bind_address システム変数を 127.0.0.1 に設定してサーバーを起動した場合、サーバーはループバックインタフェースでローカルでのみ TCP/IP 接続をリスニングし、リモート接続を受け入れません。

ファイアウォールが MySQL へのアクセスをブロックしていないか確認します。 ファイアウォールは、実行中のアプリケーションまたは MySQL によって通信用に使用されるポート番号 (デフォルトは 3306) を基準として構成されることがあります。 Linux または Unix の場合、IP テーブル (または同様の機能の) 構成を調べてポートがブロックされていないことを確認します。 Windows では、ZoneAlarm や Windows ファイアウォールなどのアプリケーションを、MySQL ポートをブロックしないように構成する必要がある場合があります。

「ローカルの MySQL サーバーに接続できません」というエラーが発生する可能性があるいくつかの原因を次に示します。

  • mysqld がローカルホストで実行されていない。 オペレーティングシステムのプロセスリストをチェックして、mysqld プロセスが存在することを確認します。

  • 多数の TCP/IP 接続がある Windows 上で MySQL サーバーを実行している。 クライアントで頻繁にそのエラーが発生している場合は、セクションB.3.2.2.1「Windows で MySQL サーバーへの接続に失敗する」に回避策があります。

  • mysqld が使用する UNIX ソケットファイル (デフォルトでは /tmp/mysql.sock) をほかのユーザーが削除した。 たとえば、/tmp ディレクトリから古いファイルを削除する cron ジョブがある可能性があります。 mysqladmin version を実行すると、mysqladmin が使用する UNIX ソケットファイルが実際に存在するかどうかを確認できます。 この場合の対処方法は、mysql.sock を削除しないように cron ジョブを変更するか、ソケットファイルを別の場所に配置することです。 セクションB.3.3.6「MySQL の UNIX ソケットファイルを保護または変更する方法」を参照してください。

  • --socket=/path/to/socket オプションを指定して mysqld サーバーを起動したが、クライアントプログラムにソケットファイルの新しい名前を指定し忘れた。 サーバーのソケットパス名を変更したら、MySQL クライアントにも通知する必要があります。 これを行うには、クライアントプログラムを実行するときに同じ --socket オプションを指定します。 mysql.sock ファイルにアクセスするための権限がクライアントにあることも確認する必要があります。 ソケットファイルがある場所を見つけるには、次のコマンドを実行します。

    shell> netstat -ln | grep mysql

    セクションB.3.3.6「MySQL の UNIX ソケットファイルを保護または変更する方法」を参照してください。

  • Linux を使用していて、1 つのサーバースレッドが停止した (コアがダンプされた)。 この場合は、MySQL サーバーを再起動する前に、ほかの mysqld スレッドを強制終了する (たとえば、kill を使用します) 必要があります。 セクションB.3.3.3「MySQL が繰り返しクラッシュする場合の対処方法」を参照してください。

  • UNIX ソケットファイルが保持されているディレクトリまたはソケットファイル自体に対する適切なアクセス権限が、サーバーまたはクライアントプログラムにない可能性がある。 この場合は、ディレクトリまたはソケットファイルのアクセス権限を変更して、サーバーおよびクライアントがそれらにアクセスできるようにするか、サーバーがソケットファイルを作成でき、クライアントプログラムがアクセスできるディレクトリのソケットファイル名を指定する --socket オプションを指定して mysqld を再起動します。

「some_host 上の MySQL サーバーに接続できません」というエラーメッセージが表示された場合は、次のことを行なって問題の原因を見つけてください。

  • telnet some_host 3306 を実行して Enter キーを何度か押すことによって、サーバーがそのホスト上で実行されているかどうかを確認します (3306 は MySQL のデフォルトのポート番号です。 サーバーが別のポートで待機している場合は、値を変更します。) MySQL サーバーが実行されていて、そのポートで待機している場合は、サーバーのバージョン番号を含む応答を受け取ります。 「telnet: リモートホストに接続できません: 接続は拒否されました」などのエラーを受け取った場合、指定したポートでサーバーは実行されていません。

  • サーバーがローカルホストで実行されている場合は、mysqladmin -h localhost variables を使用して UNIX ソケットファイルを使用して接続することを試みてください。 サーバーが待機するように構成されている TCP/IP ポート番号を確認します (これは port 変数の値です。)

  • Linux で実行しており、セキュリティ強化された Linux (SELinux) が有効になっている場合は、セクション6.7「SELinux」 を参照してください。

B.3.2.2.1 Windows で MySQL サーバーへの接続に失敗する

多数の TCP/IP 接続のある Windows 上で MySQL サーバーを実行していて、「MySQL サーバーに接続できません」というエラーが頻繁に発生している場合は、それらの接続に対応するための十分なエフェメラル (一時的な) ポートを Windows が許可していないことが原因である可能性があります。

TIME_WAIT の目的は、接続が閉じられたあとでも、接続がパケットを受け入れるようにすることです。 これは、インターネットのルーティングによってパケットに低速なルートが割り当てられ、双方がクローズに同意したあとにパケットが受信されることがあるためです。 そのポートが新しい接続に使用された場合は、古い接続からのパケットによってプロトコルが断絶したり、元の接続からの個人情報が漏えいしたりすることがあります。 TIME_WAIT による遅延は、それらの遅延したパケットを受信するために一定の時間を猶予してからポートが再使用されるようにすることによってこれを防ぎます。

LAN 接続では、距離と遅延が比較的に大きいインターネットとは異なり、パケットが大きく遅延して受信されることはほとんどないため、TIME_WAIT を大幅に減らしたほうが安全です。

Windows はエフェメラル (一時的な) TCP ポートをユーザーに許可しています。 ポートが閉じられると、120 秒間 TIME_WAIT ステータスのままになります。 この時間が経過するまで、ポートは再び使用できません。 ポート番号のデフォルトの範囲は、Windows のバージョンによって異なります。古いバージョンではポートの数がより制限されます。

  • Windows Server 2003 まで: 1025-5000 の範囲のポート

  • Windows Vista、Server 2008 以降: 49152-65535 の範囲のポート

使用可能な TCP ポートが少なく (5000)、TIME_WAIT ステータスで多数の TCP ポートが短い期間にオープンおよびクローズされると、ポートが不足する可能性が高くなります。 この問題に対処する方法は 2 つあります。

  • 原因となっている可能性のある接続プールまたは永続的な接続を調査することによって、急速に消費される TCP ポートの数を減らします

  • Windows レジストリのいくつかの設定をチューニングします (次の手順を参照してください)

重要

次の手順では、Windows レジストリを変更します。 レジストリを変更する前に、必ずレジストリをバックアップし、問題が発生した場合の復元方法を理解しておいてください。 レジストリをバックアップ、復旧、および編集する方法については、Microsoft サポート技術情報の記事 (http://support.microsoft.com/kb/256986/EN-US/) を参照してください。

  1. レジストリエディタ (Regedt32.exe) を開始します。

  2. レジストリの次のキーを見つけます。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  3. 「編集」メニューで、「値の追加」をクリックして次のレジストリ値を追加します。

    Value Name: MaxUserPort
    Data Type: REG_DWORD
    Value: 65534

    これにより、ユーザーが使用できるエフェメラルポートの番号が設定されます。 有効な範囲は 5000 から 65534 (10 進数) までです。 デフォルト値は 0x1388 (10 進数の 5000) です。

  4. 「編集」メニューで、「値の追加」をクリックして次のレジストリ値を追加します。

    Value Name: TcpTimedWaitDelay
    Data Type: REG_DWORD
    Value: 30

    これにより、閉じる前に TIME_WAIT 状態で TCP ポートの接続を保持する秒数が設定されます。 有効な範囲は 30 から 300 桁ですが、Microsoft で許可されている最新の値を確認できます。 デフォルト値は 0x78 (10 進数の 120) です。

  5. レジストリエディタを終了します。

  6. マシンをリブートします。

注意: 前述した設定を元に戻すには、作成したレジストリのエントリを削除します。


関連キーワード:  接続, サーバー, ポート, 実行, ソケット, エラー, 方法, 確認, mysqld, mysqladmin