mysql-proxy の luaスクリプトにあらかじめ定義されている関数群があります。イベントハンドらになる部分として、接続時に呼ばれるもの、認証時に呼ばれるもの、クエリを投げたときに呼ばれるもの、などがあります。
以下とりあえずどんなタイミングでどんな関数が呼ばれるのか、およびその受け取りパラメーターにはどんな値が入っているのかを確認するためのサンプルスクリプトです。
このスクリプトをファイルに記録して(仮に simplesample.lua) mysql-proxy を実行します。(実行方法はスクリプトの下に書きました)
--接続時に呼ばれる関数 function connect_server() print ("CONNECT_SERVER()") print ("-------------") end --認証のハンドシェイク時に呼ばれる function read_handshake( auth ) print ("READ_HANDSHAKE()") table.foreach( auth, print) print ("-------------") end --認証時に呼ばれる function read_auth( auth ) print ("READ_AUTH()") table.foreach(auth, print) print ("-------------") end --認証結果を返すときに呼ばれる function read_auth_result( auth ) print ("READ_AUTH_RESULT()") table.foreach(auth, print) print ("-------------") end --クエリを投げたときに呼ばれる function read_query( packet ) print ("READ_QUERY()") print(string.format("%s (%s)", hexdump(packet), packet )) print ("-------------") proxy.queries:append(1, packet ) return proxy.PROXY_SEND_QUERY end --クエリ結果戻りのときに呼ばれる function read_query_result( inj ) print ("READ_QUERY_RESULT()") print ("QUERY: " .. inj.query) print ("ID: "..inj.id.." QTIME: "..inj.query_time.." RTIME: "..inj.response_time) --inj.resultset print ("-------------") end --16進dump用 function hexdump( s ) local ret = {} for i = 1, s:len() do ret[i] = string.format("%02X ", s:byte(i)) end return table.concat(ret) end
mysql-proxyの実行:
別窓で mysql-proxyを解して mysqld に接続してみます:
$ /usr/local/mysql/bin/mysql -uroot -h127.0.0.1 -P4040
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 44
Server version: 5.1.25-rc-log Source distributionType 'help;' or '\h' for help. Type '\c' to clear the buffer.
実行結果例:
[sakaik@colin mysql-proxy-0.6.1-linux-fc4-x86-32bit]$ sbin/mysql-proxy --proxy-lua-script=sbin/simplesample.lua CONNECT_SERVER() ------------- READ_HANDSHAKE() scramble `S_bODGwB$)CSYG5scxS mysqld_version 50125 server_addr 127.0.0.1:3306 thread_id 44 client_addr 127.0.0.1:6153 ------------- READ_AUTH() password default_db test username root ------------- READ_AUTH_RESULT() packet ------------- READ_QUERY() 03 73 65 6C 65 63 74 20 40 40 76 65 72 73 69 6F 6E 5F 63 6F 6D 6D 65 6E 74 20 6C 69 6D 69 74 20 31 (select @@version_comment limit 1) ------------- READ_QUERY_RESULT() QUERY: select @@version_comment limit 1 ID: 1 QTIME: 635 RTIME: 684 -------------
こんな情報が取れます。結果セットについては場合分けが必要っぽかったので(まだちゃんとパラメータの構造体(?)を把握していない)表示をあきらめました。
注目すべきは、READ_QUERY() の1バイト目。03で始まる場合は通常のクエリです。データベースの選択の場合は 02、終了は 01 のように1バイト目で何の処理かを示しています。
これ、一回ちゃんと調べてまとめましょうかね。
.
.