スマートスタイル TECH BLOG

データベース&クラウド技術情報

MySQL Shellで診断データを収集する

はじめに

MySQL Shell 8.0.29からutil.debug.collectDiagnostics() を使用して、MySQL Serverから診断データを収集できるようになりました。
本記事ではこちらの機能紹介を行います。なお、本記事で使用しているMySQL Server及び、MySQL Shellのバージョンは8.0.30となります。

機能紹介

要件

util.debug.collectDiagnostics() を使用する際の要件と制限は以下となります。

  • MySQL5.7以降であること
  • rootで実行すること

    使用方法

オプションを使用せずに実行する場合は、以下のようにzipファイル名のみを指定します。

例: util.debug.collectDiagnostics("test")

なお、ファイル名ではなくディレクトリを指定した場合は、指定したディレクトリにmysql-diagnostics-YYYYMMDD-HHMMSS.zipというファイル名で作成されます。

収集されるのはシステム変数やプロセスリストなどの一般的なステータス情報、performance_schemareplication_%テーブルからのレプリケーション関連情報、その他エラーログやプライマリキーがないテーブル情報などとなっています。

指定したディレクトリ(今回の場合はカレントディレクトリ)を確認するとzipファイルが作成されています。
解凍後のファイルはTSVとYAML形式がありますが、情報量に差異はありません。

これらの情報を取得するためのコマンドや、収集元テーブルの詳細は公式マニュアルのDefault Diagnostic Collectionをご参照ください。

なお、明記されていませんが、tables_without_a_PK(主キーが定義されていないテーブルの一覧)は、以下のクエリで情報が収集されていることが一般ログから確認できました。

オプション

いくつかのオプションを使用することで、追加で情報を取得できます。ただし、情報元は取得時にパフォーマンスに影響を及ぼすSHOW ENGINE INNODB MUTEXであったり、事前にスロークエリの出力先をテーブルにしておく必要があるmysql.slow_logであったりするため、ドキュメントをよく読んでから使用することを推奨します。

今回はslowQueriesオプションを有効にし、スロークエリログを収集する例を紹介します。

事前にlog_output=TABLE,slow_query_log=ONを設定しておく必要があります。これらが設定されていない場合、実行時にエラーとなります。

なお、log_outputはカンマ区切りで指定することでFILEとTABLE両方に出力することが可能です。(例: SET GLOBAL log_output='TABLE,FILE';)しかし、そのような設定になっている場合も上記のエラーで失敗しました。TABLEのみを設定する必要があるようです。

これらの設定を行った後にslowQueriesを有効にして診断データを収集すると、新たにスロークエリの収集が行われていることが確認できます。

診断データにはslow_logのファイルが作成されています。

replication_* テーブルについて

診断データではレプリケーションの情報は一般的によく使用されるSHOW REPLICA [SLAVE] STATUSではなく、performance_schema.replication_*から取得されています。

各テーブルの詳細は公式マニュアルの27.12.11 パフォーマンススキーマレプリケーションテーブルをご参照ください。
ここではSHOW REPLICA [SLAVE] STATUSでよく確認される項目について、どのテーブルで確認できるかを紹介します。

  • Replica_IO_Running/Slave_IO_Running
    replication_connection_statusSERVICE_STATEカラム

  • Replica_SQL_Running/Slave_SQL_Running
    replication_applier_status_by_coordinatorSERVICE_STATEカラム

  • Seconds_Behind_Master
    Seconds_Behind_Masterに対応する項目はありませんが、replication_applier_status_by_workerAPPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMPカラムは適用中のトランザクションがソースでコミットされた時間を示しているため、この時間と現在の時間の差分がレプリケーションの遅延秒数と言えます。

  • Last_IO_Error
    replication_connection_statusLAST_ERROR_MESSAGEカラム

  • Last_SQL_Error
    replication_applier_status_by_workerLAST_ERROR_MESSAGEカラム

  • Replica_SQL_Running_State/Slave_SQL_Running_State
    ドキュメントでは以下のように説明されており、performance_schemaから情報を得ることはできません。
    ただし、MySQL Shellの診断データにはPROCESSLISTも取得されているため、そちらの情報と組み合わせることで確認することができます。

Replica_IO_State および Replica_SQL_Running_State のフィールドは保持されません。 必要に応じて、適切なレプリケーションテーブルの THREAD_ID カラムを使用し、INFORMATION_SCHEMA.PROCESSLIST テーブルの ID カラムと結合して、プロセスリストからこれらの値を取得し、後者のテーブルの STATE カラムを選択できます。

引用元 : MySQL :: MySQL 8.0 リファレンスマニュアル :: 27.12.11 パフォーマンススキーマレプリケーションテーブル

まとめ

util.debug.collectDiagnostics() で収集できる情報について紹介しました。何かトラブルが発生した際に最初に確認したいようなデータが取得されており、収集用のクエリを個別に実行するよりも簡単に情報を取得できるようになっています。
収集されるデータはシステム変数のように頻繁に値が変更されないデータやerror_logのように累積して保持され続けるデータが多いため、毎分、毎時間の間隔で定期的に取得するという運用よりも、何か問題が発生した際に取得するという運用が向いていそうです。

Return Top