はじめに
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
というファイル名で作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
MySQL localhost:33060+ ssl JS > util.debug.collectDiagnostics("test") Collecting diagnostics information from mysqlx://root@localhost:33060... Copying shell log file... - Gathering tables without a PK... - Gathering replication_applier_configuration... - Gathering replication_applier_filters... - Gathering replication_applier_global_filters... - Gathering replication_applier_status... - Gathering replication_applier_status_by_coordinator... - Gathering replication_applier_status_by_worker... - Gathering replication_asynchronous_connection_failover... - Gathering replication_asynchronous_connection_failover_managed... - Gathering replication_connection_configuration... - Gathering replication_connection_status... - Gathering replication_group_member_stats... - Gathering replication_group_members... - Gathering persisted_variables... - Gathering SHOW BINARY LOGS... - Gathering SHOW SLAVE HOSTS... - Gathering SHOW MASTER STATUS... - Gathering SHOW GLOBAL STATUS... - Gathering SHOW PLUGINS... - Gathering global variables... - Gathering processlist... - Gathering error_log Collecting InnoDB Metrics - Gathering innodb_status... - Gathering innodb_metrics... Diagnostics information was written to test.zip |
収集されるのはシステム変数やプロセスリストなどの一般的なステータス情報、performance_schema
のreplication_%
テーブルからのレプリケーション関連情報、その他エラーログやプライマリキーがないテーブル情報などとなっています。
指定したディレクトリ(今回の場合はカレントディレクトリ)を確認するとzipファイルが作成されています。
解凍後のファイルはTSVとYAML形式がありますが、情報量に差異はありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# ls -l test.zip -rw-r--r--. 1 root root 432458 Sep 14 08:09 test.zip # unzip test.zip Archive: test.zip extracting: test/shell_info.yaml extracting: test/mysqlsh.log # ls -l test/ total 544 -rw-------. 1 root root 77880 Jan 1 1980 0.error_log.tsv -rw-------. 1 root root 25317 Jan 1 1980 0.global_variables.tsv -rw-------. 1 root root 42285 Jan 1 1980 0.global_variables.yaml -rw-------. 1 root root 48953 Jan 1 1980 0.innodb_metrics.tsv -rw-------. 1 root root 112667 Jan 1 1980 0.innodb_metrics.yaml -rw-------. 1 root root 5147 Jan 1 1980 0.innodb_status.tsv -rw-------. 1 root root 5406 Jan 1 1980 0.innodb_status.yaml -rw-------. 1 root root 31 Jan 1 1980 0.persisted_variables.tsv -rw-------. 1 root root 0 Jan 1 1980 0.persisted_variables.yaml -rw-------. 1 root root 8714 Jan 1 1980 0.processlist.tsv -rw-------. 1 root root 26020 Jan 1 1980 0.processlist.yaml -rw-------. 1 root root 218 Jan 1 1980 0.replication_applier_configuration.tsv -rw-------. 1 root root 229 Jan 1 1980 0.replication_applier_configuration.yaml -rw-------. 1 root root 74 Jan 1 1980 0.replication_applier_filters.tsv -rw-------. 1 root root 0 Jan 1 1980 0.replication_applier_filters.yaml -rw-------. 1 root root 53 Jan 1 1980 0.replication_applier_global_filters.tsv -rw-------. 1 root root 0 Jan 1 1980 0.replication_applier_global_filters.yaml -rw-------. 1 root root 549 Jan 1 1980 0.replication_applier_status_by_coordinator.tsv -rw-------. 1 root root 572 Jan 1 1980 0.replication_applier_status_by_coordinator.yaml -rw-------. 1 root root 1170 Jan 1 1980 0.replication_applier_status_by_worker.tsv -rw-------. 1 root root 3948 Jan 1 1980 0.replication_applier_status_by_worker.yaml -rw-------. 1 root root 83 Jan 1 1980 0.replication_applier_status.tsv -rw-------. 1 root root 89 Jan 1 1980 0.replication_applier_status.yaml -rw-------. 1 root root 55 Jan 1 1980 0.replication_asynchronous_connection_failover_managed.tsv -rw-------. 1 root root 0 Jan 1 1980 0.replication_asynchronous_connection_failover_managed.yaml -rw-------. 1 root root 63 Jan 1 1980 0.replication_asynchronous_connection_failover.tsv -rw-------. 1 root root 0 Jan 1 1980 0.replication_asynchronous_connection_failover.yaml -rw-------. 1 root root 504 Jan 1 1980 0.replication_connection_configuration.tsv -rw-------. 1 root root 565 Jan 1 1980 0.replication_connection_configuration.yaml -rw-------. 1 root root 736 Jan 1 1980 0.replication_connection_status.tsv -rw-------. 1 root root 768 Jan 1 1980 0.replication_connection_status.yaml -rw-------. 1 root root 359 Jan 1 1980 0.replication_group_member_stats.tsv -rw-------. 1 root root 0 Jan 1 1980 0.replication_group_member_stats.yaml -rw-------. 1 root root 116 Jan 1 1980 0.replication_group_members.tsv -rw-------. 1 root root 0 Jan 1 1980 0.replication_group_members.yaml -rw-------. 1 root root 173 Jan 1 1980 0.SHOW_BINARY_LOGS.tsv -rw-------. 1 root root 366 Jan 1 1980 0.SHOW_BINARY_LOGS.yaml -rw-------. 1 root root 14123 Jan 1 1980 0.SHOW_GLOBAL_STATUS.tsv -rw-------. 1 root root 27815 Jan 1 1980 0.SHOW_GLOBAL_STATUS.yaml -rw-------. 1 root root 171 Jan 1 1980 0.SHOW_MASTER_STATUS.tsv -rw-------. 1 root root 185 Jan 1 1980 0.SHOW_MASTER_STATUS.yaml -rw-------. 1 root root 2243 Jan 1 1980 0.SHOW_PLUGINS.tsv -rw-------. 1 root root 4094 Jan 1 1980 0.SHOW_PLUGINS.yaml -rw-------. 1 root root 43 Jan 1 1980 0.SHOW_SLAVE_HOSTS.tsv -rw-------. 1 root root 0 Jan 1 1980 0.SHOW_SLAVE_HOSTS.yaml -rw-------. 1 root root 30 Jan 1 1980 0.uri -rw-------. 1 root root 11916 Jan 1 1980 mysqlsh.log -rw-------. 1 root root 1194 Jan 1 1980 shell_info.yaml -rw-------. 1 root root 50 Jan 1 1980 tables_without_a_PK.tsv -rw-------. 1 root root 140 Jan 1 1980 tables_without_a_PK.yaml |
これらの情報を取得するためのコマンドや、収集元テーブルの詳細は公式マニュアルのDefault Diagnostic Collectionをご参照ください。
なお、明記されていませんが、tables_without_a_PK(主キーが定義されていないテーブルの一覧)は、以下のクエリで情報が収集されていることが一般ログから確認できました。
1 2 3 4 5 6 7 8 9 |
SELECT t.table_schema, t.table_name FROM information_schema.tables t LEFT JOIN information_schema.statistics s ON t.table_schema = s.table_schema AND t.table_name = s.table_name AND s.index_name = 'PRIMARY' WHERE s.index_name IS NULL AND t.table_type = 'BASE TABLE' AND t.table_schema NOT IN ('performance_schema' , 'sys', 'mysql', 'information_schema'); |
オプション
いくつかのオプションを使用することで、追加で情報を取得できます。ただし、情報元は取得時にパフォーマンスに影響を及ぼすSHOW ENGINE INNODB MUTEX
であったり、事前にスロークエリの出力先をテーブルにしておく必要があるmysql.slow_log
であったりするため、ドキュメントをよく読んでから使用することを推奨します。
今回はslowQueries
オプションを有効にし、スロークエリログを収集する例を紹介します。
事前にlog_output=TABLE
,slow_query_log=ON
を設定しておく必要があります。これらが設定されていない場合、実行時にエラーとなります。
1 2 |
MySQL localhost:33060+ ssl JS > util.debug.collectDiagnostics("test-slow" ,{slowQueries:true }) debug.collectDiagnostics: slowQueries option requires slow_query_log to be enabled and log_output to be set to TABLE (RuntimeError) |
なお、log_outputはカンマ区切りで指定することでFILEとTABLE両方に出力することが可能です。(例: SET GLOBAL log_output='TABLE,FILE';
)しかし、そのような設定になっている場合も上記のエラーで失敗しました。TABLEのみを設定する必要があるようです。
これらの設定を行った後にslowQueriesを有効にして診断データを収集すると、新たにスロークエリの収集が行われていることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
MySQL localhost:33060+ ssl JS > util.debug.collectDiagnostics("test-slow" ,{slowQueries:true }) Collecting diagnostics information from mysqlx://root@localhost:33060... Copying shell log file... - Gathering tables without a PK... - Gathering replication_applier_configuration... - Gathering replication_applier_filters... - Gathering replication_applier_global_filters... - Gathering replication_applier_status... - Gathering replication_applier_status_by_coordinator... - Gathering replication_applier_status_by_worker... - Gathering replication_asynchronous_connection_failover... - Gathering replication_asynchronous_connection_failover_managed... - Gathering replication_connection_configuration... - Gathering replication_connection_status... - Gathering replication_group_member_stats... - Gathering replication_group_members... - Gathering persisted_variables... - Gathering SHOW BINARY LOGS... - Gathering SHOW SLAVE HOSTS... - Gathering SHOW MASTER STATUS... - Gathering SHOW GLOBAL STATUS... - Gathering SHOW PLUGINS... - Gathering global variables... - Gathering slow_log... <--- slow_logの収集 - Gathering processlist... - Gathering error_log Collecting InnoDB Metrics - Gathering innodb_status... - Gathering innodb_metrics... Diagnostics information was written to test-slow.zip |
診断データにはslow_logのファイルが作成されています。
1 2 |
# ls test-slow/0.slow_log.* test-slow/0.slow_log.tsv test-slow/0.slow_log.yaml |
replication_* テーブルについて
診断データではレプリケーションの情報は一般的によく使用されるSHOW REPLICA [SLAVE] STATUS
ではなく、performance_schema.replication_*
から取得されています。
各テーブルの詳細は公式マニュアルの27.12.11 パフォーマンススキーマレプリケーションテーブルをご参照ください。
ここではSHOW REPLICA [SLAVE] STATUS
でよく確認される項目について、どのテーブルで確認できるかを紹介します。
-
Replica_IO_Running/Slave_IO_Running
replication_connection_statusのSERVICE_STATE
カラム -
Replica_SQL_Running/Slave_SQL_Running
replication_applier_status_by_coordinatorのSERVICE_STATE
カラム -
Seconds_Behind_Master
Seconds_Behind_Masterに対応する項目はありませんが、replication_applier_status_by_workerのAPPLYING_TRANSACTION_ORIGINAL_COMMIT_TIMESTAMP
カラムは適用中のトランザクションがソースでコミットされた時間を示しているため、この時間と現在の時間の差分がレプリケーションの遅延秒数と言えます。 -
Last_IO_Error
replication_connection_statusのLAST_ERROR_MESSAGE
カラム -
Last_SQL_Error
replication_applier_status_by_workerのLAST_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のように累積して保持され続けるデータが多いため、毎分、毎時間の間隔で定期的に取得するという運用よりも、何か問題が発生した際に取得するという運用が向いていそうです。