テストスイート中にローカルのMySQLサーバーに接続しようとすると、次のエラーで失敗します。
OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")
しかし、コマンドラインのmysql
プログラムを実行することで、いつでもMySQLに接続できます。 ps aux | grep mysql
はサーバーが稼働していることを示し、stat /tmp/mysql.sock
はソケットが存在することを確認します。さらに、その例外のexcept
句でデバッガを開くと、まったく同じパラメータで確実に接続できます。
この問題はかなり確実に再現されていますが、100%ではないようです。なぜなら、ブルームーンのたびに、私のテストスイートは実際にはこのエラーにぶつかることなく実行されるからです。 Sudo dtruss
を付けて実行しようとしたとき、再現しませんでした。
クライアントコードはすべてPythonで書かれていますが、それがどのように関連しているのか私は理解できません。
ホスト127.0.0.1
を使用するように切り替えると、エラーが発生します。
DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
Sudo /usr/local/mysql/support-files/mysql.server start
これは私のために働きました。それでもうまくいかない場合は、mysqldが実行されていることを確認してから接続してみてください。
私にとって問題は、私はmysqlサーバーを実行していなかったということでした。最初にサーバーを実行してからmysql
を実行します。
$ mysql.server start
$ mysql -h localhost -u root -p
MySQLマニュアルの関連セクションは ここ です。そこにリストされているデバッグ手順を実行することから始めます。
また、localhostと127.0.0.1は、このコンテキストでは同じものではありません。
localhost
に設定されている場合は、ソケットまたはパイプが使用されます。127.0.0.1
に設定されている場合、クライアントはTCP/IPを使用するように強制されます。したがって、たとえば、データベースがTCP connections vinetstat -nlp
をlistenしているかどうかを確認できます。 IS TCP接続を待機していると思われますが、これはmysql -h 127.0.0.1
が正常に機能すると言うためです。ソケットを介してデータベースに接続できるかどうかを確認するには、mysql -h localhost
を使用します。
これがどれも助けにならないなら、あなたはおそらくあなたのMySQL設定についてもっと多くの詳細を投稿する必要があります、まさにあなたが接続を具体化している方法など。
私の開発者がMAMPのような標準以外の場所にMySQLがインストールされた状態で事前設定されたスタックマネージャをインストールしているときにこれが起こるのを私は見ました。
あなたのターミナルランで
mysql_config --socket
それはあなたの靴下ファイルへのパスをあなたに与えるでしょう。そのパスを取り、あなたのDATABASESホストパラメータでそれを使ってください。
あなたがする必要があるのはあなたを指すことです
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test',
'Host': '/Applications/MAMP/tmp/mysql/mysql.sock',
'PORT': '',
},
}
接続している可能性があるマシンにmysqlサーバーの複数のインスタンスが何らかの理由でインストールされている場合もwhich mysql_config
を実行します。
Host
をlocalhost
から127.0.0.1
に変更したところ、正常に動作します。
# settings.py of Django project
...
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.mysql',
'NAME': 'db_name',
'USER': 'username',
'PASSWORD': 'password',
'Host': '127.0.0.1',
'PORT': '',
},
...
もしあなたがあなたのデーモンmysqlをmac OSxで失ったが、例えばprivate/varの中で他のパスに存在していたら、次のコマンドを実行してください。
1)
ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock
2)mysqlへの接続を再起動します。
mysql -u username -p -h Host databasename
ターミナルで以下のcmdを実行してください。
/ usr/local/mysql/bin/mysqld_safe
その後、マシンを再起動して有効にします。できます!!
Lsofコマンドを使用して、mysqlプロセス用に開いているファイルの数を確認してください。
開いているファイルの制限を増やして、もう一度実行してください。
これらの解決策をいくつか試してみても成功しなかった後、これが私にとってうまくいったことです。
これは、次のような問題が考えられます。
mysqladmin -p変数| grepソケット
そしてそれをあなたのdb接続コードに入れてください:
pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")
/tmp/mysql.sockはgrepから返されたものです。
2.不正なMySQLポートソリューション:正しいMySQLポートを見つける必要があります。
mysqladmin -p variables | grep port
そしてあなたのコードで:
pymysql.connect(db='db', user='user', passwd='pwd', Host='localhost', port=3306)
3306はgrepから返されたポートです。
私は最初の選択肢があなたの問題を解決すると思います。
私はしばらく前にこれと同じ動作を見たと思いますが、詳細を思い出すことはできません。
私たちの場合、問題は、たとえばsettings.pyまたはいくつかの__init__.pyにモジュールをインポートすることによって、テスト実行者が最初に必要なデータベースのやり取りに関連してデータベース接続を初期化する瞬間でした。私はもう少し情報を掘り下げようとするでしょう、しかしこれはあなたのケースのためにすでにベルを鳴らすかもしれません。
私はこれについて2つの卑劣な推測があります
/tmp/mysql.sock
ファイルにアクセスできない可能性を調べます。 MySQLデータベースをセットアップするときは、通常、ソケットファイルサイトを/var/lib/mysql
に配置します。 mysqlにroot@localhost
としてログインした場合、OSセッションは/tmp
フォルダにアクセスする必要があります。 /tmp
にOSの正しいアクセス権があることを確認してください。また、Sudoユーザーが常に/tmp
内のファイルを読み込めることを確認してください。
127.0.0.1
を介してmysqlにアクセスすると、注意を払わないと混乱を招く可能性があります。どうやって?
127.0.0.1
でMySQLに接続する場合、コマンドラインからTCP/IPプロトコルを指定する必要があるかもしれません。
mysql -uroot -p -h127.0.0.1 --protocol=tcp
またはDNS名を試す
mysql -uroot -p -hDNSNAME
これはroot@localhost
としてのログインを回避しますが、root@'127.0.0.1'
が定義されていることを確認してください。
次回MySQLに接続するときは、次のコマンドを実行してください。
SELECT USER(),CURRENT_USER();
これは何をあなたに与えますか?
これらの関数が同じ値を返す場合は、期待通りに接続し認証しています。値が異なる場合は、対応するユーザー[email protected]
を作成する必要があります。
これと同じ問題がありました。 mysqld
が実行を停止していたことがわかりました(私はMac OSXを使っています)。私はそれを再開し、そしてエラーは消えました。
私はmysqld
がこのリンクのせいで主に実行されていないことを考え出しました: http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html
最初のヒントに注意してください。
以下のようなエラーが出た場合:
Django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
それから、mysqld.sockファイルの場所を見つけて、それを "Host"に追加してください。
私は私のmysqld.sock
ファイルが別の場所にあるように私はLinuxでxamppを使用しているように。だから、それは '/var/run/mysqld/mysqld.sock
'のために働いていません
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.mysql',
'NAME': 'asd',
'USER' : 'root',
'PASSWORD' : '',
'Host' : '/opt/lampp/var/mysql/mysql.sock',
'PORT' : ''
}
}
自作で5.7から8.0にアップグレードした人にとって、このエラーはアップグレードが完了していないことが原因である可能性があります。私の場合、mysql.server start
は私に次のエラーを受け取りました:
エラー! PIDファイルを更新せずにサーバーが終了しました
私はそれからcat /usr/local/var/mysql/YOURS.err | tail -n 50
を通してログファイルをチェックして、そして以下を見つけました:
InnoDB:クラッシュ後のアップグレードはサポートされていません。
同じボートに乗っている場合は、まずhomebrewで[email protected]
をインストールし、サーバーを停止してから8.0システムを再起動します。
brew install [email protected]
/usr/local/opt/[email protected]/bin/mysql.server start
/usr/local/opt/[email protected]/bin/mysql.server stop
その後、
mysql.server start
これであなたのMySQL(8.0)は再び動くでしょう。
/ etc/hostsに127.0.0.1 localhost
が含まれていることを確認してください。
あなたのmysqlが最大接続数に達していないか、my.cnfの設定が正しくない場合によく起こるようなある種の起動ループに入っていないか確認してください。
Ps auxを使用するPIDが変更されているかどうか確認するためにgrep mysql。
貢献するには余りにも長くオンラインを見回した。コマンドラインからmysqlのプロンプトを入力しようとした後、私はこのメッセージを受け取り続けていました:
エラー2002(HY000):ソケット '/tmp/mysql.sock'を介してローカルのMySQLサーバーに接続できません(2)
これは私のローカルmysqlサーバーがもう実行されていなかったという事実によるものです。サーバーを再起動するために、私はナビゲートしました
Shell> cd /user/local/bin
私のmysql.serverはどこにありましたか。ここから、単純に入力してください。
Shell> mysql.server start
これでローカルのmysqlサーバーが再起動します。
必要に応じて、そこからrootのパスワードをリセットできます。
mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
-> WHERE User='root';
mysql> FLUSH PRIVILEGES;
最初にすべてのプロセスIDを見つけることによって、mysqlのすべてのインスタンスを削除しなければなりませんでした。
ps aux grep mysql
そしてそれらを殺します:
殺す-9 {pid}
その後:
mysql.server起動
私のために働きました。
ソケットは/ tmpにあります。 Unixシステムでは、/ tmpのモードと所有権により、これは何らかの問題を引き起こす可能性があります。しかし、あなたが私たちにあなたが通常あなたのmysql接続を使うことができると言う限り、私はそれがあなたのシステム上の問題ではないと思います。主なチェックは、mysql.sockをより中立的なディレクトリに移動することです。
問題が「ランダムに」(または毎回ではなく)発生するという事実から、私はそれがサーバーの問題である可能性があると思いました。
/ tmpは標準のディスクにありますか、それとも(RAMのように)エキゾチックなマウントにありますか?
あなたの/ tmpは空ですか?
あなたが問題に遭遇したときiotop
はあなたに何か悪いことを示していますか?
[DB接続の管理]ダイアログでDB接続を設定します。接続方法として[標準(TCP/IP)]を選択します。
詳細についてはこのページを参照してください http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html
この他のページ によると、localhostを指定してもソケットファイルが使用されます。
ホスト名を指定しない場合、または特別なホスト名localhostを指定した場合は、Unixソケットファイルが使用されます。
また、これらのコマンドを実行してサーバーを確認する方法も示しています。
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
ソケット関連の場合はこのファイルを読んでください
/etc/mysql/my.cnf
そして、標準的なソケットの位置は何ですか。それは次のような行です。
socket = /var/run/mysqld/mysqld.sock
シェルのエイリアスを作成しましょう。
alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"
これにより、root権限は必要ありません。
私にとっては、mysqldが起動されていること、そしてコマンドラインmysqlが正しく機能することを確信しています。しかし、httpdサーバは問題を示しています(ソケットを介してmysqlに接続できません)。
最後に、サービスmysqld startでmysqldサービスを開始すると、問題(selinuxパーミッションの問題)があり、selinuxの問題を修正し、 "service mysqld start"でmysqldを開始すると、httpd接続の問題が消えます。しかし、mysqld_safe&でmysqldを起動すると、mysqldは動作します。 (MySQLクライアントは正常に動作することができます)。しかし、httpdに接続してもまだ問題があります。
単にmysqld
を実行してみてください。
これは私にとってMac上では動作していなかったことでした。うまくいかない場合は/usr/local/var/mysql/<your_name>.err
に行き、詳細なエラーログを見てください。
ubuntu 14.04では、この問題を解決するためにこれを実行できます。
zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password:
| socket | ***/var/run/mysqld/mysqld.sock*** |
zack@zack:~/pycodes/python-scraping/chapter5$***ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock
lrwxrwxrwx 1 zack zack 27 11月 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=