Обмен технологиями

Описание трассировки сервера состояния сеанса клиента в 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 предоставляет пару функций:

  • 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 выполните две инструкции SET TRANSACTION, чтобы установить уровень изоляции и характеристики режима доступа для следующей транзакции. Значение SESSION_TRACK_TRANSACTION_CHARACTERISTICS указывает следующее установленное значение транзакции.

После оператора COMMIT, завершающего транзакцию, значение SESSION_TRACK_transaction_CHARACTERISTICS сообщается как пустое. Это означает, что свойства следующей транзакции, которые были установлены до начала транзакции, сбрасываются и применяются значения сеанса по умолчанию. Чтобы отслеживать изменения в этих настройках сеанса по умолчанию, отслеживайте значения сеанса системных переменных транзакции_inisolation и транзакции_read_only.

Чтобы просмотреть информацию о GTIDs, включите трекер SESSION_TRACK_GTIDs с помощью системной переменной SESSION_TRACK_GTIDs.