技術共有

MySQL でのクライアント セッション状態のサーバー トレースの説明

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

MySQL サーバーは、いくつかのセッション状態トラッカーを実装しています。クライアントは、これらのトラッカーがセッション状態の変更の通知を受信できるようにすることができます。

1 セッション状態トラッカーの目的

セッション状態トラッカーは次の目的に役立ちます。

  • セッションの移行を容易にするため。
  • トランザクションの切り替えを容易にします。

トラッカー メカニズムは、MySQL コネクタとクライアント アプリケーションが、あるサーバーから別のサーバーへのセッションの移行を可能にするセッション コンテキストが利用可能かどうかを判断する方法を提供します。 (負荷分散された環境でセッションを変更するには、切り替えが可能かどうかを判断する際に考慮する必要があるセッション状態があるかどうかを検出する必要があります。)

トラッカー メカニズムにより、アプリケーションはトランザクションがあるセッションから別のセッションにいつ移動できるかを知ることができます。トランザクション ステータスの追跡によりこれが可能になるため、トランザクションを負荷の高いサーバーから負荷の低いサーバーに移動するアプリケーションに役立ちます。たとえば、クライアント接続のプールを管理する負荷分散コネクタは、プール内の利用可能なセッション間でトランザクションを移動できます。

ただし、セッションの切り替えはいつでも実行できるわけではありません。セッションが読み取りまたは書き込みを完了したトランザクションの途中にある場合、別のセッションに切り替えることは、元のセッションのトランザクションがロールバックされることを意味します。セッションの切り替えは、トランザクション内で読み取りまたは書き込み操作が実行されていない場合にのみ発生します。

合理的に切り替えられる可能性のあるトランザクションの例:

トランザクションのステータスを理解するだけでなく、トランザクションの特性も理解できるため、トランザクションが別のセッションに移動されたときに同じ特性を使用できます。これには次の特性が関係しています。

  1. READ ONLY
  2. READ WRITE
  3. ISOLATION LEVEL
  4. WITH CONSISTENT SNAPSHOT

2 利用可能なセッション状態トラッカー

セッション追跡アクティビティをサポートするために、次の種類のクライアント セッション状態情報の通知を提供できます。

(1) クライアント セッション状態の次のプロパティの変更:

  • デフォルトのスキーマ (データベース)。
  • システム変数のセッション固有の値。
  • ユーザー定義変数。
  • 一時的なフォーム。
  • 準備されたスピーチ。

session_track_state_change システム変数は、このトラッカーを制御します。

(2) デフォルトのスキーマ名に変更します。 session_track_schema システム変数は、このトラッカーを制御します。

(3) システム変数のセッション値を変更します。 session_track_system_variables システム変数は、このトラッカーを制御します。機密システム変数の値の変更を追跡するには、SENSITIVE_VARIABLES_OBSERVER 権限が必要です。

(4) 利用可能な GTID。 session_track_gtids システム変数は、このトラッカーを制御します。

(5) 取引の状況及び特徴に関する情報。 session_track_transaction_info システム変数は、このトラッカーを制御します。

これらのシステム変数を使用すると、どの変更通知を発生させるかを制御できますが、通知情報にアクセスする方法は提供されません。通知は MySQL クライアント/サーバー プロトコル内で行われ、セッション状態の変化を検出するために OK パケットにトラッカー情報が含まれます。

3 C API セッション状態トラッカーのサポート

クライアント アプリケーションがサーバーから返された OK パケットから状態変更情報を抽出できるようにするために、MySQL C API は次の 1 組の関数を提供します。

  • mysql_session_track_get_first() は、サーバーから受信したステータス変更情報の最初の部分を取得します。
  • mysql_session_track_get_next() は、サーバーから受信した残りの状態変更情報を取得します。 mysql_session_track_get_first() の呼び出しが成功した後、成功が返される限り、この関数は繰り返し呼び出されます。

4 テスト スイートのセッション状態トラッカーのサポート

mysqltest プログラムには、セッション トラッカー通知が発生するかどうかを制御する disable_session_track_info およびenable_sessionutrack_ininfo コマンドがあります。これらのコマンドを使用すると、コマンド ラインから SQL ステートメントによって生成された通知を表示できます。ファイル testscript に次の mysqltest スクリプトが含まれているとします。

  1. DROP TABLE IF EXISTS test.t1;
  2. CREATE TABLE test.t1 (i INT, f FLOAT);
  3. --enable_session_track_info
  4. SET @@SESSION.session_track_schema=ON;
  5. SET @@SESSION.session_track_system_variables='*';
  6. SET @@SESSION.session_track_state_change=ON;
  7. USE information_schema;
  8. SET NAMES 'utf8mb4';
  9. SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
  10. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  11. SET TRANSACTION READ WRITE;
  12. START TRANSACTION;
  13. SELECT 1;
  14. INSERT INTO test.t1 () VALUES();
  15. INSERT INTO test.t1 () VALUES(1, RAND());
  16. COMMIT;

次のようにスクリプトを実行して、有効なトラッカーによって提供される情報を確認します。 。

  1. $> mysqltest < testscript
  2. DROP TABLE IF EXISTS test.t1;
  3. CREATE TABLE test.t1 (i INT, f FLOAT);
  4. SET @@SESSION.session_track_schema=ON;
  5. SET @@SESSION.session_track_system_variables='*';
  6. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  7. -- session_track_system_variables
  8. -- *
  9. SET @@SESSION.session_track_state_change=ON;
  10. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  11. -- session_track_state_change
  12. -- ON
  13. USE information_schema;
  14. -- Tracker : SESSION_TRACK_SCHEMA
  15. -- information_schema
  16. -- Tracker : SESSION_TRACK_STATE_CHANGE
  17. -- 1
  18. SET NAMES 'utf8mb4';
  19. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  20. -- character_set_client
  21. -- utf8mb4
  22. -- character_set_connection
  23. -- utf8mb4
  24. -- character_set_results
  25. -- utf8mb4
  26. -- Tracker : SESSION_TRACK_STATE_CHANGE
  27. -- 1
  28. SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
  29. -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
  30. -- session_track_transaction_info
  31. -- CHARACTERISTICS
  32. -- Tracker : SESSION_TRACK_STATE_CHANGE
  33. -- 1
  34. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  35. --
  36. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  37. -- ________
  38. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  39. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  40. -- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  41. SET TRANSACTION READ WRITE;
  42. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  43. -- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION READ WRITE;
  44. START TRANSACTION;
  45. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  46. -- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION READ WRITE;
  47. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  48. -- T_______
  49. SELECT 1;
  50. 1
  51. 1
  52. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  53. -- T_____S_
  54. INSERT INTO test.t1 () VALUES();
  55. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  56. -- T___W_S_
  57. INSERT INTO test.t1 () VALUES(1, RAND());
  58. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  59. -- T___WsS_
  60. COMMIT;
  61. -- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
  62. --
  63. -- Tracker : SESSION_TRACK_TRANSACTION_STATE
  64. -- ________
  65. ok

START TRANSACTION ステートメントの前に、2 つの SET TRANSACTION ステートメントを実行して、次のトランザクションの分離レベルとアクセス モード特性を設定します。 SESSION_TRACK_TRANSACTION_CHARACTERISTICS 値は、設定された次のトランザクション値を示します。

トランザクションを終了する COMMIT ステートメントの後、SESSION_TRACK_transaction_CHARACTERISTICS 値は空として報告されます。これは、トランザクションの開始前に設定された次のトランザクション プロパティがリセットされ、セッションのデフォルトが適用されることを意味します。これらのセッションのデフォルトへの変更を追跡するには、transaction_inisolation およびtransaction_read_only システム変数のセッション値を追跡します。

GTID に関する情報を表示するには、SESSION_TRACK_GTIDs システム変数を使用して SESSION_TRACK_GTIDs トラッカーを有効にします。