MySQLは「localhost」経由で接続できません。127.0.0.1のみ


27

これはやや謎です。MySQLに接続できる唯一の方法は、「127.0.0.1」を介して呼び出す場合です。たとえば、PHP接続スクリプトはlocalhostでは機能しません

Mac OS X Lion、ビルトインapache2、MySQL、PHP、phpMyAdminを実行しています

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
これはおそらくサーバー障害の場合の方が多いでしょうが、hostsファイルにlocalhostエイリアスがあることを確認してください。
マット

127.0.0.1 localhostは私のhostsファイルにあります。
-dcolumbus

コマンドプロンプトを開き、入力してそのping localhost内容を確認します。
スティーブロビンス

127.0.0.1から64バイト:icmp_seq = 0 ttl = 64 time = 0.100 ms 127.0.0.1から64バイト:icmp_seq = 1 ttl = 64 time = 0.102 ms 127.0.0.1から64バイト:icmp_seq = 2 ttl = 64 time = 0.096 ms
dcolumbus

回答:


26

「localhost」に接続するように指示すると、MySQLはUNIXソケットへの接続を試みます。127.0.0.1への接続を指示すると、ネットワークソケットへの接続を強制します。したがって、おそらく、ファイルシステムソケットではなくネットワークソケットのみをリッスンするようにMySQLを構成しているでしょう。

UNIXソケットの正確な問題を特定するのは困難です。しかし、MySQLリファレンスガイドのこのページを読むことをお勧めします。これはあなたを助けるはずです。

更新:更新された質問に基づきます:パラメーター「ソケット」は、「/ var / lib / mysql / mysql.sock」のようなものでなければなりません。リファレンスマニュアルのこのページには、さらに情報があります。

ここに私の/etc/my.cnfファイルの始まりがあります:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

ファイルは似ているはずです。その後、問題を解決する必要があります。テストする前にMySQLサーバーを再起動することを忘れないでください。


1
Wow:「ホスト名を指定しないか、特別なホスト名localhostを指定すると、Unixソケットファイルが使用されます。」それは...直感的ではないようです。したがって、他のすべての答え。
マークワーグナー

+1を知っていることをお勧めします
マット

理論に感謝します...答えが何なのか分からないだけです。
-dcolumbus

@dcolumbus:すでに書いたように、わかりにくいです。私がお勧めできるのは、コンソールを開いてコマンド「mysql」を書くことです。たぶん、あなたはより多くの情報を得るでしょう。もう1つは、ログファイルを調べることです。私のディレクトリは/ var / log /ディレクトリにあり、mysql.logと呼ばれます。あなたの名前は別の名前や別の場所にすることができます。より多くの情報をご提供いただければ、おそらくより良いサポートを提供できます。
ラファエルルーティガー

2
php.iniには「/var/mysql/mysql.sock」(正確には3か所)への参照があり、「/ tmp / mysql.sock」に変更する必要があります...ご協力ありがとうございます!
-dcolumbus

8

IPv6を有効にしている可能性があります。その非常に可能性のあるlocalhostは、msql構成で定義されていないipv6 localhostに解決されます。

iveには、そのユーザーの許可されたサブネットに「127.0.0.1」の代わりに「localhost」を追加しなければならないという問題もありましたが、理由はわかりません(私はipv4を使用していたのでしばらく前です)が、試してみる価値があります。


これを確認するには、コマンドラインで「host localhost」が:: 1および127.0.0.1を返すかどうかを確認します。もしそうなら、あなたはどちらかIPv6の上で聴くことから/民間の/ etc / hostsまたは再構成のMySQL :: 1つのマッピングを削除することができます:: 1つのアドレスだけでなく、127.0.0.1
デヴィッド・ノース

Mac OS XでIPv6がデフォルトで有効になっていることをどこかで読んだことを覚えていると思います...そうですか?
-dcolumbus

最近のほとんどすべてのOSでipv6が有効になっています。osx10.6でimであり、デフォルトで有効になっています。
シルバーファイア

違う。ローカルホストは、MySQLクライアントのために特別な意味を持っている-チェックアウトserverfault.com/a/295300/67675を
poige

5

私にとって、OSXの組み込みphpは、homebrewのmysqlとは異なるUnixソケットを使用するように構成されています。したがって、そのソケットを利用するローカルホスト経由で接続することはできません。

mysqlが実際に使用するものを指すようにphpの設定済みソケットパスをシンボリックリンクすることで、簡単に修正しました。

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

次の診断コマンドは非常に役立ちました。

phpおよびmysqlが使用するデフォルトのソケットパスを確認します。

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

指定されたソケットを使用して接続します。

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

mysqlクライアントが接続に使用しているソケットの種類を確認します。

lsof | egrep '^mysql .*(IPv|unix)'

2

コメントが解除されているかどうかを確認してくださいmysql/conf/my.conf(OSxではディレクトリ構造はほぼ同じである必要があります)skip-networking。その場合#、行の先頭に追加し、mysql-serverを再起動します。

私は実際にしばらく前に同様の問題を抱えていました(OSxにはありませんでしたが)。


1
なぜこれがダウン投票されたのですか?説明が役立つでしょう。
karllindmark

私はあなたに反対票を投じませんでしたが、あなたの答えは、実際にはOPが求めていることの反対です。しかし、私は反対の条件に苦労したので、あなたを支持しました-ネットワーク経由ではなく、ソケット経由で接続します。ところで、これをmy.confで修正することはできませんでした。コマンドラインに配置する必要がありました:「mysqlf --skip_networking = 0 ...」
Jan Steinman

2

PHPはまだデフォルトのソケットの場所を使用しようとしています。この問題は、MariaDB / MySQLフォルダー/ var / lib / mysqlから別の場所に移動した場合に発生する可能性があります。この問題を解決するには、/ etc / php.iniファイルで新しいソケットの場所を定義する必要があります。

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

使用するドライバーによっては、pdo_mysql.default_socket =を指定する必要がある場合があることに注意してください

現在のディレクトリを確認するには、mysqlで次のコマンドを実行します。

select @@datadir;

1

/private/etc/hostsファイルにlocalhostが定義されていますか?


127.0.0.1 localhostは私のhostsファイルにあります。
-dcolumbus

4
/private?見たことのないその前に
TheLQ

@TheLQ:それはMacのものです。そこにいる間です:Appleは、一般的に「真」のパスを使用して助言する何らかの理由を/ etc /民間からのシンボリックリンクの/ etc、support.apple.com/kb/TA27291
ジャスティンᚅᚔᚈᚄᚒᚔ

1

テストボックスで同じ症状を再現することができました。うまくいけば、これが役立つでしょう。

MySQLでは、ユーザーは2つの部分(名前とホスト)で定義されます。デフォルトでは、MySQLには3人のrootユーザーがいます。

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

パスワードフィールドは空白(パスワードなし)になるか、ハッシュが保存されます。特定の1人のユーザーにパスワードを設定した場合、MySQLはそれらを異なるユーザーと見なすため、すべてが自動的に更新されるわけではありません。

例えば:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

パスワードを更新します'root'@'127.0.0.1'が、ありません'root'@'localhost''root'@'localhost.localdomain'

skip_name_resolve変数を見てみましょう:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

デフォルトでskip_name_resolveOFFであり、すべてのIPアドレスをホスト名に解決しようとします。たとえば、として接続する場合'root'@'127.0.0.1'、MySQLはを接続するように変更します'root'@'localhost'

もしそうであればON、MySQLは見て接続する'root'@'127.0.0.1'と、'root'@'localhost'別々のユーザーなど。また、設定方法に応じて、異なるパスワードを持つ場合と持たない場合があります。


そのため、まず、パスワードの違いを確認します。 mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

ある場合は、修正するか、調査を続けることができます。

それから私はチェックしskip_name_resolveます: mysql> show variables like 'skip_name_resolve';

もしそうであればON、私はそれが(例えば設定されていた場所を見つけるだろう/etc/my.cnf)、それの必要性がある場合を除き、それを削除します。

これがお役に立てば幸いです!


1

私はこの問題を抱えていて、それを理解できませんでした。私は何の役にも立ちませんでした。

/ root /に情報がある.netrcがあることがわかりました。

私はそれを削除し、問題はなくなった。

問題なくmysql -uroot -pを使用してmysqlにログインできるようになりました。

私はこれが古い投稿であることを知っていますが、これが誰かを助けることを望みます。


1

私にとっては、mysql.sockの親ディレクトリでパブリックに読み取り可能になるように権限を変更すると、問題が修正されました。

chmod 755 /var/lib/mysql

1

CloudLinuxでCageFSを使用しているユーザーの場合:

/var/lib/mysqlMySQLサーバーをゼロから再構築していたため、再作成しました...

これは、cagefsからパスをアンマウントしました。無関係であることはわかっていますが、cPanelとCloudLinuxを使用していました。ソケット接続が機能しない理由を確認できませんでしたが、ようやく実現しました。

追加する/var/lib/mysqlには/etc/cagefs/cagefs.mp (次のステップに進みますが既に場合)、実行しています

cagefsctl --remount-all

問題を修正しました


1
ああ、神様!これは私のためにそれを修正したものです!すでに入っていました/etc/cagefs/cagefs.mpが、実行中にcagefsctl --remount-all修正されました。ありがとう!
アルバロフラニョラロンド

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