MySQLの通信を覗き見してみよう

MySQLクライアントからデータベースに接続してあれこれしているときに何が起きているか覗き見してみました。
何かのヒントになるでしょうか。

bash-2.05b$ ./mysql -uhigpeon -phigepon -h 192.168.100.2
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 4.1.16

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use test;
Database changed
mysql> select * from test;
+------+------+
| hoge | hige |
+------+------+
|    1 |    2 |
|  100 |  200 |
+------+------+
2 rows in set (0.00 sec)

mysql> exit
Bye

データベース選択して select して exit しているだけです。

1.接続

クライアントからTCPで接続すると、サーバーからGreetingが返ってきます。
MySQLサーバーのバージョンやら、charset、スレッドIDなどクライアントに知らせておきたいものを送ってきているようです。

2.ログイン

クライアントからログインのための情報が送信されます。
パケットの中身は、username/passwordと各種フラグとなっています。

3.ログインOK

username/passwordで認証し、サーバーからOKが返ってきます

4.データベース選択

use test;で、testデータベースを使用することをサーバーに知らせます。
ここから面白くなってきましたね。
クライアントからサーバーに対して、文字列として「SELECT DATABASE()」というコマンドが送られています。


指定されたデータベースが利用可能であればOKが返ります。
3.と同様なので省略。

5.SELECT文発行

select * from test;

とSELECT文を発行します。

4.と同様にやはり文字列でSQLが送信されています。おもしろい!

6.SELECTの結果

発行したSELECT文の結果行がサーバーから返ってきます。
まずは、列定義。


その後に実際の行。

7.さようなら

まとめ

こうやって見ていくと、MySQLクライアントとサーバーのやりとりは、想像していたよりも大分簡単なやり取りであることが分かりました。
もう少し解析を進めれば

  • 自作MySQLクライアント
  • MySQLサーバー
    • ログインだけできるとか

などなどいろいろ楽しいことができそうですね。