Làm cách nào để buộc MySQL kết nối bằng TCP thay vì ổ cắm Unix?


46

Tôi muốn phân tích mysqlgiao thông. Ngay bây giờ, tất cả các yêu cầu mysql được gửi đến ổ cắm unix MySQL:

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

Tôi đang cố gắng vô hiệu hóa ổ cắm đó để buộc MySQL sử dụng ổ cắm mạng thay vào đó trên loopback. Tôi đã cố gắng bình luận tất cả các socketchỉ thị trong my.cnfdebian.cnfcác tệp và khởi động lại MySQL nhưng nó không có gì khác biệt.

Làm cách nào tôi có thể vô hiệu hóa ổ cắm unix MySQL để buộc MySQL qua mạng?

thông tin bổ sung: Tôi đang chạy MySQL 5.1trên ubuntu 10.04.

Các vấn đề về câu hỏi
Vì nhiều người đề nghị kích hoạt ổ cắm mạng, tôi muốn làm rõ câu hỏi của mình bằng cách chỉ ra rằng địa chỉ liên kết đã được bật bind-address = 127.0.0.1và có sẵn kết nối nghe:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      15601/mysqld 

Tuy nhiên, tôi thấy không có kết nối nào cố gắng 127.0.0.1:3306đến từ ứng dụng web của tôi (trang web Drupal).

Cập nhật với câu trả lời

Có vẻ như vấn đề thực sự đến từ trình mysqlikết nối mà Drupal sử dụng ( .ht_config.phpdành cho những người quan tâm). Nó đã được đặt : mysqli://drupal:***@localhost/drupal, thay đổi localhostđể 127.0.0.1khắc phục sự cố (tức là Drupal hiện đang thực hiện kết nối với ổ cắm mạng).

Câu trả lời:


52

Sử dụng một liên kết IP để 127.0.0.1. Điều đó sẽ kích hoạt một cổng nghe trên localhost. Về phía khách hàng không sử dụng localhost- sử dụng 127.0.0.1thay thế. Nhiều khách hàng có một bí danh nội bộ khiến họ kết nối với ổ cắm nếu bạn chỉ định localhostlàm mục tiêu.

MySQL là lạ.


6
Chỉ cần sử dụng --protocol.. xem câu trả lời của Jonathan.
Pacerier

75

Trong Linux và các * nixes khác, MySQL sẽ cho rằng bạn muốn sử dụng ổ cắm nếu bạn kết nối với máy chủ "localhost" (sẽ là tên máy chủ mặc định).

Bạn có thể ghi đè lên điều này theo 3 cách: 1) Chỉ định tên máy chủ khác như 127.0.0.1 ( mysql -h 127.0.0.1) hoặc tên máy chủ thực sự của máy chủ 2) Chỉ định rằng bạn muốn sử dụng TCP chứ không phải socket ( mysql --protocol tcp)

Bạn cũng có thể dễ dàng làm cho mặc định của tôi chỉnh sửa my.cnf của bạn để nó có cái này ([client] có nghĩa là bất kỳ ứng dụng khách nào:

[client]
protocol=tcp

Bạn có thể xem mô tả đầy đủ về cách MySQL quyết định cách kết nối tại đây:

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


6
Đây phải là câu trả lời được chấp nhận.
Pacerier

Việc chạy máy chủ MySQL bên trong một container Docker có docker-compose với việc sử dụng tên container làm tên máy chủ của nó có buộc sử dụng protocl mạng qua giao thức socket không?
Stephane

chắc chắn nên là câu trả lời được chấp nhận. cách 3 (giao thức = tcp trong my.cnf) là cách duy nhất hoạt động mà không có bất kỳ tham số dòng lệnh bổ sung nào để hoạt động mà không thay đổi trong bất kỳ tập lệnh nào.
Tuncay Göncüoğlu

16

Đây thực sự không phải là một vấn đề của khách hàng? Nếu sử dụng chương trình mysql Bạn có thể sử dụng công --protocoltắc. Từ trang người đàn ông

 --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”.

tôi chỉ cố

mysql --protocol=TCP -u root -p

Trong khi giám sát cổng 3306 tcpdump -i lo tcp port 3306và tôi có thể thấy lưu lượng trong khi tôi chỉ chạy

mysql  -u root -p

Tôi (chính xác) thấy không có lưu lượng trên cổng 3306.

BIÊN TẬP:

Bây giờ bạn nói với chúng tôi rằng bạn đang sử dụng DRUPAL, giải pháp tương đối dễ dàng.

Chuyển đến sites/<sitename>hoặc sites/defaultchỉnh sửa settings.phptệp

Bạn sẽ tìm thấy một cấu trúc như thế này

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

Thay đổi 'localhost'để '127.0.0.1'và tiết kiệm các tập tin.


nó thực sự có thể do một vấn đề của khách hàng nhưng vì máy khách là một ứng dụng web (Drupal) và tôi không kiểm soát được nó nên tôi đang tìm cách để buộc nó từ quan điểm hệ thống.
Tối đa

1
tốt bằng cách nói rằng no controltôi đã được kịch tính. Tôi có thể sửa đổi các .ht_config.phptập tin và khắc phục vấn đề.
Tối đa

Một chút kịch tính có lẽ nhưng đó là một vấn đề của khách hàng và nó dễ dàng được giải quyết. Xem chỉnh sửa của tôi.
user9517 hỗ trợ GoFundMonica

Xin lỗi, tôi đã cập nhật câu hỏi của mình với câu trả lời sau khi tôi thêm nhận xét của mình. Đối với một số lý do chúng tôi đang sử dụng .ht_config.phpthay vì settings.php. Tôi không biết tại sao (nhóm nhà phát triển yêu cầu nó phải như vậy). Bây giờ vấn đề là Drupal dường như đang đọc .ht_config.phptệp theo mọi yêu cầu (bởi vì nếu tôi thay đổi, các thay đổi sẽ được tính ngay lập tức) không thể giúp ích cho các buổi biểu diễn. Chúng tôi sẽ tìm cách lưu trữ các cài đặt đó ở lớp ứng dụng nhưng đó là một vấn đề khác.
Tối đa

Lưu ý: bạn không thể làm gì --protocol=socketnếu bạn có một hostmục trong [client]phần của .my.cnfnó gây ra wrong or unknown protocollỗi. (mysql 5.7.13)
Kris


1

Chỉnh sửa my.cnf và thêm chỉ thị

bind-address = 127.0.0.1

hoặc IP ưa thích của bạn để làm cho nó có thể truy cập qua mạng. Khởi động lại mysql sau để làm cho nó hoạt động.


1

Máy khách php mysqli sẽ sử dụng tệp ổ cắm unix thay vì mạng tcp khi bạn truyền vào giá trị NULL hoặc chuỗi "localhost" ( http://www.php.net/manual/en/mysqli.construct.php )

có vẻ như máy khách sqlyog luôn sử dụng mạng tcp ngay cả khi bạn điền "localhost" vào nó


0

Tôi đã phải xóa /etc/my.cnf (sau khi sao lưu), sau đó khởi động lại máy chủ. Sau đó, tôi có thể kết nối với một ổ cắm và lỗi biến mất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.