7.1.18 服务器跟踪客户端会话状态
MySQL 服务器实现了多个会话跟踪器。客户端可以启用这些跟踪器以接收会话状态变化的通知。
会话跟踪器有以下用途:
-
facilitate 会话迁移。
-
facilitate 交易切换。
跟踪机制为 MySQL 连接器和客户端应用程序提供了一种方式,以确定是否有会话上下文可用于从一个服务器到另一个服务器的会话迁移(在负载均衡环境中,需要检测是否有会话状态,以确定是否可以进行会话切换)。
跟踪机制允许应用程序知道何时可以将事务从一个会话移到另一个会话。事务状态跟踪使得这成为可能,这对那些可能想将事务从一个繁忙服务器移到另一个服务器的应用程序非常有用。例如,负载均衡连接器管理客户端连接池可以将事务移到连接池中的可用会话。
然而,会话切换不能在任意时间进行。如果会话正在进行事务,其中读取或写入操作已经执行,则切换到另一个会话将意味着原始会话的事务回滚。会话切换必须在事务中没有读取或写入操作时进行。
以下是一些可能切换事务的时刻:
-
在
START TRANSACTION
之后 -
在
COMMIT AND CHAIN
之后
此外,知道事务特征也很有用,以便在将事务移到另一个会话时使用相同的特征。以下特征是为了这个目的相关的:
READ ONLY
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT
为了支持会话跟踪活动,以下类型的客户端会话状态信息可用以通知:
-
客户端会话状态的这些属性变化:
-
默认架构(数据库)。
-
会话特定的系统变量值。
-
用户定义的变量。
-
临时表。
-
预先编译的语句。
session_track_state_change
系统变量控制跟踪器。 -
-
默认架构名称的更改。系统变量
session_track_schema
控制此跟踪器。 -
系统变量的会话值更改。系统变量
session_track_system_variables
控制此跟踪器。需要SENSITIVE_VARIABLES_OBSERVER
特权来跟踪敏感系统变量的值更改。 -
可用GTID列表。系统变量
session_track_gtids
控制此跟踪器。 -
事务状态和特征信息。系统变量
session_track_transaction_info
控制此跟踪器。
有关跟踪器相关系统变量的描述,请见第7.1.8节,“服务器系统变量”。这些系统变量允许控制哪些更改通知发生,但不提供访问通知信息的方式。通知在MySQL客户端/服务器协议中发生,该协议包括跟踪信息在OK包中,以便检测会话状态更改。
为了使客户端应用程序从服务器返回的OK包中提取状态更改信息,MySQL C API 提供了一对函数:
-
mysql_session_track_get_first()
从服务器接收到的状态更改信息的第一部分。见mysql_session_track_get_first()。 -
mysql_session_track_get_next()
从服务器接收到的任何剩余状态更改信息。调用mysql_session_track_get_first()
成功后,重复调用该函数直到它返回成功。见mysql_session_track_get_next()。
命令行工具mysqltest具有disable_session_track_info
和enable_session_track_info
命令,可以控制会话跟踪通知是否发生。您可以使用这些命令在命令行中查看SQL语句生产的通知。例如,文件testscript
包含以下mysqltest脚本:
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (i INT, f FLOAT);
--enable_session_track_info
SET @@SESSION.session_track_schema=ON;
SET @@SESSION.session_track_system_variables='*';
SET @@SESSION.session_track_state_change=ON;
USE information_schema;
SET NAMES 'utf8mb4';
SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ WRITE;
START TRANSACTION;
SELECT 1;
INSERT INTO test.t1 () VALUES();
INSERT INTO test.t1 () VALUES(1, RAND());
COMMIT;
使用以下脚本来查看启用的跟踪器提供的信息。关于mysqltest为各种跟踪器显示的Tracker:
信息的描述,请见mysql_session_track_get_first()。
$> mysqltest < testscript
DROP TABLE IF EXISTS test.t1;
CREATE TABLE test.t1 (i INT, f FLOAT);
SET @@SESSION.session_track_schema=ON;
SET @@SESSION.session_track_system_variables='*';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_system_variables
-- *
SET @@SESSION.session_track_state_change=ON;
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_state_change
-- ON
USE information_schema;
-- Tracker : SESSION_TRACK_SCHEMA
-- information_schema
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
SET NAMES 'utf8mb4';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_client
-- utf8mb4
-- character_set_connection
-- utf8mb4
-- character_set_results
-- utf8mb4
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
SET @@SESSION.session_track_transaction_info='CHARACTERISTICS';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- session_track_transaction_info
-- CHARACTERISTICS
-- Tracker : SESSION_TRACK_STATE_CHANGE
-- 1
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
--
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- ________
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ WRITE;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SET TRANSACTION READ WRITE;
START TRANSACTION;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
-- SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; START TRANSACTION READ WRITE;
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T_______
SELECT 1;
1
1
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T_____S_
INSERT INTO test.t1 () VALUES();
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T___W_S_
INSERT INTO test.t1 () VALUES(1, RAND());
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- T___WsS_
COMMIT;
-- Tracker : SESSION_TRACK_TRANSACTION_CHARACTERISTICS
--
-- Tracker : SESSION_TRACK_TRANSACTION_STATE
-- ________
ok
在START TRANSACTION
语句前,两个SET TRANSACTION
语句执行,设置下一个事务的隔离级别和访问模式特征。SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值表示已设置的下一个事务值。
在COMMIT
语句结束事务后,SESSION_TRACK_TRANSACTION_CHARACTERISTICS
值被报告为空。这表明在事务开始前设置的下一个事务特征已被重置,并且会应用会话默认值。要跟踪这些会话默认值的变化,跟踪transaction_isolation
和transaction_read_only
系统变量的会话值。
要查看GTID信息,请启用session_track_gtids
系统变量来启用SESSION_TRACK_GTIDS
跟踪器。