これは私にはいくぶん謎です。 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)
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サーバーを再起動することを忘れないでください。
IPv6が有効になっている可能性があります。その可能なホストは、msql構成で定義されていないipv6ローカルホストに解決されます。
iveには、そのユーザーの許可されたサブネットに「127.0.0.1」の代わりに「localhost」を追加する必要があるという問題もありました。理由はわかりません(私はipv4を使用しており、しばらく前に使用しました)が、試してみる価値はあります。
私にとって、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)'
PHPはデフォルトのソケット位置を使用しようとしています。この問題は、MariaDB/MySQLフォルダーを/ var/lib/mysqlから別の場所に移動した場合に発生する可能性があります。この問題を解決するには、/ etc/php.iniファイルで新しいソケットの場所を定義する必要があります。
mysqli.default_socket =/newDBLocation/mysql/mysql.sock
使用するドライバーによっては、pdo_mysql.default_socket =を指定する必要がある場合があります。
現在のディレクトリを確認するには、mysqlで次のコマンドを実行します。
select @@datadir;
確認していただけますかmysql/conf/my.conf
(OSxのディレクトリ構造はほとんど同じである必要があります)skip-networking
はコメント解除されていますか?その場合は、#
行の先頭にあり、mysql-serverを再起動します。
私はしばらく前に同じような問題を抱えていましたが(OSxにはありませんでした)、一見の価値があると思いました。
私はテストボックスで同じ症状を再現することができました。
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_resolve
はOFF
であり、すべての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
)を見つけて、必要がない限り削除します。
うまくいけば、これはあなたを助けるでしょう!
Localhostは/private/etc/hosts
ファイルで定義されていますか?
CloudLinuxでCageFSを使用している場合:
再作成しました/var/lib/mysql
MySQLサーバーを最初から再構築していたため...
これは、cagefsからパスをアンマウントしました。私はそれが無関係であることを知っていますが、私はcPanelとCloudLinuxを使用していました。ソケット接続が機能しない理由を確認できず、ようやく気づきました。
追加/var/lib/mysql
〜/etc/cagefs/cagefs.mp
(すでにそこにある場合は、次のステップに進みます)および実行中
cagefsctl --remount-all
問題を修正しました
私にとっては、mysql.sockの親ディレクトリでアクセス許可をパブリックに読み取り可能に変更すると、問題が修正されました。
chmod 755 /var/lib/mysql
私はこの問題を抱えていて、それを理解することができませんでした。私は細かいことができるすべてを無駄に試しました。
/ root /に.netrcがあり、情報が含まれていることがわかりました。
私はそれを削除し、問題はなくなりました。
Mysql -uroot -pを使用して問題なくmysqlにログインできるようになりました。
私はこれが古い記事であることを知っていますが、これが誰かに役立つことを願っています。
プライベート/ etc/hostsで定義する必要があります...または単に127.0.0.1を使用します。これはとにかく同じことなので、単なるエイリアスです。