mysql
トラフィックを分析したいと思います。現在、すべてのmysqlリクエストはMySQL unixソケットに送信されています。
unix 2 [ ACC ] STREAM LISTENING 3734388 15304/mysqld /var/run/mysqld/mysqld.sock
MySQLがループバックではなくネットワークソケットを使用するように、そのソケットを無効にしようとしています。 my.cnf
およびdebian.cnf
ファイル内のすべてのsocket
ディレクティブをコメントアウトしてMySQLを再起動しましたが、違いはありませんでした。
MySQL unixソケットを無効にして、ネットワーク経由でMySQLを強制する方法
追加情報:MySQL 5.1
でubuntu 10.04
を実行しています。
質問の精度
多くの人がネットワークソケットを有効にすることを提案したので、バインドアドレスはすでにbind-address = 127.0.0.1
で有効になっていて、リスニング接続が利用可能であることを指摘して、質問を明確にしたいと思います。
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 15601/mysqld
それでも、私のWebアプリケーション(Drupal Webサイト)からの127.0.0.1:3306
への接続の試みはありません。
回答で更新
確かに、問題はmysqli
コネクタから発生しているようですDrupalが使用します(.ht_config.php
内で、興味のある人のために)。設定されました:mysqli://drupal:***@localhost/drupal
、localhost
を127.0.0.1
に変更して問題を修正しました(Drupalがネットワークソケットに接続するようになりました)。
127.0.0.1
へのIPバインディングを使用します。これにより、localhost
のリスニングポートがアクティブになります。クライアント側ではlocalhost
を使用しないでください。代わりに127.0.0.1
を使用してください。多くのクライアントには、localhost
をターゲットとして指定した場合にソケットに接続するための内部エイリアスがあります。
MySQLは奇妙です。
Linuxおよびその他の* nixでは、ホスト "localhost"(デフォルトのホスト名)に接続する場合、MySQLはソケットを使用することを前提としています。
これは3つの方法でオーバーライドできます。1)127.0.0.1(mysql -h 127.0.0.1
)またはサーバーの実際のホスト名2)ソケットではなく、TCPを使用することを指定します(mysql --protocol tcp
)
また、デフォルトでmy.cnfを編集して、これを簡単に作成することもできます([クライアント]は任意のクライアントを意味します:
[client]
protocol=tcp
MySQLが接続方法を決定する方法の完全な説明は、次の場所で確認できます。
これは本当にクライアントの問題ではありませんか? mysqlプログラムを使用している場合--protocol
スイッチを使用できます。マニュアルページから
--protocol={TCP|SOCKET|PIPE|MEMORY}
The connection protocol to use for connecting to the server. It is
useful when the other connection parameters normally would cause a
protocol to be used other than the one you want. For details on the
allowable values, see Section 4.2.2, “Connecting to the MySQL
Server”.
試したところ
mysql --protocol=TCP -u root -p
tcpdump -i lo tcp port 3306
でポート3306を監視しているときにトラフィックを確認できますが、
mysql -u root -p
(正しく)ポート3306にトラフィックがない。
編集:
DRUPALを使用していることを伝えたので、ソリューションは比較的簡単です。
sites/<sitename>
またはsites/default
に移動し、settings.php
ファイルを編集します
あなたはこのような構造を見つけるでしょう
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'databasename',
'username' => 'databaseuser',
'password' => 'databasepassword',
'Host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
'localhost'
を'127.0.0.1'
に変更して、ファイルを保存します。
My.cnfを編集してディレクティブを追加します
bind-address = 127.0.0.1
または、ネットワーク経由でアクセスできるようにするための優先IP。 mysqlを再起動して機能させます。
pHP mysqliクライアントは、NULL値または文字列「localhost」( http://www.php.net/manual/en/mysqliを渡すと、tcpネットワークの代わりにUNIXソケットファイルを使用します.construct.php )
「localhost」を入力しても、sqlyogクライアントは常にtcpネットワークを使用するようです
これは少しクレイジーに聞こえるかもしれません
ソケットファイルを、別のマシンにある絶対パスに設定してみてください
http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket
そうでない場合、mysqldが通信するためのソケットファイルが存在する必要があるため、このデフォルトの動作をバイパスすることはできません。
(バックアップ後)/etc/my.cnfを削除し、サーバーを再起動する必要がありました。それから私はソケットで接続でき、エラーは消えました。