web-dev-qa-db-ja.com

MySQLにUnixソケットの代わりにTCPで強制的に接続させる方法は?

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.1ubuntu 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/drupallocalhost127.0.0.1に変更して問題を修正しました(Drupalがネットワークソケットに接続するようになりました)。

47
Max

127.0.0.1へのIPバインディングを使用します。これにより、localhostのリスニングポートがアクティブになります。クライアント側ではlocalhostを使用しないでください。代わりに127.0.0.1を使用してください。多くのクライアントには、localhostをターゲットとして指定した場合にソケットに接続するための内部エイリアスがあります。

MySQLは奇妙です。

53
Nils

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が接続方法を決定する方法の完全な説明は、次の場所で確認できます。

http://dev.mysql.com/doc/refman/5.5/en/connecting.html

83
Jonathan Amend

これは本当にクライアントの問題ではありませんか? 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'に変更して、ファイルを保存します。

16
user9517

My.cnfを編集してディレクティブを追加します

bind-address = 127.0.0.1

または、ネットワーク経由でアクセスできるようにするための優先IP。 mysqlを再起動して機能させます。

1
Chris

pHP mysqliクライアントは、NULL値または文字列「localhost」( http://www.php.net/manual/en/mysqliを渡すと、tcpネットワークの代わりにUNIXソケットファイルを使用します.construct.php

「localhost」を入力しても、sqlyogクライアントは常にtcpネットワークを使用するようです

1
diyism

これは少しクレイジーに聞こえるかもしれません

ソケットファイルを、別のマシンにある絶対パスに設定してみてください

http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket

そうでない場合、mysqldが通信するためのソケットファイルが存在する必要があるため、このデフォルトの動作をバイパスすることはできません。

1
RolandoMySQLDBA

(バックアップ後)/etc/my.cnfを削除し、サーバーを再起動する必要がありました。それから私はソケットで接続でき、エラーは消えました。

0
robrecord