概要
第16回 MySQLのエラーコードについてでは、MySQLのエラーをモニタリングすることの有用性を説明しています。
昔のMySQLはエラーはエラーログに出力されるかアプリケーション側に出力されるため、検知するための独自の仕組みを作ったりしていたかもしれません。最近のMySQLではPerformance_schemaを利用することで、MySQL単体でエラーをさまざまな角度で確認することができるようになっています。
今回は、そんなPerformance_schemaにあるエラー関連のテーブルを5つご紹介します。なお、今回利用している環境はCentOS 7で、MySQLのバージョンは8.0.23となります。
error_log
このテーブルはMySQLで起きたエラーログの内容が書き込まれます。カラムは上から時間(LOGGED)、THREAD_ID、優先度(PRIO)、エラーコード、サブシステム、データという構成になっています。優先度にはSystem、Error、Warning、Noteの4つが確認でき、通常のMySQLのエラーログと同じラベルが確認できます。
サブシステムはイベントが発生したサブシステムを確認するカラムで、ServerやInnoDB、Replなどの値が確認できます。たとえば、以下のエラーの場合semi-syncレプリケーションに関するエラーのため、サブシステムにはReplと表示されています。
このテーブルは固定サイズのメモリを確保し、必要に応じて、古いイベントが自動的に削除されます。また、ステータス変数を確認することで以下のerror_logテーブルに関する以下の内容を確認することができます。
- Error_log_buffered_bytes
- 現在利用しているerror_logテーブルのサイズ
- Error_log_buffered_events
- 現在存在しているerror_logテーブルのイベントの数(error_logテーブルの件数)
- Error_log_expired_events
- 領域を確保するために破棄されたイベントの数
- Error_log_latest_write
- 最後に書き込まれたエラーログの時間
このテーブルはSQLでエラーログを引くことができる点が魅力です。たとえば、制限などでSHELL操作ができない環境であったとしても、SQLが実行できればエラーログを確認することができます(※ただし、error_logテーブルへのSELECT権限は必要です)。また、SQLを工夫することで、時間だけを取り出してエラーを確認したり、GROUP BYをつかうことで各エラーの件数を確認することができます。
events_errors_summary_by_account_by_error
このテーブルは、アカウントごとのエラーを確認することができます。特定のエラーに関してどのユーザーで起こったか確認したいときに、便利なテーブルになります。
SUM_ERROR_RAISEDカラムに、該当のエラーが発生した回数が記録されていきます。そのため、通常ざっとエラーを確認する際はWHERE句でSUM_ERROR_RAISED <> 0
などで条件を絞って確認してください。筆者の場合ですと、SQL_MODEを変更したいときに既存で実行されるSQLを探す際に、このテーブルを使ってワーニング状態で出力されるアカウントを特定していました。
また、SQLを書き換えたあとはLAST_SEENを確認することで、改修が完了しているか確認することもできました。
events_errors_summary_by_host_by_error
このテーブルは、HOSTごとに発生しているエラーを確認することができます。HOST単位でエラーを確認したいときに利用します。
events_errors_summary_by_thread_by_error
このテーブルはTHREAD_ID単位で発生したエラーを確認することができます。Performance_schemaのevents_statements_historyのTHREAD_IDと組み合わせることで、エラーに該当SQLを特定できるか漏れしません。
ただし、events_statements_historyはテーブルがいっぱいになると古いものから削除されるため、必ず特定できるわけではありません。
events_errors_summary_global_by_error
このテーブルは発生したエラーの内容と件数を発生時間等を確認することができます。上の3つテーブルと違って、全体をサマリーした内容になっています。
まとめ
今回はMySQLのPerformance_schemaのエラーに関するテーブルを5つ紹介しました。エラーログだけでなく、Performance_schemaを利用することで、さまざまな角度でエラーを確認できることができます。
ヘルスチェックであったり、エラー調査の際には、ぜひこれらのテーブルを利用してみてください。