如何强制MySQL通过TCP而不是Unix套接字进行连接?


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.1ubuntu 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网站)的任何连接尝试。

更新的答案

实际上,问题似乎出在mysqliDrupal使用的连接器上(.ht_config.php针对那些感兴趣的人)。设置为 mysqli://drupal:***@localhost/drupal,更改localhost127.0.0.1解决此问题(即Drupal现在正在连接到网络套接字)。

Answers:


52

使用IP绑定到127.0.0.1。那应该激活上的监听端口localhost。在客户端不使用localhost- 127.0.0.1而是使用。如果指定localhost为目标,许多客户机都有一个内部别名,使它们可以连接到套接字。

MySQL很奇怪。


6
只需使用--protocol..参见乔纳森的答案。
佩里耶

75

在Linux和其他* nixes中,如果您连接到主机“ localhost”(这是默认主机名),MySQL将假定您要使用套接字。

您可以通过3种方式来覆盖它:1)指定其他主机名,例如127.0.0.1(mysql -h 127.0.0.1)或服务器的真实主机名2)指定您要使用TCP而不是套接字(mysql --protocol tcp

您还可以轻松地将默认值编辑my.cnf,使其具有此名称([client]表示任何客户端:

[client]
protocol=tcp

您可以在此处查看有关MySQL如何决定如何连接的完整说明:

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


6
这应该是公认的答案。
Pacerier '16

在使用docker-compose的Docker容器内运行MySQL服务器时,是否使用容器名称作为其主机名来强制通过套接字协议使用网络协议?
Stephane

绝对应该是公认的答案。方法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/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'并保存文件。


它确实可以由客户端问题引起,但是由于客户端是Web应用程序(Drupal),并且我无法控制它,因此我一直在寻找一种从系统角度强制它的方法。
最大

1
好吧,no control我说自己很戏剧化。我可以修改.ht_config.php文件并解决问题。
最大

也许有点戏剧性,但这是客户问题,很容易解决。看到我的编辑。
user9517支持GoFundMonica 2011年

抱歉,我在添加评论后用答案更新了问题。由于某些原因,我们使用.ht_config.php而不是settings.php。我不知道为什么(开发团队要求采用这种方式)。现在的问题是,Drupal似乎.ht_config.php在每个请求上都读取文件(因为如果我更改了文件,则会立即考虑更改),这对性能没有帮助。我们将寻找一种在应用程序层缓存这些设置的方法,但这是另一个问题。
最大

注意:--protocol=socket如果您host在此[client]部分中输入的内容出现错误,.my.cnf则无法执行此操作wrong or unknown protocol。(mysql 5.7.13)
Kris


1

编辑my.cnf并添加指令

bind-address = 127.0.0.1

或您首选的IP以使其可以通过网络访问。重新启动mysql以使其正常工作。



0

我必须删除/etc/my.cnf(在备份之后),然后重新启动服务器。然后我可以用套接字连接,错误消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.