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

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

MySQL サーバーが Windows 上で実行されている場合は、TCP/IP を使用して接続できます。サーバーが --enable-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.1.3「MySQL サーバーの起動とトラブルシューティング」を参照してください。

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 XP パーソナルファイアウォールなどのアプリケーションが MySQL ポートをブロックしないようにこれらを構成することが必要な場合があります。

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

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

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

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

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

    shell> netstat -ln | grep mysql
    

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

  • Linux を使用していて、1 つのサーバースレッドが停止した (コアがダンプされた)。この場合は、MySQL サーバーを再起動する前に、ほかの mysqld スレッドを強制終了する (たとえば、kill を使用します) 必要があります。セクションB.5.4.2「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 上で実行していて、Security-Enhanced Linux (SELinux) が有効にされている場合は、mysqld プロセスに対して SELinux の保護が無効にされていることを確認します。

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

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

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

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

Windows はエフェメラル (一時的な) TCP ポートをユーザーに許可しています。ポートが閉じられると、TIME_WAIT ステータスとして 120 秒間維持されます。ポートは、この時間が経過するまで再び使用可能になりません。ポート番号のデフォルトの範囲は、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 ポートの接続を保持する秒数が設定されます。有効な範囲は 0 (ゼロ) から 300 (10 進数) までです。デフォルト値は 0x78 (10 進数の 120) です。

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

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

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


User Comments
  Posted by Rick Measham on November 17, 2004
I was getting this error because the daemon couldn't create a pid file in the requested place. It never told me that it couldn't, it just never wrote it.

Once I made the pid file's location writable by the mysql user, everything started working.
  Posted by Greg Rundlett on August 20, 2005
Using /usr/sbin/mysqld --verbose allowed me to see that there was an unrecognized variable 'old_passwords=1', which I later found out was being set by Debian in /etc/mysql/my.cnf for some backward compatibility with *Debian* software. Removing this entry from the configuration file was all that was needed to get my server working again. This bug has been addressed by the Debian package maintainers: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=321578
  Posted by Lennart Zuur on January 28, 2006
This worked for me on SuSe 10.
Disabling IPv6 for MySQLd wil fix the socket creation problem for now.
  Posted by Sam Mehta on April 10, 2006
I faced a similar problem where mysql 5.0.19 (upgraded from 4.1.13) would just not connect from neither perl/java nor php. Command line connections were OK for root but not for other users even they had same privileges as the root user. Problem resolved by correcting the hosts file. Apparently if localhost isnt the first alias for 127.0.0.1, then you're in for trouble. Same situation with a postgres 8.1 installation. Good luck.
  Posted by Einar Coutin on June 20, 2006
Remember,
Once you have edited the my.conf under /etc/mysql and removed the bind-host line you must also do the following:

mysql> grant all prvileges on *.* to <userName>@<hostName> identified by 'passwrd'

where the user will own the database acces and the host is the machine you're connecting from.

Thanks to Spyros for this post, which u can find:
http://forums.mysql.com/read.php?34,34957,56380#msg-56380
  Posted by Michael Mitterer on August 22, 2006
/etc/host.allow or /etc/host.deny

I was not successful with all the above tips (but anyhow THANK YOU). After searching around on my server
I found that I had an entry in /etc/host.allow like this:
mysqld : 192.168.0.15 : allow
mysqld : ALL : deny

All other host except the 192.168.0.15 were disabled on the server!!!
After changing the IP-Address to LOCAL everything works fine.
(Don't forget to restart the portmapper after changing this file)

  Posted by zhang tiefeng on November 4, 2006
I have a case to solve this problem.If compile apache --with-mpm=worker,then mysql_connect() also show this message:
Can't connect to MySQL server on "remote_mysqld"

#cd httpd-2.0.55
#./configure --prefix=/usr/local/apache --enable-so --enable-rewrite --enable-deflate --with-mpm=worker

So if you want connect remote mysql server,pls not use --with-mpm=worker
notice:I use php-4.4.1 and mysql4.0.26

  Posted by Kathryn Wilson on December 1, 2006
Also this may be helpful. Try checking your iptables configuration. First I would stop your iptables services by typing.

/etc/init.c/iptables stop

If when you try to get your MySQL Admin to connect to your host server and it connects then you know that you will need to update them within your system. For a UNIX system this would be in ipf configurations. But you can at least stop them and then restart them until your configuration file is updated.
  Posted by Paul Thao on January 24, 2007
  Posted by Eric Schorvitz on January 10, 2008
As a continuation of David Jung's comments:

To turn off SELinux temporarily: setenforce 0
To turn it back on: setenforce 1

To disable permanently, edit: /etc/selinux/config
SELINUX=disabled

To edit the SELinux settings (e.g. allow HTTP traffic - default is NO on installation):
system-config-securitylevel-tui (run this from the command line)

http://docs.fedoraproject.org/selinux-faq-fc3/index.html#id2825207
  Posted by Noah Abrahams on May 30, 2008
To follow up on the SELinux issue, the only setting that needs to be changed is as follows:

setsebool -P httpd_can_network_connect_db=1
  Posted by Cristemir Albuquerque on October 6, 2008
Tive o mesmo problema com um servidor Windows 2000 e após a inclusão das chaves do registro o problema foi resolvido.

  Posted by Matt Keenan on April 23, 2009
Ensure version of daemon matches that of the driver.
e.g. Daemon 4.0 and driver 5.1 do not work together the
JDBC driver just hangs trying to get a connection.

So make sure mysqladmin version matches that of your driver.
  Posted by vasu s on July 3, 2010
Check whether your mysql instance is running or not.

1. To start your MySQL instance, go to MySQL/MySQL System Tray Monitor.
2. Tray monitor icon will be displayed in the lower most right corner of your window.
3. Right click the Tray Monitor.
4. Click Start Instance.
5. Now open MySQL/MySQL Query Browser and you will see it working fine now :)

  Posted by Shane Bester on November 30, 2010
if you're still seeing this on windows even after the registry changes, check if applying this KB solves it:

http://support.microsoft.com/kb/979230/en-us

  Posted by leigh tippett on February 24, 2011
This problem for me was to do with my laptop stopping the running process of "mySQL". Just go to task manager, view services running, check if its running which it wasnt then click on the services button at bottom, then standard, find mysql and click start.

That should solve the problem.
  Posted by Prakhar Srivastava on April 25, 2011
I faced a similar problem.
The exact problem that my machine received a new IP through DHCP and my mysql server was binded to the previous IP. This was causing the problem and was resolved as soon as I changed the bind address in my.conf and restarted the server.

  Posted by Andreas Mähr on July 6, 2011
By default MySQL (5.5 version on Windows XP) binds to "localhost" (somehow 127.0.0.1 is not same as localhost) and it will accept connections only from localhost.
Since the OS would convert localhost to 127.0.0.1 automatically, other programs are unable to connect.
(MySQL command line client might be functioning differently Because it can connect using localhost as host name.)

If you want MySQL port to listen on all interfaces add this setting to your my.ini file
bind-address=0.0.0.0

Found on

http://priyanksden.blogspot.com/2011/03/mysql-55-installation-uninstallation.html
  Posted by Ilguiz Latypov on July 11, 2011
Thanks, Andreas. I think the root cause is Windows installing its IPv6 stack which makes its TCP library resolve the host name "localhost" to what appears to be an IPv6 address "[::]", according to the netstat output,

$ netstat -ano | grep 3306
TCP [::]:3306 [::]:0 LISTENING 5160

The parameter bind-address=0.0.0.0 appears to force the MySQL server to listen on all IPv4 interfaces.

  Posted by Jukka Petrinen on September 8, 2011
If you have this error message using phpMyAdmin web application, have a look http://upcode.wordpress.com/2011/09/08/phpmyadmin-error-2002-cannot-log-in-to-the-mysql-server/
Found the solution and it made the error go away :)
  Posted by Jon Spencer on August 24, 2012
This relates to running MySQL on Windows 7. I too had the problem of not being able to connect to the MySQL server with an app I wrote. It turns out that the host file in \Windows\System32\etc\hosts did not have a definition for "localhosts". I simply removed the comment "#" for localhost and everything started to work fine.

I am not (yet) a Windows geek, but am a Linux geek, where all of this kind of thing is so much easier to deal with. :-)
  Posted by Ramesh Thuravil on October 23, 2012
The following change worked for me:

Find your MySQL config file (my.cnf is usually in /etc/mysql) and comment out the following line by putting a hash character in front of it as shown:

# bind-address = 127.0.0.1

Restart the mysql server.
  Posted by Sandesh Mhatre on December 3, 2012
just check if you have assigned access from various(or that particular) host.
while creating user be sure that you've mentioned host.

or in host field put % sign , known as wildcard. to allow user of same name to access database from any host in your network.

http://misterdeveloper.blogspot.in/2012/12/after-shifting-to-mysql-from-mssql.html
  Posted by on December 4, 2012
The Fix suggested by John Spencer worked for me.

Windows 7 (64 Bit)
mysql Ver 14.14 Distrib 5.5.28, for Win64 (x86)

small point - the hosts file is in %windows%\system32\drivers\etc

/Ed
Sign Up Login You must be logged in to post a comment.