MySQLのログファイル
デーモンとして動くプロセスはその出力をログファイルとして出力、保管するのが常ですが、MySQLのプロセスにももちろんその機能があります。MySQLには「ログ」と名の付くものがいくつかあり、今回はMySQLが出力する「ログファイルと名の付くもの」のいろいろを紹介します。
各ログの内容と関連するパラメータを以下に紹介します。バージョンは2017/05/11現在の最新版であるMySQL 5.7.18をターゲットとしていますが、文中のリファレンスマニュアルへのリンクは読みやすさを考えMySQL 5.6の日本語版へのリンクとしてあります。ただし、MySQL 5.7とそれ以降で追加されたパラメータに関しては、MySQL 5.7の英語版へのリンクです。
エラーログ
mysqld
の標準出力、標準エラー出力を向けた先のファイルです。エラーログとう名前ではありますが、前述の通り標準出力も含んでいるため実際のところはmysqld
プロセス全体のログです。
mysqld
プロセスそのものの異常の際にはここに情報が書かれますが、SQLのレベルでエラーになったことなどはここに出力されることはありません。たとえばSQLのシンタックスエラーやロック待ちのタイムアウトなどはアプリケーションレイヤーではエラーハンドルされるべきものですが、mysqld
プロセスから見ればそれらは通常の処理(SQLのバリデーション処理やタイムアウト処理)の正常な結果であるためです。これらの記録を取りたい場合はアプリケーション側でロギングをする必要があります。
主なパラメータはlog_error(エラーログ出力先)とlog_error_verbosity(ログレベル)があります。
スロークエリーログ
MySQLで実行されたクエリーのうち、インデックスが使われていない(パラメータlog_queries_not_using_indexで有効・無効を指定)または一定以上の時間(パラメータlong_query_timeで指定)がかかったクエリーを出力するファイルです。
なお、log_queries_not_using_indexやlong_query_timeによる時間の判定の他に、min_examined_row_limitでフィルタリングすることもできます。
パラメータslow_query_logで有効・無効を設定し、パラメータslow_query_log_fileで出力先のファイルを指定します。
ジェネラルログ
MySQLで実行されるクエリーを全て出力するためのファイルで、パラメータgeneral_logで有効・無効を、general_log_fileでファイル名を指定します。
スロークエリーログと違い、フィルタリングのための条件などはありません。また、スロークエリーログがクエリーを実行した後にロギングされる(クエリー実行処理の中にロギング処理がある)ことに対し、ジェネラルログはクエリーが受け取られた時点でロギングされる(SQLパース処理の中にロギング処理がある)などの違いがあります。
I/O量以上にジェネラルログをシリアライズするためのロックの粒度が非常に大きいため、MySQLパフォーマンスを大きく劣化させることがあります。デバッグ用のログと心得ましょう。
バイナリーログ
実行された更新クエリーを記録し、保管しておくファイルです。主にレプリケーションおよびポイントインタイムリカバリに利用します。
パラメータlog_binで有効・無効を切り替えます。バイナリーログはMySQLのデータそのものに関わるログであるため、データの記録の強さを調整するためのパラメータsync_binlogが用意されています。
また、パラメータbinlog_formatでロギング形式をROW(行ベース)またはSTATEMENT(ステートメントベース)に指定することができます。ロギング形式について詳しくは 第34回 行ベースレプリケーションの遅延についてを参照してください。
リレーログ
リレーログはバイナリーログと同じファイル形式を持つログです。バイナリーログが「実行済みの更新クエリーを記録」するのに対し、リレーログはレプリケーションスレーブが「マスターから受け取ったバイナリーログを一時的に保管」するためのものです。
レプリケーションスレーブは受け取ったバイナリーログをリレーログに保管し、リレーログから更新クエリーを取り出して自身のストレージに適用します。
リレーログに関するパラメータも存在しますが、多くの場合はデフォルトのまま変更する必要はないでしょう。
InnoDBログ
これまで紹介した4種類のログは全てMySQLそのものが備えているログ機構でしたが、InnoDBログは名前の通りInnoDBストレージエンジンの中に備えられた機構です。そのため、MySQL 5.6とそれ以前のバージョンでInnoDBを無効化したビルド(MySQL 5.7とそれ以降では無効化してビルドできなくなりました)の場合はログそのものが作成されません。
一般にInnoDBログと呼ばれるものはREDOログ(ib_logfile_*
)を指します。InnoDBにはUNDOログも存在しますが、デフォルトでは共有テーブルスペースファイル(ibdata1
)の中に格納されています。
ファイルそのものに関するパラメータinnodb_log_file_sizeなどの他、innodb_flush_log_at_trx_commitのようにどのようにInnoDBがREDOログに対して振る舞うかを設定するためのパラメータもあります。
その他のREDOログ
InnoDBと同じくトランザクションを備えるストレージエンジンとしてNDBCLUSTERストレージエンジン(MySQL Clusterで利用)があります。InnoDBログはInnoDBのためのREDOログであり、NDBCLUSTERはNDBCLUSTERの中でREDOログの実装を持っています。
サードパーティ製のストレージエンジンでもトランザクションをサポートするTokuDBストレージエンジン、MyRocksストレージエンジンなどはそれぞれ独自のREDOログを実装しています。これはプラガブルアーキテクチャのMySQLならではと言えるでしょう。
今回はMySQLのログファイルと名前のつくものを紹介しました。名前がログであってもその内容はヒューマンリーダブルなログであったり、トランザクションログと呼ばれるものであったりします。
なお本記事を書き出した時点では「back_logはログではない」というオチを考えていましたが、微妙な空気になりそうなので今回は遠慮しておこうと思います。