MacでMySQLのクエリログを確認する方法

はじめに

前にこんな記事を書きました。
クエリログを確認する方法 | Macha’s Dev Blog

どんなクエリが走ってるのか分からないとサービスの最適化は難しいですから、非常に重要ですね。
今回、サーバ上でなく、MacでもMySQLログの出力を試みました。
そのときちょっと躓いたので記録します。

環境

Mac OS X Mountain Lion
MySQLはhomebrewで入れました。

-> % mysql --version
mysql Ver 14.14 Distrib 5.6.10, for osx10.8 (x86_64) using EditLine wrapper

作業ログ

ログを出力するまでのログです。笑

結果だけ知りたい人は下までスクロールしてください。

現状確認

まずは現状確認です。mysql.server startし、MySQLにつないでSHOW VARIABLESします。

-> % sudo mysql.server start
Starting MySQL
. SUCCESS!

-> % mysql -uUSERNAME -p

mysql>SHOW VARIABLES;

これで色々と出力されるはずです。

大事なのは ‘general_log’ の設定です。これがOFFになっているとログは出力されていません。
ちなみに、’general_log_file’ がログが出力されるファイルであり、’slow_query_log’ はスロークエリの出力設定です。

mysql.serverを追う

mysql.server とかコピペでうっていますが、一体なんなのでしょう。追ってみます。


-> % which mysql.server
/usr/local/bin/mysql.server

-> % less /usr/local/bin/mysql.server

なるほど。色々書いてあります。

僕の予想だとこの辺が大事ですね。


271 case "$mode" in
272     'start')
273     # Start daemon
274
275     # Safeguard (relative paths, core dumps..)
276     cd $basedir
277
278     echo $echo_n "Starting MySQL"
279     if test -x $bindir/mysqld_safe
280     then
281         # Give extra arguments to mysqld with the my.cnf file. This script
282         # may be overwritten at next upgrade.
283         $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
284         wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
285
286     # Make lock for RedHat / SuSE
287     if test -w "$lockdir"
288     then
289         touch "$lock_file_path"
290     fi
291
292     exit $return_value
293 else
294     log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
295 fi
296 ;;

特にここ


$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &


$other_argsとかあるので、普通に mysql.serverにmysqld_safeに渡すようなオプションを渡しておけば大丈夫そうですね。

実行

さっそくやってみます。


-> % sudo mysql.server start --log
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/XXXX-no-iMac.local.pid).
XXXX@XXXX-no-iMac [03:56:22] [/usr/local/Cellar/mysql/5.6.10/support-files] [master]


ダメでした。

原因調査

原因を調べます。


-> % sudo tail -f /usr/local/var/mysql/XXXX-no-iMac.local.err

131112 04:00:09 mysqld_safe Starting mysqld daemon with databases from /usr/local/var/mysql
2013-11-12 04:00:09 0 [ERROR] /usr/local/Cellar/mysql/5.6.10/bin/mysqld: ambiguous option '--log' (log-bin, log_slave_updates)
2013-11-12 04:00:09 0 [ERROR] Aborting


あれ、ambiguous optionと言われていますね。

公式ドキュメントを見ます。

MySQL 5.1.12 以降、--log または -l を指定する場合、--general-log オプションで最初の一般クエリ ログ状態を指定することも可能です。

「ことも可能」という表現が微妙ですが、これは試す価値がありそうです。

再挑戦

–general-log を使って再挑戦です。


> % sudo mysql.server start --general-log
Starting MySQL
. SUCCESS!


おお、できた。

SHOW VARIABLES; の結果を見ても、general_logがONになっています。

general_log_fileに示されているファイルをtailしてあげると、Macで実行されるクエリが吐出されるのが分かると思います。

終わりに

夜中に作業していて書き残したくなってしまってもう4時半。寝ます。

これで新しい記事が書けそうです。