以前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
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