Compartilhamento de tecnologia

Descrição do rastreamento do servidor do estado da sessão do cliente no MySQL

2024-07-12

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

O servidor MySQL implementa vários rastreadores de estado de sessão. Os clientes podem ativar esses rastreadores para receber notificações de alterações no estado da sessão.

1 Objetivo do Rastreador de Estado de Sessão

Os rastreadores de estado de sessão atendem aos seguintes propósitos:

  • para facilitar a migração de sessão.
  • Facilita a troca de transações.

O mecanismo rastreador fornece uma maneira para os conectores MySQL e aplicativos clientes determinarem se algum contexto de sessão está disponível para permitir a migração de sessão de um servidor para outro. (Para alterar sessões em um ambiente com balanceamento de carga, é necessário detectar se existe um estado de sessão que precisa ser levado em consideração ao decidir se uma mudança é possível.)

O mecanismo rastreador permite que os aplicativos saibam quando as transações podem ser movidas de uma sessão para outra. O rastreamento do status da transação permite isso, o que é útil para aplicativos que desejam mover transações de um servidor ocupado para um servidor menos carregado. Por exemplo, um conector de balanceamento de carga que gerencia um conjunto de conexões de clientes pode mover transações entre sessões disponíveis no conjunto.

No entanto, a troca de sessão não pode ocorrer em nenhum momento. Se a sessão estiver no meio de uma transação que concluiu uma leitura ou gravação, mudar para uma sessão diferente significa que a transação na sessão original será revertida. Uma troca de sessão só pode ocorrer quando nenhuma operação de leitura ou gravação tiver sido executada na transação.

Exemplos de transações que podem mudar razoavelmente:

Além de entender o status da transação, você também pode entender as características da transação para poder usar as mesmas características quando a transação for movida para uma sessão diferente. As seguintes características estão associadas a isso:

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

2 rastreadores de estado de sessão disponíveis

Para dar suporte às atividades de rastreamento de sessão, podem ser fornecidas notificações para os seguintes tipos de informações de estado de sessão do cliente:

(1) Alterações nestas propriedades do estado da sessão do cliente:

  • Esquema padrão (banco de dados).
  • Valores específicos da sessão para variáveis ​​do sistema.
  • Variáveis ​​definidas pelo usuário.
  • Forma temporária.
  • Discurso preparado.

A variável de sistema session_track_state_change controla esse rastreador.

(2) Mude para o nome do esquema padrão. A variável de sistema session_track_schema controla esse rastreador.

(3) Altere o valor da sessão da variável do sistema. A variável de sistema session_track_system_variables controla esse rastreador. A permissão SENSITIVE_VARIABLES_OBSERVER é necessária para rastrear alterações nos valores de variáveis ​​​​sensíveis do sistema.

(4) GTID disponível. A variável de sistema session_track_gtids controla este rastreador.

(5) Informações sobre status e características da transação. A variável de sistema session_track_transaction_info controla esse rastreador.

Essas variáveis ​​de sistema permitem controlar quais notificações de alteração ocorrem, mas não fornecem uma maneira de acessar informações de notificação. A notificação ocorre dentro do protocolo cliente/servidor MySQL, que inclui informações do rastreador em pacotes OK para detectar alterações no estado da sessão.

Suporte ao rastreador de estado de sessão da API 3 C

Para permitir que aplicativos clientes extraiam informações de mudança de estado de pacotes OK retornados pelo servidor, a API C do MySQL fornece um par de funções:

  • mysql_session_track_get_first() obtém a primeira parte das informações de mudança de status recebidas do servidor.
  • mysql_session_track_get_next() obtém qualquer informação de mudança de estado restante recebida do servidor. Após uma chamada bem-sucedida para mysql_session_track_get_first(), esta função é chamada repetidamente enquanto o sucesso for retornado.

Suporte para rastreador de estado de sessão de 4 conjuntos de testes

O programa mysqltest possui os comandos disable_session_track_info e enable_sessionutrack_ininfo para controlar se ocorrem notificações do rastreador de sessão. Você pode usar esses comandos para visualizar notificações produzidas por instruções SQL na linha de comando. Suponha que um arquivo testscript contenha o seguinte script 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;

Execute o script da seguinte maneira para ver as informações fornecidas pelos rastreadores habilitados. .

  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

Antes da instrução START TRANSACTION, execute duas instruções SET TRANSACTION para definir o nível de isolamento e as características do modo de acesso para a próxima transação. O valor SESSION_TRACK_TRANSACTION_CHARACTERISTICS indica o próximo valor de transação que foi definido.

Após uma instrução COMMIT que finaliza uma transação, o valor SESSION_TRACK_transaction_CHARACTERISTICS é relatado como vazio. Isso significa que as próximas propriedades da transação que foram definidas antes do início da transação foram redefinidas e os padrões da sessão foram aplicados. Para rastrear alterações nesses padrões de sessão, rastreie os valores de sessão das variáveis ​​de sistema transaction_inisolation e transaction_read_only.

Para visualizar informações sobre GTIDs, ative o rastreador SESSION_TRACK_GTIDs usando a variável de sistema SESSION_TRACK_GTIDs.