はじめに
皆さんご存知の通りMySQL8.0では多くの機能変更が施されています。その中の一つに「ステータス変数(SHOW GLOBAL STATUSで確認できるもの)」の追加・廃止があります。
本番環境でMySQL運用をされている方は、監視ツールもしくは独自のスクリプトなどで日々ステータス変数を収集しているかと思います。そんな中、8.0における変更内容を把握しておかないと従来作成していたグラフがエラーになる、または有用なステータス情報を見落としてしまう可能性があります。
そこで本稿ではMySQL5.7.29とMySQL8.0.19を比較して、8.0から追加された、もしくは廃止されたステータス変数について取り上げてみたいと思います。
追加されたステータス変数
一覧
変数名 |
---|
Acl_cache_items_count |
Caching_sha2_password_rsa_public_key |
Com_alter_resource_group |
Com_alter_user_default_role |
Com_clone |
Com_create_resource_group |
Com_create_role |
Com_create_spatial_reference_system |
Com_drop_resource_group |
Com_drop_role |
Com_drop_spatial_reference_system |
Com_grant_roles |
Com_import |
Com_install_component |
Com_lock_instance |
Com_restart |
Com_revoke_roles |
Com_set_password |
Com_set_resource_group |
Com_set_role |
Com_uninstall_component |
Com_unlock_instance |
Current_tls_ca |
Current_tls_capath |
Current_tls_cert |
Current_tls_cipher |
Current_tls_ciphersuites |
Current_tls_crl |
Current_tls_crlpath |
Current_tls_key |
Current_tls_version |
Innodb_sampled_pages_read |
Innodb_sampled_pages_skipped |
Innodb_system_rows_deleted |
Innodb_system_rows_inserted |
Innodb_system_rows_read |
Innodb_system_rows_updated |
Innodb_undo_tablespaces_active |
Innodb_undo_tablespaces_explicit |
Innodb_undo_tablespaces_implicit |
Innodb_undo_tablespaces_total |
Mysqlx_aborted_clients |
Mysqlx_address |
Mysqlx_bytes_received |
Mysqlx_bytes_received_compressed_payload |
Mysqlx_bytes_received_uncompressed_frame |
Mysqlx_bytes_sent |
Mysqlx_bytes_sent_compressed_payload |
Mysqlx_bytes_sent_uncompressed_frame |
Mysqlx_connection_accept_errors |
Mysqlx_connection_errors |
Mysqlx_connections_accepted |
Mysqlx_connections_closed |
Mysqlx_connections_rejected |
Mysqlx_crud_create_view |
Mysqlx_crud_delete |
Mysqlx_crud_drop_view |
Mysqlx_crud_find |
Mysqlx_crud_insert |
Mysqlx_crud_modify_view |
Mysqlx_crud_update |
Mysqlx_cursor_close |
Mysqlx_cursor_fetch |
Mysqlx_cursor_open |
Mysqlx_errors_sent |
Mysqlx_errors_unknown_message_type |
Mysqlx_expect_close |
Mysqlx_expect_open |
Mysqlx_init_error |
Mysqlx_messages_sent |
Mysqlx_notice_global_sent |
Mysqlx_notice_other_sent |
Mysqlx_notice_warning_sent |
Mysqlx_notified_by_group_replication |
Mysqlx_port |
Mysqlx_prep_deallocate |
Mysqlx_prep_execute |
Mysqlx_prep_prepare |
Mysqlx_rows_sent |
Mysqlx_sessions |
Mysqlx_sessions_accepted |
Mysqlx_sessions_closed |
Mysqlx_sessions_fatal_error |
Mysqlx_sessions_killed |
Mysqlx_sessions_rejected |
Mysqlx_socket |
Mysqlx_ssl_accepts |
Mysqlx_ssl_active |
Mysqlx_ssl_cipher |
Mysqlx_ssl_cipher_list |
Mysqlx_ssl_ctx_verify_depth |
Mysqlx_ssl_ctx_verify_mode |
Mysqlx_ssl_finished_accepts |
Mysqlx_ssl_server_not_after |
Mysqlx_ssl_server_not_before |
Mysqlx_ssl_verify_depth |
Mysqlx_ssl_verify_mode |
Mysqlx_ssl_version |
Mysqlx_stmt_create_collection |
Mysqlx_stmt_create_collection_index |
Mysqlx_stmt_disable_notices |
Mysqlx_stmt_drop_collection |
Mysqlx_stmt_drop_collection_index |
Mysqlx_stmt_enable_notices |
Mysqlx_stmt_ensure_collection |
Mysqlx_stmt_execute_mysqlx |
Mysqlx_stmt_execute_sql |
Mysqlx_stmt_execute_xplugin |
Mysqlx_stmt_get_collection_options |
Mysqlx_stmt_kill_client |
Mysqlx_stmt_list_clients |
Mysqlx_stmt_list_notices |
Mysqlx_stmt_list_objects |
Mysqlx_stmt_modify_collection_options |
Mysqlx_stmt_ping |
Mysqlx_worker_threads |
Mysqlx_worker_threads_active |
Performance_schema_session_connect_attrs_longest_seen |
Secondary_engine_execution_count |
各ステータス変数の解説
MySQL8.0のステータス変数に関する公式マニュアルはこちらにあります。
Acl_cache_items_count
キャッシュされた権限オブジェクトの数を示しています。ここでいう権限オブジェクトとは、ユーザとそこに付与されたアクティブなロールの組み合わせのことです。
ロールをかなり頻繁に使用する環境でもなければ、監視の必要性は低いでしょう。
Caching_sha2_password_rsa_public_key
MySQL8.0から実装された caching_sha2_password 認証ブラグインが、RSAキーペアベースのパスワード交換のために使用する公開鍵の内容が表示されます。
caching_sha2_password_public_key_pathシステム変数で指定した公開鍵ファイルが参照されます。
原則、監視する必要はないかと思います。
Com_*** 系
Com_xxx ステータス変数は、「xxx」に該当するコマンド(クエリ)がMySQL上で実行された回数(累積値)を示しています。
8.0から追加された新機能に関連するコマンドのカウンタが追加されていることが分かります。
→ Com_create_role, Com_clone, Com_alter_resource_group など
これらのコマンドは常日頃から実行されるものではないことが多いので、常時監視対象とする必要はないかもしれませんが、システムの特質によって頻繁に実行し得るコマンド(set passwordなど)がある場合は、変数の増分を監視した方が良いかと思います。
Current_tls_*** 系
サーバ・クライアント間のTLS通信を行っている場合に、そのステータス情報を表示します。
昨今のセキュリティを取り巻く情勢を踏まえ、MySQLの通信暗号化を利用するケースが増えていくことが予想されます。そうした場合に、設定が正常にできているか、正しく暗号化が動作しているかをこのステータス変数を使って確認してください。
ただし、動的に変わる変数はないので常時監視する必要性は薄いと思います。
Innodb_*** 系
「Innodb_」で始まるステータス変数は、その名の通りInnoDBストレージエンジンに関するステータスを扱っています。MySQL8.0ではInnoDBの大幅な機能改善がなされており、それに伴ってステータス変数も追加されています。
※ なお、下記2つのステータス変数が追加されたことは、リリースノートに記載があります
- Innodb_sampled_pages_read / Innodb_sampled_pages_skipped
MySQL8.0.19で追加されたステータス変数で、ヒストグラム統計のための効率的なサンプリングに関連しています。
従来のMySQLのサンプリング方式ではテーブル全体をスキャンする必要があり、巨大なテーブルではコストがかかっていました。そこで、InnoDBに実装されたサンプリングではテーブルスキャンを回避し、ヒストグラムの生成が容易になりました。
このステータス変数ではサンプリングの挙動をモニタリングできます。統計情報の挙動にシビアな環境では、監視してみても良いかと思います。
- Innodb_system_rows_read / inserted / deleted / updated
上記と同じくMySQL8.0.19で追加されました。8.0からMySQLが作成するシステムテーブルのストレージエンジンが全てInnoDBになりましたが、そのシステムテーブルに対する参照・挿入・削除操作の件数を表示するためのステータス変数です。
基本的にシステムテーブルへの操作は頻繁に行われるものではありませんが、「relay_log_info_repository or master_info_repository=TABLE」を設定している環境ではレプリケーションの情報がシステムテーブル(*1)に保存されるため、InnoDBテーブル関連のカウンタ(Innodb_rows_readなど)に影響が出てしまうケースがありました。
そこで、この新しいカウンタの数値を全体から引くことで、より現実的なステータス変数の監視が可能になりました。もし、監視ツールなどでInnoDB行への操作を可視化している場合は、全体から Innodb_system_rows_*** ステータス変数の数値を引いた方が良いでしょう。
*1 : slave_master_info, slave_replay_log_info, slave_worker_info テーブルを指します
- Innodb_undo_tablespaces_active / explicit / implicit / total
MySQL8.0から、Undoログの管理が非常にフレキシブルになりました(参考記事)。端的に言えばオンラインでUndoログの拡張・縮小が可能となり、MySQL8.0.14からはSQL(CREATE UNDO TABLESPACE)での操作もできるようになりました(参考記事)。
上記のようなUndoログの機能改善に伴い、ステータス変数も新たに追加されました。Innodb_undo_tablespaces_implicitはInnoDBが内部的に作成した数で、対するInnodb_undo_tablespaces_explicitはユーザが手動で作成した数を示しています。Innodb_undo_tablespaces_activeは両者のうちアクティブな領域を示しており、これを total から引くことで非アクティブな領域も算出できます。
Mysqlx_*** 系
Mysqlx_xxxステータス変数は、mysqlxプラグイン関連のステータス変数です。公式ドキュメントはこちらです。
mysqlxプラグインとは、従来のMySQLプロトコルでは対応できなかった操作を可能にする「Xプロトコル」を受け付けるための機能です。逆にクライアント側にはX DevAPIと呼ばれるAPIが用意され、Java, .Net, Node.js, Pythonなどがサポートされています。
Server側のmysqlxプラグインとクライアント側のX DevAPIを組み合わせることで、MySQLを「ドキュメントデータベース」として利用できます。即ち、従来のRDB用途ではなくMySQLをNoSQLとして扱い、JSON型などスキーマレスなデータを蓄積・処理することが実現できます。
※ 弊社ブログでも過去の記事で取り上げています
Xプロトコル自体はMySQL5.7で追加された機能でしたが、MySQL 8.0になって上記のMySQL Document Storeが正式にGAになったことで、多くのステータス変数が追加されました。
もしXプロトコルを実運用する場合は、これらのステータス変数を監視することを推奨します。
【主な変数】
- Mysqlx_bytes_received / Mysqlx_bytes_sent
mysqlxプラグインが受信・送信した累計のデータ量 - Mysqlx_connection_accept_errors / errors / accepted / closed / rejected
mysqlxプラグインへの接続・切断・接続エラーの件数 - Mysqlx_crud_***
mysqlxプラグイン上でのCRUD操作、すなわちCREATE、READ、UPDATE、DELETEの実行件数
ドキュメントデータベース上での操作を可視化するのに有効でしょう -
Mysqlx_stmt_***
CREATE COLLECTION
ステートメントやKILL CLIENT
ステートメントの実行件数
Performance_schema_session_connect_attrs_longest_seen
クライアントが、MySQLサーバのPerformance_Schemaに対して64KB以上の接続属性データを送信しようとした時に、サーバはそれを拒否します。この時、Performance_schema_session_connect_attrs_longest_seen変数に、その拒否されたデータのサイズが記録されます。
DBAは、このステータス変数の数値を見て、performance_schema_session_connect_attrs_size 変数の設定値を引き上げるか、どのクライアントが巨大なデータを送信しているのかを調査・改善することが推奨されます。
詳しくはマニュアルにも記載があります。
Secondary_engine_execution_count
MySQL8.0.13で追加されましたが、「For future use.」なので詳細不明です。
“セカンダリエンジン” なので、ストレージエンジンが複数設定できるようになるのでしょうか…?
廃止されたステータス変数
一覧
変数名 |
---|
Com_alter_db_upgrade |
Innodb_available_undo_logs |
Qcache_free_blocks |
Qcache_free_memory |
Qcache_hits |
Qcache_inserts |
Qcache_lowmem_prunes |
Qcache_not_cached |
Qcache_queries_in_cache |
Qcache_total_blocks |
各ステータス変数の解説
Com_alter_db_upgrade
ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME
コマンドの実行回数を表示します。MySQL8.0では “UPGRADE DATA DIRECTORY NAME” 句が使えなくなったため、同ステータス変数も削除されました。
Innodb_available_undo_logs
使用可能な InnoDB undo ログの数を示していましたが、上記の通りUndoログは動的な管理が可能になりましたので、このステータス変数も不要となります。
Qcache_***
クエリキャッシュ関連のステータス変数です。MySQL8.0ではクエリキャッシュ機能自体が無くなったため、ステータス変数も全て削除されました。
おわりに
今回紹介したステータス変数の変化だけを見ても、MySQL8.0が「大きなメジャーバージョンアップ」であることが分かります(一部はGA後に追加されたものですが…)。特にmysqlxプラグイン関連のステータス変更からは、今後ドキュメントストア機能を一層推し進めていきたいという意思を感じます。
また、MySQLの急速な変化に「自前の監視ツールの対応(改修)が追いつかない-!」とお悩みの方は、Oracle公式の監視ツール
「MySQL Enterprise Monitor」(通称:MEM)の導入を検討されては如何でしょうか?(ライセンスの購入は以下の “お問合わせ” からどうぞ!)
※ ただしMEM8.0も本記事執筆時点で、完全にMySQL8.0の新機能・ステータス変数をカバーしているわけではございません