mysql.sock 라는 것은 Unix Domain Socket 입니다.
Unix Domain Socket 이라는 것은 TCP/IP와 같은 식으로 다룰 수 있는 통신 소켓입니다.
(소켓 프로그래밍에서도 socket을 생성할 때 TCP/IP와 인수만 다르게 주어서
생성시키죠. 그 뒤는 같은 방식으로 다룹니다.)
단 Unix Domain Socket은 다른 컴퓨터에 있는 프로세스와는 통신할 수 없고,
같은 컴퓨터에 있는 프로세스끼리 통신만 가능합니다. 일종의 IPC 죠.
왜 이런 게 필요하냐면,
Mysql 서버 프로그램(데몬이라고 하죠. mysqld)과 클라이언트 프로그램(mysql, 또는
php의 mysql 접속 루틴)은 서로 다른 프로세스입니다. 당연히 둘 사이에 통신이 이루어져야
어떤 일을 할 수 있는 거죠. 이 통신의 용도로 Unix Domain Socket을 쓰는 겁니다.
mysql은 TCP/IP 소켓과 Unix Domain Socket 둘 다 사용할 수 있습니다.
앞의 것은 mysql 서버와 클라이언트가 다른 컴퓨터에 있을 때 사용하며(이때 포트는 보통
3306이죠), 뒤의 것은 서버와 클라이언트가 같은 컴퓨터에 있을 때 사용합니다. 같은 컴퓨터에
있을 때에도 TCP/IP 소켓을 쓸 수도 있으나 Unix Domain Socket이 더 빠르죠.
TCP/IP 소켓이 아이피 주소와 포트를 이용해서 접속을 하듯이 Unix Domain Socket은
파일을 이용합니다. 질문에서 나왔던 mysql.sock 이라는 것이 바로 이 용도로 사용되는
파일입니다. 따라서 mysqld 를 실행시켰을 때는 mysql.sock 파일이 있지만, 중지시키면
저 파일은 사라집니다.
그래서 통신을 하기 위해서는 mysql.sock 라는 파일은 서버와 클라이언트 모두 접근
가능해야 합니다. mysql.sock 파일이 생성되는 위치에 서버가 파일을 쓰거나 읽을 수 없으면
서버는 에러를 발생시키고 중지되며, 클라이언트가 그 파일에 접근할 수 없으면 접속이
이루어지지 않습니다. mysql.sock 파일에 관한 문제는 이 접근 권한이 잘못되어서
발생하는 것이 대부분입니다.
rpm으로 설치하면 보통 mysql.sock 파일의 위치는 /var/lib/mysql/mysql.sock 입니다.
이것은 mysql 을 컴파일할 때 --with-unix-socket-path=.... 에서 설정할 수 있습니다.
이럿게 되면 mysqld, mysql, 그리고 libmysqlclient.a(so) 도 모두 이 설정을 이용해서
통신을 하게 됩니다. 이 도메인 소켓의 위치는 컴파일 후라도 명령행 인수를 이용해서
바꿔 줄 수 있습니다. 또는 /etc/my.cnf 파일에서 지정할 수도 있습니다.
unix domain socket 에 대해 더 자세히 알고 싶으시면
W. Richard Stevens, Unix Network Programming I 을 참조하시면 됩니다.
'Works > MySQL' 카테고리의 다른 글
외부 접속 db 계정 추가 및 삭제 하는 방법 (0) | 2015.11.20 |
---|---|
mysql의 지나친 cpu 점유일때 살펴보는 명령어 두개 (0) | 2015.10.28 |
MySQL db 일반유저 패스워드 변경방법 (0) | 2015.10.28 |
Truncate 와 delete 문의 차이비교 (0) | 2015.10.28 |
MySQLdump 특정테이블 제외하고 덤프 (0) | 2015.10.28 |