MySQLのパケットをtcpdumpでキャプチャできない!?

MySQLのパケットをtcpdumpでキャプチャしようとしたら、全くキャプチャできないという事態が発生。

とりあえずMySQLに接続した状態でnetstatを打ってみる。

■netstatの結果
[user@example ~]$ netstat -an | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN

3306ポート(MySQLポート)がLISTENのままになっている?
もし接続が確立しているならESTABLISHEDになるはずなのに。。。

もう一度netstatの結果をよく見てみると「UNIX domain sockets」のところに以下のような表示を発見
[user@example ~]$ netstat -an
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] STREAM CONNECTED 11288 /var/lib/mysql/mysql.sock

どうやらUNIXドメインソケットにつながっていた模様。

■UNIXドメインソケットとは?
簡単に説明するとローカルマシン上のプロセス間通信で利用するソケットのこと。これはネットワークを介さない通信なのでtcpdumpではパケットを拾うことができない。

■原因と解決策
MySQLに接続する際、ホスト名を指定しないと『localhost』で接続することになる。その場合、UNIXドメインソケットにつなぐことになるのでtcpdumpではパケットを拾えない。

なのでMySQLに接続する際は以下のようにしてホスト名を指定すればOK。
mysql -h [hostname] -u [username]

■netstatの結果
[user@example ~]$ netstat -an | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:42495 127.0.0.1:3306 ESTABLISHED
tcp 0 0 127.0.0.1:3306 127.0.0.1:42495 ESTABLISHED

これでtcpdumpでMySQLのパケットをキャプチャできるようになります。

以上

参考URL
http://norainu.net/mt/archives/2007/02/localhost_unix.html

Leave a Reply

Your email address will not be published. Required fields are marked *