MySQL을 유닉스 소켓 대신 TCP로 연결하는 방법은 무엇입니까?


46

mysql트래픽 을 분석하고 싶습니다 . 현재 모든 MySQL 요청은 MySQL 유닉스 소켓으로 전송됩니다.

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

루프백에서 대신 MySQL이 네트워크 소켓을 사용하도록 해당 소켓을 비활성화하려고합니다. and 파일 socket의 모든 지시문을 주석 처리하고 MySQL을 다시 시작했지만 아무런 차이가 없었습니다.my.cnfdebian.cnf

네트워크를 통해 MySQL을 강제 실행하기 위해 MySQL unix 소켓을 어떻게 비활성화 할 수 있습니까?

추가 정보 : 나는 달리고 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:3306webapp (Drupal 웹 사이트)에서 연결이 시도되지 않습니다 .

답변으로 업데이트

mysqliDrupal이 사용 하는 커넥터 에서 문제가 발생한 것으로 보입니다 ( .ht_config.php관심있는 사람들을 위해). 그것은 설정 : mysqli://drupal:***@localhost/drupal변화 localhost127.0.0.1(즉, 드루팔 이제 네트워크 소켓에 연결을하고있다) 고정 문제.

답변:


52

에 IP 바인딩을 사용하십시오 127.0.0.1. 에서 청취 포트를 활성화해야합니다 localhost. 클라이언트 측에서 사용하지 않는 localhost-을 사용 127.0.0.1하는 대신. 많은 클라이언트에는 localhost대상으로 지정하면 소켓에 연결되는 내부 별명이 있습니다 .

MySQL은 이상하다.


6
그냥 사용 --protocol하십시오. Jonathan의 답변을 참조하십시오.
Pacerier

75

Linux 및 기타 * nix에서 MySQL은 호스트 "localhost"(기본 호스트 이름 임)에 연결하는 경우 소켓을 사용한다고 가정합니다.

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

호스트 이름으로 컨테이너 이름을 사용하여 docker-compose로 Docker 컨테이너 내에서 MySQL 서버를 실행하면 소켓 프로토콜을 통해 네트워크 프로토콜을 사용해야합니까?
Stephane

반드시 정답이되어야합니다. 방법 3 (my.cnf의 protocol = tcp)은 추가 명령 줄 매개 변수없이 작동하는 유일한 방법이므로 스크립트를 변경하지 않고도 작동합니다.
Tuncay Gö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'파일을 저장하십시오.


실제로 클라이언트 문제로 인해 발생할 수 있지만 클라이언트가 웹 응용 프로그램 (Drupal)이므로 제어 할 수 없기 때문에 시스템 관점에서 강제 할 수있는 방법을 찾고있었습니다.
Max

1
no control내가 극적 이라고 말하면서 나는 수정할 수있는 .ht_config.php파일을하고 문제를 해결.
Max

어쩌면 극적이지만 클라이언트 문제이며 쉽게 해결할 수 있습니다. 내 편집을 참조하십시오.
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)
Kris


1

my.cnf를 편집하고 지시문을 추가하십시오

bind-address = 127.0.0.1

또는 네트워크를 통해 액세스 할 수 있도록 선호하는 IP. 작동하려면 mysql을 다시 시작하십시오.


1

PHP mysqli 클라이언트는 NULL 값 또는 문자열 "localhost"를 전달할 때 tcp 네트워크 대신 유닉스 소켓 파일을 사용합니다 ( http://www.php.net/manual/en/mysqli.construct.php )

sqlyog 클라이언트는 "localhost"를 채울 때에도 항상 tcp 네트워크를 사용하는 것으로 보입니다.


0

/etc/my.cnf를 삭제 한 후 (백업 한 후) 서버를 다시 시작해야했습니다. 그런 다음 소켓에 연결할 수 있으며 오류가 사라졌습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.