Quantcast
Channel: Planet MySQL
Viewing all articles
Browse latest Browse all 1081

Poor man's query logging (Windows版)

$
0
0
以前MySQL Performance Blogで以下の記事が紹介されていました。

Poor man's query logging

これはネットワークカードを直接tcpdumpで読んでクエリロギングするというものでした。当該エントリのコメントにもあるようにMySQL 5.1以降で動的に一般クエリログがオンオフできるようになったので、恩恵を受けるのは5.0以前のユーザのみになるのですが、4.x, 5.0はまだまだ使っている人は多いと思いまし、MySQL 5.1以降でも本体をいじらずにチト試せるところがいいところです。

今回はこれチトひねってWindowsで動作させるようにします。(さらにFirebirdにも対応します(^_^;))Windows版の制限は以下のとおり。

(i) 必要なコマンド類を事前にそろえる必要がある。
(ii)tcpdump(windump)の出力をいったんファイルに出す必要がある。(Windows用Stringsの制限)
(iii)localhost(127.0.0.1)のダンプは取得できない。別マシンからアクセスする必要がある。

元の記事はUnix/Linuxを元にしているので、以下のものがあるという前提です。

(1) tcpdumpコマンド
(2) stringsコマンド
(3) perlコマンド

当然Windowsにはこれらはデフォルトでないので、用意する必要があります。

(1) tcpdumpコマンド
 Windowsにはこれに相当するWinDumpというものがあります。
WinDumpのインストールにはWinPcapというライブラリのインストールが必要なので、ここから先にインストールします。

(2) stringsコマンド
 stringsコマンドに相当するコマンドはWindowsにはありません。幸いWindows Sysinternalsから以下のstringsがダウンロードできるので、これを使います。

Strings v2.41

(3) perlコマンド
 perlに相当するコマンドはWindowsにデフォルトではありません。通常Active Perlを使うことが多いと思いますが、ここではStrawberry Perlを使います。

Strawberry Fields Wherever...

さて、これで準備が整いました。元記事ではeth0を指定していましたが、WindowsではLinuxのように「まぁeth0指定しとけばOK」というわけにはいきませんので、windumpの-Dコマンドで監視するNICを確認します。私の環境では3.がeth0相当に該当しそうです。

windump -D
1.¥Device¥NPF_{57BB3C96-EDD8-4D43-A284-6BE820CAC119} (VMware Virtual Ethernet Adapter)
2.¥Device¥NPF_{915D3C21-457A-48AF-849C-C58015884865} (Sun (Microsoft's Packet Scheduler) )
3.¥Device¥NPF_{4839D2D4-BCAB-4408-8D5D-A3FD6AD32C2B} (Realtek RTL8139/810x Family Fast Ethernet NIC (Microsoft's Packet Scheduler))
4.¥Device¥NPF_{F7003CDD-A0CD-4E71-9285-0EA093889692} (VMware Virtual Ethernet Adapter)

上記のように「番号.名称 (説明)」の形式で出力されます。番号、もしくは名称が指定できますが、ここでは簡単なので番号(3)を利用することにします。ここで、監視したいポート番号(MySQLの場合は3306, Firebird/InterBaseの場合は3050)を指定します。これを指定して監視するためには、以下の用に出力します。

[MySQLの場合]
windump -i 3 -s 0 -l -w - dst port 3306 > temp.bin

[Firebird/InterBaseの場合]
windump -i 3 -s 0 -l -w - dst port 3050 > temp.bin

さて、このWindowsに外から接続してダンプを出力するためには、Windowsのファイヤーウォールから該当するポート番号(MySQLは3306, Firebird/InterBaseは3050)のTCP/IPを通るようにしておく必要があります。

Windows ファイアウォールの理解

設定ができたら実際に外から接続してみます。接続のためのIPアドレスはipconfigコマンドで確認します。

ipconfig

Windows IP Configuration

(中略)

Ethernet adapter ローカル エリア接続:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 192.168.x.y
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1

(以下、略)

ローカルエリア接続のIP Addressをメモします。これを指定して外部から接続します。(外部からアクセスできるユーザを用意しておきます)

[MySQLの場合]

mysql -uユーザ名 -pパスワード -h192.168.x.y

[Firebird/InterBaseの場合: データベース本体はc:¥sample.fdb]

isql -u ユーザ名 -p パスワード "192.168.x.y:c:¥sample.fdb"

これで一連の操作をしてからWinDumpを止め、通信が記録されたtemp.binにたいして、以下のコマンドを実行します。(コマンドはかなり盛っているので適当に増減してください)

strings temp.bin | perl -e "while(<>){print if(m/^(SELECT|UPDATE|DELETE|INSERT|REPLACE|SET|COMMIT|ROLLBACK|CREATE|DROP|RENAME|ALTER|BEGIN|START|SHOW|LOAD|TRUNCATE|USE|SAVEPOINT|RELEASE|LOCK|UNLOCK|GRANT|REVOKE|CALL|EXECUTE)/i);}"

するとこんな感じで出力されます。(MySQLの場合)

set autocommit=09
begin<
select * from m1?
commitD
start transactionH
select * from t1M
rollbackP
select @@version_comment limit 1
show global variables
show databases

各文末にはゴミが出る場合がありますが(上記の赤字がそうです)、まぁだいたいわかると思います。。。。これで、サーバが受信したコマンドを確認してみてください!
PlanetMySQL Voting: Vote UP / Vote DOWN

Viewing all articles
Browse latest Browse all 1081

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>