MariaDB 10.1の新機能を触っている時、(馬鹿げていると思うことの1つだが)一般ユーザはスロークエリログを無効にする方法が分からないのではないかと気づいた。
この機能を実装したりドキュメントを書いていて、色々なログの情報がバラバラになっていて、それらを有効にしたり無効にするのが意外と難しいのではないかとも思った。
これを解決するため、MariaDBのドキュメント(KB)に、MariaDBにもMySQLにも役立つだろうと思って「Overview of the MariaDB logs」というエントリを作った。
そのコピーがこの記事だ。コメントや追加して欲しい内容があれば、KBのエントリの方に意見を寄せて欲しい。たくさんの人の役に立つようにね!
MariaDBログの概要
MariaDBには、何をログに出すか、いつログに出すかを定義する、たくさんの変数がある。
この記事では、さまざまなログの概要を述べ、どのようにログを有効・無効にするかを説明する。
エラーログ
- 常に有効
- 基本的にはデータディレクトリ内のファイルに記録されるが、ディストリビューションによっては場所が変わっていることがある
- 全ての致命的エラーはここに記録される
- log_warningsを設定することで、警告レベルのログも記録できる
- mysqld_safeの--syslogオプションで、システムのsyslogにもメッセージを出すことができる
一般クエリログ
- --general-logで有効にできる
- ファイルあるいはテーブルに全てのクエリを保存できる
- クエリのデバッグや監査用途に便利
- super権限のあるユーザは、SQL_LOG_OFFを1にすることで、コネクション単位でログを無効にできる
スロークエリログ
- --slow-query-logを付けてmysqldを起動すると有効になる
- ファイルあるいはテーブルに全てのクエリを保存できる
- パフォーマンス問題の原因になっているクエリを見つけるのに便利
- long_query_time以上かかっているクエリをすべて保存する
- --log-slow-admin-statements、--log-slow-slave-statements、log_slow_filter、log_slow_rate_limitの各オプションで、何をログするかを設定できる
- log_slow_verbosityで、どのレベルを記録するかを変更できる
- global.slow_query_logを0に設定すると、システム全体で無効にできる
- 10.1では、local.slow_query_logを0に設定すると、コネクション単位で無効にできる
バイナリログ
- --log-binを付けてmysqldを起動すると有効になる
- 基本的には、レプリケーションのマスタになるマシンで有効にする
- 主にレプリケーションのために使われ、--binlog-ignore-db=database_nameや--binlog-do-db=database_nameを指定することもできる
- super権限のあるユーザは、SQL_LOG_BINを0にすることで、コネクション単位でログを無効にできる。これが0だと、そのコネクションで行われた変更はスレーブに複製されない
- Using and Maintaining the Binary Logに例がある
例
これから実行するクエリが遅いのが分かっていて、スロークエリログにそれを記録したくないなら
SET LOCAL SLOW_QUERY_LOG=0;
super権限のあるユーザでバッチジョブを実行していて、そのクエリを記録したくないなら(例えばmysqldumpを実行するなど)
SET LOCAL SQL_LOG_OFF=1, LOCAL SLOW_QUERY_LOG=0;
MariaDB 10.1のmysqldumpでは、--skip-log-queriesを付ければ自動で無効になる。