WindowsOSのPCでWebプログラムの開発をしています。開発環境としてはXAMPPを使っています。WordPressなどを動かしたときに実際にはどのようなSQL文が実行されるのか、知りたくなりMySQLのログを取れるように設定してみました。そのことについて書きます。
MySQLで出力されるログの種類
MySQLから出力されるログはいくつかの種類があります。実際にはどんな種類があるのか検索してみて、こちらのサイトを見つけました。
エラーログ、一般クエリログ、バイナリログ、リレーログ、スロークエリログの5種類があるようです。このうちエラーログはデフォルトで出力されるように設定されているため、たまに参照することもあり知っています。
今回はWordPressである動きをしたときにどのようなSQL文を投げているのかを知りたいので 一般クエリログ を取るようにしたいと思います。
一般クエリログが出力されるように設定する XAMPP1.8.1 [PHP: 5.4.7]編
一般クエリログはデフォルトでは出力しない設定になっているので、出力されるようにしたいと思います。
XAMPPをインストールしてあるフォルダにある mysql\bin\ フォルダを開きます。そこに my.ini という設定ファイルがありますので開きます。
[mysqld] というキーワードで検索をします。
[mysqld] port= 3306 socket = "C:/xampp54/mysql/mysql.sock" basedir = "C:/xampp54/mysql" tmpdir = "C:/xampp54/tmp" datadir = "C:/xampp54/mysql/data" pid_file = "mysql.pid" # enable-named-pipe key_buffer = 16M max_allowed_packet = 1M table_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M log_error = "mysql_error.log"
検索すると [mysqld] が見つかりだいたいこんな感じの設定になっています。一番下に書いてある log_error という行にエラーログをどこに出力するかが書いてあります。mysql\data\ フォルダを見ると mysql_error.log というファイルが見つかるかと思います。ここにmysqlのエラーログが書き込まれています。
この行の下に、一般クエリログを出力する行を追加します。
log="myquery.log"
保存します。XAMPPのフォルダにある mysql_stop.bat で一旦MySQLを止めてから mysql_start.bat で再立ち上げします。
XAMPPにインストールしてあるWordPressのサイトを開いてから mysql\data\ を見ると myquery.log というファイルができていました。
開くと、
mysql\bin\mysqld.exe, Version: 5.5.27-log (MySQL Community Server (GPL)). started with: TCP Port: 3306, Named Pipe: C:/xampp54/mysql/mysql.sock Time Id Command Argument 150909 14:44:45 1 Connect root@localhost on 1 Query SET NAMES utf8mb4 1 Query SELECT @@SESSION.sql_mode 1 Init DB wordpress 1 Query SELECT option_name, option_value FROM wordpress_options WHERE autoload = 'yes' 1 Query SELECT option_value FROM wordpress_options WHERE option_name = 'uninstall_plugins' LIMIT 1 1 Query SELECT option_value FROM wordpress_options WHERE option_name = 'onp_license_clipboard-images' LIMIT 1
こんな感じで一般クエリーログが出力されていました。
一般クエリログが出力されるように設定する XAMPP5.6.3 [PHP: 5.6.3]編
と、自分が使う分にはこれで良かったのですがblogに書くにあたり「XAMPPのバージョンがPHP5.4のころのものだったから新しいXAMPP5.6でも同じようにできますと書こう」と思い、念のため確認してみました。
同じように my.ini に1行追加して実行しようとすると、mysqlが立ち上がりません(>_<)。何度も見直して全く同じようにいれているのに…と悩みましたがエラーメッセージをよく見てみました
[ERROR] mysql\bin\mysqld: ambiguous option '--log=myquery.log' (log-bin, log_slave_updates)
このエラーメッセージを元にググってみると同じようなエラーが出てしまった人のページが見つかり、ログファイルの指定だけでは足りないことが分かりました。ということで
general_log = ON general_log_file="myquery.log"
このように変更しました。ログファイルも general_log_file= という書き方になっています。これで無事にログが取れることを確認しました。
ということは、と先ほど修正した XAMPP1.8.1 [PHP: 5.4.7] をこの新しい方法に書き直し、MySQLを立ち上げ直して確認したところこの書き方でも問題なく動いていることが分かりました。
XAMPPの各バージョンでの一般クエリログ取得方法を調べてみました
私のPCにはあと2つのバージョンのXAMPPが入っているのですべてについて確認してみました。
確認した2バージョンの他に XAMPP1.7.7 [PHP: 5.3.8]、 XAMPP1.7.1[PHP: 5.2.9] がインストールされています。試してみて分かった結果をマトリックスで表示します
log=”myquery.log” | general_log = ON general_log_file=”myquery.log” |
|
XAMPP5.6.3 [PHP: 5.6.3] | NG | OK |
XAMPP1.8.1 [PHP: 5.4.7] | OK* | OK |
XAMPP1.7.7 [PHP: 5.3.8] | OK* | OK |
XAMPP1.7.1[PHP: 5.2.9] | OK | NG |
このような結果になりました。一番古い、XAMPP1.7.1の時点では log= と1行で指定する方法しか有効ではありません。このバージョンまではこれが正しい指定方法だったようです。XAMPP1.7.7とXAMPP1.8.1ではどちらの書き方でもログは取れていましたが、MySQLを立ち上げた時に
[Warning] The syntax '--log' is deprecated and will be removed i n a future release. Please use '--general-log'/'--general-log-file' instead.
このようなワーニングが出ていました。これはきっと1.7.7あたりから新しいログの指定方法を採用しているのだけれども、いきなりそれまでの指定方法をエラーにすると色々問題が起こるのでワーニングは出すけれども一応動くという状況のようです。この状況のものを OK* としました。XAMPP5.6.3 あたりからはもう旧来の方法ではエラーとするようにしたようです。
と、色々なことが分かりました(^^)/。
おまけ:MySQLの一般クエリログでみたかったもの、と指定は忘れずに解除しましょうということ
この一般クエリログで見たかったのはWordPressで検索をしたときにどのようなSQL文になっているの?ということでした。
エディタ という文字を検索したときのSQL文は
SELECT SQL_CALC_FOUND_ROWS wordpress_posts.ID FROM wordpress_posts WHERE 1=1 AND (((wordpress_posts.post_title LIKE ‘%エディタ%’) OR (wordpress_posts.post_content LIKE ‘%エディタ%’))) AND wordpress_posts.post_type IN (‘post’, ‘page’, ‘attachment’, ‘mtssb_article’, ‘faq’) AND (wordpress_posts.post_status = ‘publish’ OR wordpress_posts.post_author = 1 AND wordpress_posts.post_status = ‘private’) ORDER BY wordpress_posts.post_title LIKE ‘%エディタ%’ DESC, wordpress_posts.post_date DESC LIMIT 0, 16
こんな感じでした!これが見たかったのですっきりしました。
あと、このログはWordPressで検索したときだけでなく表示する時には必ず出力されてしまうのでファイルの大きさが膨大になってしまいます。なので確認が終わったら忘れずに
#log="myquery.log"
コメントアウトするか、
general_log = OFF general_log_file="myquery.log"
OFF にしておいた方が良さそうです。
[amazon_searchlink search=”PHPプログラム”]
コメント