web-dev-qa-db-ja.com

ソケット '/tmp/mysql.sockを介してローカルのMySQLサーバーに接続できません

テストスイート中にローカルの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)
107
Alex Gaynor
Sudo /usr/local/mysql/support-files/mysql.server start 

これは私のために働きました。それでもうまくいかない場合は、mysqldが実行されていることを確認してから接続してみてください。

143
Pratyay

私にとって問題は、私はmysqlサーバーを実行していなかったということでした。最初にサーバーを実行してからmysqlを実行します。

$ mysql.server start
$ mysql -h localhost -u root -p
70
yask

MySQLマニュアルの関連セクションは ここ です。そこにリストされているデバッグ手順を実行することから始めます。

また、localhostと127.0.0.1は、このコンテキストでは同じものではありません。

  • Hostがlocalhostに設定されている場合は、ソケットまたはパイプが使用されます。
  • Hostが127.0.0.1に設定されている場合、クライアントはTCP/IPを使用するように強制されます。

したがって、たとえば、データベースがTCP connections vinetstat -nlpをlistenしているかどうかを確認できます。 IS TCP接続を待機していると思われますが、これはmysql -h 127.0.0.1が正常に機能すると言うためです。ソケットを介してデータベースに接続できるかどうかを確認するには、mysql -h localhostを使用します。

これがどれも助けにならないなら、あなたはおそらくあなたのMySQL設定についてもっと多くの詳細を投稿する必要があります、まさにあなたが接続を具体化している方法など。

70
jtoberon

私の開発者が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を実行します。

21

Hostlocalhostから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': '',
},
...
13
Sirbito X

もしあなたがあなたのデーモン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

mariadbでも使えます

11
aurny2420289

ターミナルで以下のcmdを実行してください。

/ usr/local/mysql/bin/mysqld_safe

enter image description here

その後、マシンを再起動して有効にします。できます!!

8
Prashanth Sams

Lsofコマンドを使用して、mysqlプロセス用に開いているファイルの数を確認してください。

開いているファイルの制限を増やして、もう一度実行してください。

7
hsen

これらの解決策をいくつか試してみても成功しなかった後、これが私にとってうまくいったことです。

  1. システムを再起動
  2. mysql.server起動
  3. 成功!
7
Mark Lohr

これは、次のような問題が考えられます。

  1. Mysqlロックが正しくありません。解決策:正しい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から返されたポートです。

私は最初の選択肢があなたの問題を解決すると思います。

7
Chamith Malinda

私はしばらく前にこれと同じ動作を見たと思いますが、詳細を思い出すことはできません。
私たちの場合、問題は、たとえばsettings.pyまたはいくつかの__init__.pyにモジュールをインポートすることによって、テスト実行者が最初に必要なデータベースのやり取りに関連してデータベース接続を初期化する瞬間でした。私はもう少し情報を掘り下げようとするでしょう、しかしこれはあなたのケースのためにすでにベルを鳴らすかもしれません。

4
Martin

私はこれについて2つの卑劣な推測があります

予想#1

/tmp/mysql.sockファイルにアクセスできない可能性を調べます。 MySQLデータベースをセットアップするときは、通常、ソケットファイルサイトを/var/lib/mysqlに配置します。 mysqlに[email protected]としてログインした場合、OSセッションは/tmpフォルダにアクセスする必要があります。 /tmpにOSの正しいアクセス権があることを確認してください。また、Sudoユーザーが常に/tmp内のファイルを読み込めることを確認してください。

予想#2

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

これは[email protected]としてのログインを回避しますが、[email protected]'127.0.0.1'が定義されていることを確認してください。

次回MySQLに接続するときは、次のコマンドを実行してください。

SELECT USER(),CURRENT_USER();

これは何をあなたに与えますか?

  • SER() MySQLでどのように認証を試みたかを報告します
  • CURRENT_USER() MySQLでどのように認証されたかを報告します

これらの関数が同じ値を返す場合は、期待通りに接続し認証しています。値が異なる場合は、対応するユーザー[email protected]を作成する必要があります。

3
RolandoMySQLDBA

これと同じ問題がありました。 mysqldが実行を停止していたことがわかりました(私はMac OSXを使っています)。私はそれを再開し、そしてエラーは消えました。

私はmysqldがこのリンクのせいで主に実行されていないことを考え出しました: http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html

最初のヒントに注意してください。

3
Ben Rollert

以下のようなエラーが出た場合:

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' : ''
    }
}
3
Shyam

自作で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)は再び動くでしょう。

2
Blaszard

/ etc/hostsに127.0.0.1 localhostが含まれていることを確認してください。

2
hd1

あなたのmysqlが最大接続数に達していないか、my.cnfの設定が正しくない場合によく起こるようなある種の起動ループに入っていないか確認してください。

Ps auxを使用するPIDが変更されているかどうか確認するためにgrep mysql。

2
beiller

貢献するには余りにも長くオンラインを見回した。コマンドラインから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;
2
preynolds

最初にすべてのプロセスIDを見つけることによって、mysqlのすべてのインスタンスを削除しなければなりませんでした。

ps aux grep mysql

そしてそれらを殺します:

殺す-9 {pid}

その後:

mysql.server起動

私のために働きました。

1
HomerPlata

ソケットは/ tmpにあります。 Unixシステムでは、/ tmpのモードと所有権により、これは何らかの問題を引き起こす可能性があります。しかし、あなたが私たちにあなたが通常あなたのmysql接続を使うことができると言う限り、私はそれがあなたのシステム上の問題ではないと思います。主なチェックは、mysql.sockをより中立的なディレクトリに移動することです。

問題が「ランダムに」(または毎回ではなく)発生するという事実から、私はそれがサーバーの問題である可能性があると思いました。

  • / tmpは標準のディスクにありますか、それとも(RAMのように)エキゾチックなマウントにありますか?

  • あなたの/ tmpは空ですか?

  • あなたが問題に遭遇したときiotopはあなたに何か悪いことを示していますか?

1
Koreth

[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
0
Only You

ソケット関連の場合はこのファイルを読んでください

/etc/mysql/my.cnf

そして、標準的なソケットの位置は何ですか。それは次のような行です。

socket = /var/run/mysqld/mysqld.sock

シェルのエイリアスを作成しましょう。

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

これにより、root権限は必要ありません。

0
MaxV

私にとっては、mysqldが起動されていること、そしてコマンドラインmysqlが正しく機能することを確信しています。しかし、httpdサーバは問題を示しています(ソケットを介してmysqlに接続できません)。

私はmysqld_safe&でサービスを始めました。

最後に、サービスmysqld startでmysqldサービスを開始すると、問題(selinuxパーミッションの問題)があり、selinuxの問題を修正し、 "service mysqld start"でmysqldを開始すると、httpd接続の問題が消えます。しかし、mysqld_safe&でmysqldを起動すると、mysqldは動作します。 (MySQLクライアントは正常に動作することができます)。しかし、httpdに接続してもまだ問題があります。

0
Robin LI

単にmysqldを実行してみてください。

これは私にとってMac上では動作していなかったことでした。うまくいかない場合は/usr/local/var/mysql/<your_name>.errに行き、詳細なエラーログを見てください。

0
eloone

ubuntu 14.04では、この問題を解決するためにこれを実行できます。

[email protected]:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
[email protected]:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
[email protected]:~/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=
0
ZackZang