web-dev-qa-db-ja.com

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

これは私にはいくぶん謎です。 MySQLに接続できる唯一の方法は、「127.0.0.1」経由で呼び出す場合です。たとえば、my 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)
27
dcolumbus

MySQLは、「localhost」に接続するように指示すると、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サーバーを再起動することを忘れないでください。

26

IPv6が有効になっている可能性があります。その可能なホストは、msql構成で定義されていないipv6ローカルホストに解決されます。

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

8
Silverfire

私にとって、OSXの組み込みphpは、homebrewのmysqlとは異なるunix-socketを使用するように構成されています。したがって、そのソケットを使用するlocalhostを介して接続することはできません。

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)'
5
soliton_zero

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

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

使用するドライバーによっては、pdo_mysql.default_socket =を指定する必要がある場合があります。

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

select @@datadir;
2
joelschmid

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

私はしばらく前に同じような問題を抱えていましたが(OSxにはありませんでした)、一見の価値があると思いました。

2
karllindmark

私はテストボックスで同じ症状を再現することができました。

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
pferate

Localhostは/private/etc/hostsファイルで定義されていますか?

CloudLinuxでCageFSを使用している場合:

再作成しました/var/lib/mysql MySQLサーバーを最初から再構築していたため...

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

追加/var/lib/mysql/etc/cagefs/cagefs.mp(すでにそこにある場合は、次のステップに進みます)および実行中

cagefsctl --remount-all

問題を修正しました

1
Luka

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

chmod 755 /var/lib/mysql
1
zmonteca

私はこの問題を抱えていて、それを理解することができませんでした。私は細かいことができるすべてを無駄に試しました。

/ root /に.netrcがあり、情報が含まれていることがわかりました。

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

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

私はこれが古い記事であることを知っていますが、これが誰かに役立つことを願っています。

1
Terry

プライベート/ etc/hostsで定義する必要があります...または単に127.0.0.1を使用します。これはとにかく同じことなので、単なるエイリアスです。

0
Shackrock