
本番用のデータベースサーバーがあり、クエリログを有効にすることはできません…データベースに対して実行されているクエリはどのように見えますか?
答え:変更されたネットワークスニファを使用してMySQLパケットを解析し、それらをデコードします。少しコンパイルしなければなりませんが、それはそれに値するでしょう。試してみても構いませんが、通常はローカル接続では機能しません。
まず、libpcap-devをインストールする必要があります。これは、アプリケーションがネットワークパケットを盗聴できるようにする開発用ライブラリです。
sudo apt-get install libpcap-dev
ディレクトリを作り、ソースコードをダウンロードしてコンパイルしましょう
mkdir mysqlsniffer
cd mysqlsniffer
wget hackmysql.com/code/mysqlsniffer.tgz
tar xvfz mysqlsniffer.tgz
gcc -O2 -lpcap -o mysqlsniffer mysqlsniffer.c packet_handlers.c misc.c
現時点では、ソースディレクトリにmysqlsnifferという名前の新しい実行可能ファイルがあります。あなたは好きな場所にコピーすることができます(パスのどこかで役に立つでしょう)
mysqlsnifferを実行するには、MySQLがリッスンしているネットワークインタフェースを指定する必要があります。私にとっては、eth0です。
sudo /path/to/mysqlsniffer eth0
物の負荷が飛んでくる…もう少しフィルタをかけて、余分なデータすべてではなくクエリを取得してみましょう。
$ sudo /path/to/mysqlsniffer –no-mysql-hdrs eth0 | grep COM_QUERY
192.168.73.1.2622 > server: COM_QUERY: SELECT @@sql_mode 192.168.73.1.2622 > server: COM_QUERY: SET SESSION sql_mode=” 192.168.73.1.2622 > server: COM_QUERY: SET NAMES utf8 192.168.73.1.1636 > server: COM_QUERY: SELECT @@SQL_MODE 192.168.73.1.1636 > server: COM_QUERY: SHOW FULL COLUMNS FROM `db2842_howto`.`wp_users`
ああ、今そこには… MySQLを再起動する必要なく、あらゆる種類のクエリ情報があります。
コマンドの完全なオプションは次のとおりです。
使用法:mysqlsniffer [オプション]インタフェース
オプション: -port Nポート番号NでMySQLを聞きます(デフォルト3306)。 -verbose余分なパケット情報を表示する -tcp-ctrl TCP制御パケットを表示します(SYN、FIN、RST、ACK) -net-hdrs主要なIPとTCPヘッダーの値を表示する -no-mysql-hdrs MySQLヘッダ(パケットIDと長さ)を表示しません。 状態を表示する -v40 MySQLサーバはバージョン4.0です。 -dumpすべてのパケットを16進数でダンプします。 -helpこれを印刷する
元のソースコードと詳細情報: http://hackmysql.com/mysqlsniffer
開発サーバー上で実行している場合は、単にクエリのログを有効にする方が簡単です。