기술나눔

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 시스템 변수는 이 추적기를 제어합니다.

이러한 시스템 변수를 사용하면 어떤 변경 알림이 발생하는지 제어할 수 있지만 알림 정보에 액세스하는 방법은 제공되지 않습니다. 알림은 세션 상태의 변화를 감지하기 위해 OK 패킷에 추적기 정보를 포함하는 MySQL 클라이언트/서버 프로토콜 내에서 발생합니다.

3 C API 세션 상태 추적기 지원

클라이언트 애플리케이션이 서버에서 반환된 OK 패킷에서 상태 변경 정보를 추출할 수 있도록 MySQL C API는 다음과 같은 한 쌍의 기능을 제공합니다.

  • mysql_session_track_get_first()는 서버로부터 수신된 상태 변경 정보의 첫 번째 부분을 가져옵니다.
  • mysql_session_track_get_next()는 서버로부터 수신된 나머지 상태 변경 정보를 가져옵니다. mysql_session_track_get_first() 호출이 성공한 후 성공이 반환되는 동안 이 함수가 반복적으로 호출됩니다.

4가지 테스트 스위트 세션 상태 추적기 지원

mysqltest 프로그램에는 세션 추적기 알림 발생 여부를 제어하는 ​​비활성화_session_track_info 및 활성화_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 값이 비어 있는 것으로 보고됩니다. 이는 트랜잭션이 시작되기 전에 설정된 다음 트랜잭션 속성이 재설정되고 세션 기본값이 적용됨을 의미합니다. 이러한 세션 기본값의 변경 사항을 추적하려면 transaction_inisolation 및 transaction_read_only 시스템 변수의 세션 값을 추적하세요.

GTID에 대한 정보를 보려면 SESSION_TRACK_GTIDs 시스템 변수를 사용하여 SESSION_TRACK_GTIDs 추적기를 활성화하십시오.