Partage de technologie

Description du suivi du serveur de l'état de la session client dans MySQL

2024-07-12

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

Le serveur MySQL implémente plusieurs trackers d'état de session. Les clients peuvent permettre à ces trackers de recevoir des notifications de changements d'état de session.

1 Objectif du suivi de l'état de session

Les trackers d'état de session remplissent les objectifs suivants :

  • pour faciliter la migration de session.
  • Facilite le changement de transaction.

Le mécanisme de suivi permet aux connecteurs MySQL et aux applications client de déterminer si un contexte de session est disponible pour permettre la migration de session d'un serveur à un autre. (Pour changer de session dans un environnement à charge équilibrée, il est nécessaire de détecter s'il existe un état de session qui doit être pris en compte pour décider si un changement est possible.)

Le mécanisme de suivi permet aux applications de savoir quand les transactions peuvent être déplacées d'une session à une autre. Le suivi de l'état des transactions permet cela, ce qui est utile pour les applications qui souhaitent déplacer des transactions d'un serveur occupé vers un serveur moins chargé. Par exemple, un connecteur d'équilibrage de charge qui gère un pool de connexions client peut déplacer des transactions entre les sessions disponibles dans le pool.

Cependant, le changement de session ne peut avoir lieu à aucun moment. Si la session est au milieu d'une transaction qui a terminé une lecture ou une écriture, le passage à une autre session signifie que la transaction sur la session d'origine est annulée. Un changement de session ne peut se produire que lorsqu'aucune opération de lecture ou d'écriture n'a été effectuée au sein de la transaction.

Exemples de transactions qui pourraient raisonnablement changer :

En plus de comprendre le statut de la transaction, vous pouvez également comprendre les caractéristiques de la transaction afin de pouvoir utiliser les mêmes caractéristiques lorsque la transaction est déplacée vers une autre session. Les caractéristiques suivantes y sont associées :

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

2 trackers d'état de session disponibles

Pour prendre en charge les activités de suivi de session, des notifications peuvent être fournies pour les types suivants d'informations sur l'état de la session client :

(1) Modifications apportées à ces propriétés de l'état de la session client :

  • Schéma par défaut (base de données).
  • Valeurs spécifiques à la session pour les variables système.
  • Variables définies par l'utilisateur.
  • Formulaire temporaire.
  • Discours préparé.

La variable système session_track_state_change contrôle ce tracker.

(2) Remplacez le nom du schéma par défaut. La variable système session_track_schema contrôle ce tracker.

(3) Modifiez la valeur de session de la variable système. La variable système session_track_system_variables contrôle ce tracker. L'autorisation SENSITIVE_VARIABLES_OBSERVER est requise pour suivre les modifications des valeurs des variables système sensibles.

(4) GTID disponible. La variable système session_track_gtids contrôle ce tracker.

(5) Informations sur l'état et les caractéristiques de la transaction. La variable système session_track_transaction_info contrôle ce tracker.

Ces variables système permettent de contrôler les notifications de modification qui se produisent, mais ne fournissent pas de moyen d'accéder aux informations de notification. La notification se produit au sein du protocole client/serveur MySQL, qui inclut des informations de suivi dans les paquets OK afin de détecter les changements dans l'état de la session.

Prise en charge du suivi de l'état de session de l'API 3 C

Pour permettre aux applications clientes d'extraire les informations de changement d'état des paquets OK renvoyés par le serveur, l'API MySQL C fournit deux fonctions :

  • mysql_session_track_get_first() récupère la première partie des informations de changement d'état reçues du serveur.
  • mysql_session_track_get_next() récupère toutes les informations de changement d'état restantes reçues du serveur. Après un appel réussi à mysql_session_track_get_first(), cette fonction est appelée à plusieurs reprises tant que le succès est renvoyé.

Prise en charge du suivi de l'état de session de la suite de tests 4

Le programme mysqltest dispose des commandes Disable_session_track_info et Enable_sessionutrack_ininfo pour contrôler si les notifications du suivi de session se produisent. Vous pouvez utiliser ces commandes pour afficher les notifications produites par les instructions SQL à partir de la ligne de commande. Supposons qu'un fichier testscript contienne le script mysqltest suivant :

  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;

Exécutez le script comme suit pour voir les informations fournies par les trackers activés. .

  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

Avant l'instruction START TRANSACTION, exécutez deux instructions SET TRANSACTION pour définir les caractéristiques du niveau d'isolement et du mode d'accès pour la transaction suivante. La valeur SESSION_TRACK_TRANSACTION_CHARACTERISTICS indique la valeur de transaction suivante qui a été définie.

Après une instruction COMMIT qui termine une transaction, la valeur SESSION_TRACK_transaction_CHARACTERISTICS est signalée comme vide. Cela signifie que les propriétés de transaction suivantes qui ont été définies avant le démarrage de la transaction ont été réinitialisées et les valeurs par défaut de la session sont appliquées. Pour suivre les modifications apportées à ces valeurs par défaut de session, suivez les valeurs de session des variables système transaction_inisolation et transaction_read_only.

Pour afficher des informations sur les GTID, activez le tracker SESSION_TRACK_GTIDs à ​​l'aide de la variable système SESSION_TRACK_GTIDs.