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


126

テストスイート中にローカルMySQLサーバーに接続しようとすると、次のエラーで失敗します。

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

ただし、コマンドラインmysqlプログラムを実行することで、いつでもMySQLに接続できます 。A 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)

1
どういうわけか、多くの同時接続でデータベースにアクセスしている可能性はありますか?max_connectionsMySQLのconfファイルを増やしてみてください。
dgel 2013年

2
mysql -h 127.0.0.1コマンドラインからの仕事を?mysqlサーバーが実際にTCPポートでリッスンしているかどうかはわかりません。
Eli

1
MySQLのバージョンに適したPython MySQLクライアントライブラリの正しいバージョンを持っていますか?また、mysql -h localhost確実に動作しますか?
Old Pro

2
MySQLはエラーログに何かを記録しますか?また、/ tmp / mysql.sockおよびmysqlデータディレクトリのファイル権限を確認してください。root(sudo)としてテストスイートを実行した場合にもエラーは発生しますか?
Erik Cederstrand 2013年

2
これらの提案の多くは、以下の私の回答で参照する公式のMySQLリファレンスマニュアルでカバーされています。MySQLリファレンスマニュアルの提案を1つまたは2つだけ試行するよりも、体系的に検討する方が時間を有効に活用できます。
jtoberon 2013年

回答:


152
sudo /usr/local/mysql/support-files/mysql.server start 

これでうまくいきました。ただし、これが機能しない場合は、mysqldが実行されていることを確認し、接続してみてください。


1
私は2週間以上(冗談でもなく)過ごしましたが、これは私が最終的に接続できるようになった最も近いものです。しかし、それは「mysqlの起動」に行き詰まっています.....でも、ありがとう、いい投稿!
L.クロッツ2015年

2
sudo:/usr/local/mysql/support-files/mysql.server:コマンドが見つかりません。どうして?
Syam Pillai

1
なぜsudoの後のコロン?パスが存在するかどうかを確認します
Pratyay

または、mysqlがhomebrewでインストールされている場合:sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

1
サーバーはPIDファイル(/var/lib/mysql/Saranshs-MacBook-Pro.local.pid)を更新せずに終了しました。
saran3h

89

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

また、localhostと127.0.0.1は、このコンテキストでは同じではないことに注意してください。

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

したがって、たとえば、データベースがTCP接続viをリッスンしているかどうかを確認できますnetstat -nlp。TCP接続をリッスンしている可能性が高いと思われますmysql -h 127.0.0.1。ソケット経由でデータベースに接続できるかどうかを確認するには、次を使用します。mysql -h localhost

これで解決しない場合は、MySQL構成、接続のインスタンス化の正確な方法などに関する詳細を投稿する必要があります。


一般に、確立された診断手順に従うことは良い考えですが、質問(および手順)を読むと、手順に従っており、これがMySQLサーバーの問題ではないと判断したことがわかります。これは、Pythonからの他のアクセスを含め、ソケットを介した他のすべてのアクセスが正常に機能するため、Pythonクライアントと特に関係があります。
Old Pro

1
なんと奇妙な反対票。私はいくつかの理由で確立された手順を投稿しました:(1)他の人が確立された手順の一部のみを投稿しており、デバッグについて体系的である方が良い、(2)localhostと127.0.0.1との間に混乱があるように見えた、そして(3 )同じ「ローカルmysqlサーバーに接続できない」という症状を持つ他の人々は、この質問に遭遇する可能性があります。私はそれがPythonクライアントである可能性が高いことを認識しています。そのため、接続がどのようにインスタンス化されているかなど、詳細情報を求めました。
jtoberon 2013年

3
+1(localhostホストとして使用して)sshトンネルを介してmysqlに接続しようとすると、このエラーが発生しました。127.0.0.1修正して変更。
krock 2016年

記録のために、これは私の問題を修正しました:「ソケット '/tmp/mysql.sock'を介してローカルMySQLサーバーに接続できません」。
proinsias 2016年

ありがとう!docker maridbコンテナーに接続しようとしているときに、この修正が機能しました。
Lucian Oprea、

86

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

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

28

私の開発者が、MySQLが標準以外の場所にインストールされた状態で事前構成されたMAMPのようなスタックマネージャーをインストールしているときに、これが私のショップで発生するのを見てきました。

あなたのターミナルで

mysql_config --socket

sockファイルへのパスが表示されます。そのパスをたどり、それをDATABASES HOSTパラメータで使用します。

あなたがする必要があるのはあなたを指すことです

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

注意

またwhich mysql_config、マシンにmysqlサーバーの複数のインスタンスがインストールされている場合にも、間違ったインスタンスに接続している可能性があります。


sockファイルが見つからない場合はどうなりますか?
AlxVallejo 2014

別のペアを買う?j / kは、mysqlサービスが実行されていないことを意味します。mysqlの開始/再起動
Francis Yaconiello 14

6
私の場合、HOSTを "localhost"から "127.0.0.1"に変更すると問題が解決しました。
lucaswxp 2015年

@lucaswxp:私の場合、ドメイン名でlocalhostを変更する必要があります
Anshul Mishra

19

私はちょうど変更HOSTからlocalhost127.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': '',
},
...

4
変更したファイルとその場所を知っておくとよいでしょう
Empi

1
settings.pyプロジェクトの。
Sirbito X

11

Mac OSxでデーモンmysqlを失ったが、private / varの例では他のパスに存在する場合、次のコマンドを実行します。

1)

ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock

2)でmysqlへの接続を再開します:

mysql -u username -p -h host databasename

mariadbでも機能します


9

ターミナルで以下のコマンドを実行します

/ usr / local / mysql / bin / mysqld_safe

ここに画像の説明を入力してください

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


1
これは、MojaveにアップグレードされたHigh Sierraを実行しているiMacで機能しました。起こったに違いないのは、mysql.sockファイルがtmpにあり、アップグレード時に削除されていたということです。MySQLの起動時にソケットが自動的に作成されるため、上記のように、MySQLがシャットダウンされていることを確認してから、セーフモードで起動する必要があります。mysql.sockファイルが魔法のように表示されます。
デビッド

8

lsofコマンドを使用して、mysqlプロセスの開いているファイルの数を確認します。

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


以前にもこれに遭遇したことがあり、.cnfファイルを使用してこれを実行することはできません。実際にはulimit、クライアントとサーバーが開くことを許可されている開いているファイルの数を増やす必要がある場合があります。ubuntuの最新バージョンを使用している場合、/ etc / initのmysql upstartスクリプトを編集する必要がありますが、うまくいけば、.cnfファイルでそれを実行できます。
2013年

8

これらの解決策のいくつかを試しても成功しなかった後、これは私にとってうまくいきました:

  1. システムを再起動します
  2. mysql.server start
  3. 成功!

7

これは次の問題の1つである可能性があります。

  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から返されたポートです

最初のオプションで問題が解決すると思います。


6

自作で5.7から8.0にアップグレードした場合、このエラーはおそらくアップグレードが完了していないことが原因です。私の場合、mysql.server start次のエラーが発生しました:

エラー!PIDファイルを更新せずにサーバーが終了した

次にcat /usr/local/var/mysql/YOURS.err | tail -n 50、を介してログファイルを確認したところ、次のことがわかりました。

InnoDB:クラッシュ後のアップグレードはサポートされていません。

同じボートに乗っている場合は、まずmysql@5.7自作でインストールし、サーバーを停止してから、8.0システムを再起動します。

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

そして、

mysql.server start

これにより、MySQL(8.0)が再び機能するようになります。


また同じERROR! The server quit without updating PID fileです。
awebartisan

私の場合、mysql @ 5.7をインストールして最新のものを削除しました。すべてが始まりました。データベースは削除されませんでした。
Andrew Luca

4

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


4

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


驚くべきことに、これは私のためにソートされました-これを確認すると、webdavをセットアップしようとしたときに、ローカルホストを再割り当てしたものを含め、追加の(完全に文字化けした)行がホストファイルに追加されていることがわかりました。
rob_was_taken 2015年

4

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

構想#1

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

コンジェクチャー#2

mysqlへのアクセス 127.0.0.1注意を払っていない場合にすると、混乱が生じる可能性があります。どうやって?

コマンドラインから、を使用してMySQLに接続する場合127.0.0.1、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();

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

  • USER()は、MySQLで認証を試みた方法を報告します
  • CURRENT_USER()は、MySQLでの認証が許可された方法を報告します

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



3

以下のようなエラーが発生した場合:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

次に、mysqld.sockファイルの場所を見つけて、「HOST」に追加します。

Linuxでxamppを使用しているので、mysqld.sockファイルは別の場所にあります。そのため、「/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' : ''
    }
}

2

mysqlが最大接続に達していないこと、またはmy.cnfの設定が正しくない場合によくあるように、何らかの起動ループになっていないことを確認します。

ps auxを使用する| grep mysqlを実行して、PIDが変更されているかどうかを確認します。


2

貢献できないほどオンラインを見回しすぎた。コマンドラインから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

最初にすべてのプロセスIDを見つけて、mysqlのすべてのインスタンスを削除する必要がありました。

ps aux | grep mysql

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

キル-9 {pid}

次に:

mysql.server start

私のために働いた。


1

ソケットは/ tmpにあります。Unixシステムでは、/ tmpのモードと所有権が原因で、問題が発生する可能性があります。しかし、あなたがmysql接続を通常どおりに使用できると私たちに言っている限り、それはあなたのシステムの問題ではないと思います。基本的なチェックは、mysql.sockをよりニュートラルなディレクトリに再配置することです。

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

  • / tmpは標準のディスク上にありますか、または(RAM内などの)エキゾチックなマウント上にありますか?

  • / tmpは空ですか?

  • ないiotop問題が発生したとき、あなたに何か間違っを示して?


0

「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

ubuntu14.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=

0

私にとっては、mysqldが起動していて、コマンドラインmysqlが適切に機能しているはずです。しかし、httpdサーバーが問題を示しています(ソケット経由でmysqlに接続できません)。

mysqld_safe&でサービスを開始しました。

最後に、サービスmysqld startでmysqldサービスを開始すると問題(selinux権限の問題)があり、selinuxの問題を修正して、「service mysqld start」でmysqldを開始すると、httpd接続の問題が消えます。しかし、mysqldをmysqld_safe&で起動すると、mysqldを動作させることができます。(mysqlクライアントは正しく動作します)。しかし、httpdで接続するときはまだ問題があります。


0

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

/etc/mysql/my.cnf

標準のソケットの場所を確認します。次のような行です。

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

次のようにシェルのエイリアスを作成します。

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

この方法では、root権限は必要ありません。


0

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

これは私にとってMacではうまくいかなかったものでした。それが機能しない場合は、に移動して/usr/local/var/mysql/<your_name>.err、詳細なエラーログを確認してください。


0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

役に立つかもしれません。


最も主な答えである「sudo /usr/local/mysql/support-files/mysql.server start」と同じですが、OSが異なれば「mysql.server」のパスが異なる可能性があります。多くのOSで役立ちます。
陈也在鵺

0

Homebrew経由でインストールされたMacOS Mojave 10.14.6 for MySQL 8.0.19を使用する

  • ラン sudo find / -name my.cnf
  • でファイルが見つかりました /usr/local/etc/my.cnf

しばらく働いた後、最終的にエラーが返されました。MySQLのHomebrewバージョンをアンインストールし、ここから直接.dmgファイルをインストールしました

それ以来、幸せにつながります。


0

私の場合、助けとなったのはファイルを編集し/etc/mysql/mysql.conf.d/mysqld.cnfて行を置き換えることでした:

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

socket      = /tmp/mysql.sock

それから私はサーバーを再起動し、それはうまくいきました。おかしいのは、以前のようにラインを元に戻し、再起動した場合でも機能することです。


0

最近同様の問題に直面していた。多くの答えを経験しました。私は次の手順でそれを動作させました。

  1. /etc/my.cnfのソケットパスを変更し(/tmp/mysql.sockで繰り返しエラーが発生したため)、ソケットパスを変更します。
  2. mysqld_safeを実行してサーバーを再起動します。エラーが発生した場合に再起動することをお勧めします。mysqld_safeへの参照

0

私にとって、mysqlサーバーは実行されていませんでした。だから、私はmysqlサーバーを起動しました

mysql.server start

その後

mysql_secure_installation

サーバーを保護するために、MySQLサーバーにアクセスできます。

sudo mysql -uroot -p

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.