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


46

mysqlトラフィックを分析したいと思います。現在、すべてのmysqlリクエストはMySQL unixソケットに送信されます。

unix  2      [ ACC ]     STREAM     LISTENING     3734388  15304/mysqld        /var/run/mysqld/mysqld.sock

MySQLがループバックではなくネットワークソケットを使用するように、そのソケットを無効にしようとしています。and ファイルsocket内のすべてのディレクティブをコメント化して、MySQLを再起動しましたが、違いはありませんでした。my.cnfdebian.cnf

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 

それでも127.0.0.1:3306、webapp(DrupalのWebサイト)からの接続は試行されません。

答えで更新

確かに、問題はmysqliDrupalが使用しているコネクタに起因しているようです(.ht_config.php興味のある人向け)。設定された: mysqli://drupal:***@localhost/drupal、変更localhost127.0.0.1て問題を修正しました(つまり、Drupalは現在ネットワークソケットに接続しています)。

回答:


52

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

MySQLは奇妙です。


6
使用して--protocolください..ジョナサンの答えを参照してください。
Pacerier

75

Linuxおよびその他の* nixesでは、MySQLは、ホスト「localhost」(デフォルトのホスト名)に接続する場合、ソケットの使用を想定します。

これは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


6
これは受け入れられた答えでなければなりません。
Pacerier

ホスト名としてコンテナ名を使用してdocker-composeを使用してDockerコンテナ内でMySQLサーバーを実行すると、ソケットプロトコルを介したネットワークプロトコルの使用が強制されますか?
ステファン

間違いなく受け入れられる答えでなければなりません。方法3(my.cnfのprotocol = tcp)は、追加のコマンドラインパラメーターなしで機能する唯一の方法なので、スクリプトを変更することなく機能します。
TuncayGöncüoğlu

16

これは本当にクライアントの問題ではありませんか?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

ポート3306を監視しながらtcpdump -i lo tcp port 3306トラフィックを確認できますが、

mysql  -u root -p

ポート3306にトラフィックが(正しく)表示されません。

編集:

DRUPALを使用していることを伝えたので、解決策は比較的簡単です。

ファイルに移動するsites/<sitename>sites/defaultsettings.phpファイルを編集します

このような構造が見つかります

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'databasename',
      'username' => 'databaseuser',
      'password' => 'databasepassword',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

を変更し'localhost''127.0.0.1'ファイルを保存します。


確かにクライアントの問題による可能性がありますが、クライアントはWebアプリケーション(Drupal)であり、それを制御できないため、システムの観点から強制する方法を探していました。
マックス

1
まあno control私はドラマチックだったと言って。.ht_config.phpファイルを修正して問題を修正できました。
最大

おそらく劇的ですが、それはクライアントの問題であり、簡単に解決できます。編集をご覧ください。
user9517はGoFundMonica

申し訳ありませんが、コメントを追加した後、質問を回答で更新しました。何らかの理由での.ht_config.php代わりに使用していますsettings.php。理由はわかりません(開発チームは、そうするように要求しました)。問題は、Drupal .ht_config.phpがすべてのリクエストでファイルを読み込んでいるように見えることです(変更するとすぐに変更が考慮されるため)。これはパフォーマンスに役立ちません。アプリケーション層でこれらの設定をキャッシュする方法を探していますが、それは別の問題です。
最大

注:あなたが行うことができない--protocol=socketあなたが持っている場合hostのエントリ[client]のセクション.my.cnf、それが与えるwrong or unknown protocolエラーを。(mysql 5.7.13)
クリス


1

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

bind-address = 127.0.0.1

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


1

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

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


0

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

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