はじめに
MySQLのエラーログについて学習したことを簡単にまとめます。
検証に使用した環境
DB:MySQL8.0
エラーログとは
MySQL上で検知したエラーがロギングされます。
エラーログでは、サーバーの実行中に発生したエラーだけでなく、
起動・停止中も含み、エラー、警告、またノートなどの診断メッセージも出力されます。
コンポーネント
エラーログでは、MySQLのコンポーネントアーキテクチャを使用しています。
そのため、コンポーネントを選択して任意の構成にすることができます。
コンポーネントには、以下の2つの種類から複数存在します。
・ログイベントのフィルタリングするコンポーネント(フィルタ)
・フィルタリング結果を書込むコンポーネント(シンク)
フィルタ
エラーログイベントをフィルタリングをするコンポーネントです。
イベントフィールドを追加、削除または変更したり、イベント全体を削除して実現しています。
結果のイベントは、有効なコンポーネントのリスト内の次のログコンポーネントに渡されます。
シンク
ログイベントの宛先 (ライター) です。
通常、シンクはログイベントを特定の形式のログメッセージに処理し、ファイルやシステムログなどに書き込みます。
シンクは、パフォーマンススキーマのerror_logテーブルに書き込むこともできます。
コンポーネントベースによるメリット
・ログイベントをフィルタし、ロギングする内容を絞れます
・複数のシンクコンポーネントを有効にし、複数のログに出力できます
・デフォルトのエラーログ形式も組込みフィルタとシンクコンポーネントを組み合せて実装されています
・シンクを変更、または追加して、JSON形式の出力が可能
・シンクを変更、または追加して、システムログにも出力できます
システム変数
log-error
ログファイルの出力先を指定します。
指定されていない場合、デフォルトはコンソールに出力されます。
また、ファイル名を指定しなかった場合、「host_name」.errとなります。
log_error_services
有効にするコンポーネントを制御します。
変数には、セミコロンまたはカンマで区切りのリスト形式で複数のコンポーネントを指定することができます。
※サーバーはリストで指定した順番にコンポーネントを実行するため、コンポーネントの指定順は重要
log_error_verbosity
冗長性フィルタリングといって、ロギングする内容を3段階で指定します。
設定値は1〜3を指定します。
1: ERROR
2: ERROR, WARNING
3: ERROR, WARNING, INFORMATION
2以上を指定すると、安全でないステートメントに関するメッセージがロギングされ、
3を指定すると、接続の中断や、接続のアクセス拒否エラーもロギングされるようになります。
そのため、レプリケーションを使用している場合は2以上を設定することが推奨されています。
また、中には冗長性フィルタリングの対象外となるSYSTEMのメッセージもあり、「System」というラベルが付けられてロギングされます。
※シンクによって差異あり。
log_error_suppression_list
WARNINGまたはINFORMATIONの優先度で発生したイベントで抑制したいもののエラーコードをリスト形式で指定します。
これにより、よく出力されるが関心がない警告などの出力を抑制できます。
※優先度がERRORまたはSYSTEMのメッセージは抑制できません。
デフォルトの構成
下記の通り、デフォルトではフィルタに「log_filter_internal」、シンクに「log_sink_internal」が指定されています。
mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
1 row in set (0.01 sec)
テーブル出力
MySQL8.0.22以降で、かつシンクにlog_sink_internal、log_sink_jsonを使用している場合、
パフォーマンススキーマのerror_logテーブルにもされます。
参考文献