文档首页
MySQL 8.4 参考手册
8.4 中文镜像

MySQL 8.4 参考手册 · 中文镜像

正文为中文,英文原文默认隐藏。点击任意中文段落即可展开 / 收起对应英文原文。

打开官方英文原文 ↗

译文由机器翻译生成,仅供理解参考;有疑问请以官方英文原文为准。

MySQL 8.4 参考手册 / 7 MySQL 服务器管理 / 7.1 MySQL 服务器 / 7.1.18 服务器跟踪客户端会话状态
中文点击中文段落可显示 / 隐藏英文原文本页译文覆盖 100%

7.1.18 服务器跟踪客户端会话状态7.1.18 Server Tracking of Client Session State

MySQL 服务器实现了几个会话状态跟踪器。客户端可以启用这些跟踪器以接收其会话状态更改的通知。The MySQL server implements several session state trackers. A client can enable these trackers to receive notification of changes to its session state.

会话状态跟踪器的用途Uses for Session State Trackers

会话状态跟踪器具有如下用途:Session state trackers have uses such as these:

  • 用于促进会话迁移。To facilitate session migration.

  • 用于促进事务切换。To facilitate transaction switching.

跟踪器机制为 MySQL 连接器和客户端应用程序提供了一种方法,以确定是否有任何会话上下文可用,从而允许会话从一个服务器迁移到另一个服务器。(在负载均衡环境中更改会话时,需要检测是否存在会话状态,以便在决定是否可以进行切换时加以考虑。)The tracker mechanism provides a means for MySQL connectors and client applications to determine whether any session context is available to permit session migration from one server to another. (To change sessions in a load-balanced environment, it is necessary to detect whether there is session state to take into consideration when deciding whether a switch can be made.)

跟踪器机制允许应用程序知道事务何时可以从一个会话移动到另一个会话。事务状态跟踪实现了这一点,这对于希望将事务从繁忙服务器移动到负载较轻的服务器的应用程序非常有用。例如,管理客户端连接池的负载均衡连接器可以在池中的可用会话之间移动事务。The tracker mechanism permits applications to know when transactions can be moved from one session to another. Transaction state tracking enables this, which is useful for applications that may wish to move transactions from a busy server to one that is less loaded. For example, a load-balancing connector managing a client connection pool could move transactions between available sessions in the pool.

然而,会话切换不能在任意时间进行。如果一个会话正在进行一个已经执行了读取或写入操作的事务,切换到另一个会话意味着原会话的事务将回滚。只有当事务尚未执行任何读取或写入操作时,才能进行会话切换。However, session switching cannot be done at arbitrary times. If a session is in the middle of a transaction for which reads or writes have been done, switching to a different session implies a transaction rollback on the original session. A session switch must be done only when a transaction does not yet have any reads or writes performed within it.

事务可能合理切换的示例:Examples of when transactions might reasonably be switched:

除了了解事务状态之外,了解事务特性也很有用,以便在将事务移动到不同会话时使用相同的特性。以下特性与此目的相关:In addition to knowing transaction state, it is useful to know transaction characteristics, so as to use the same characteristics if the transaction is moved to a different session. The following characteristics are relevant for this purpose:

READ ONLY
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT

可用的会话状态跟踪器Available Session State Trackers

为了支持会话跟踪活动,针对以下类型的客户端会话状态信息提供通知:To support the session-tracking activities, notification is available for these types of client session state information:

有关跟踪器相关系统变量的描述,请参见 第 7.1.8 节,“服务器系统变量”。这些系统变量允许控制发生哪些更改通知,但不提供访问通知信息的方式。通知发生在 MySQL 客户端/服务器协议中,该协议在 OK 包中包含跟踪器信息,以便能够检测会话状态的变化。For descriptions of the tracker-related system variables, see Section 7.1.8, “Server System Variables”. Those system variables permit control over which change notifications occur, but do not provide a way to access notification information. Notification occurs in the MySQL client/server protocol, which includes tracker information in OK packets so that session state changes can be detected.

C API 会话状态跟踪支持C API Session State Tracker Support

为了使客户端应用程序能够从服务器返回的 OK 包中提取状态更改信息,MySQL C API 提供了一对函数:To enable client applications to extract state-change information from OK packets returned by the server, the MySQL C API provides a pair of functions:

测试套件会话状态跟踪器支持Test Suite Session State Tracker Support

mysqltest 程序具有 disable_session_track_info 和 enable_session_track_info 命令,用于控制会话跟踪器通知是否发生。您可以使用这些命令从命令行查看 SQL 语句生成的通知。假设文件 testscript 包含以下 mysqltest 脚本:The mysqltest program has disable_session_track_info and enable_session_track_info commands that control whether session tracker notifications occur. You can use these commands to see from the command line what notifications SQL statements produce. Suppose that a file testscript contains the following mysqltest script:

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()。Run the script as follows to see the information provided by the enabled trackers. For a description of the Tracker: information displayed by mysqltest for the various trackers, see 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 值指示已设置的下一事务值。Preceding the START TRANSACTION statement, two SET TRANSACTION statements execute that set the isolation level and access mode characteristics for the next transaction. The SESSION_TRACK_TRANSACTION_CHARACTERISTICS value indicates those next-transaction values that have been set.

在结束事务的COMMIT语句之后,SESSION_TRACK_TRANSACTION_CHARACTERISTICS的值会显示为空。这表明在事务开始之前设置的下一事务特性已被重置,并且会话默认值生效。要跟踪这些会话默认值的变化,请跟踪transaction_isolation和transaction_read_only系统变量的会话值。Following the COMMIT statement that ends the transaction, the SESSION_TRACK_TRANSACTION_CHARACTERISTICS value is reported as empty. This indicates that the next-transaction characteristics that were set preceding the start of the transaction have been reset, and that the session defaults apply. To track changes to those session defaults, track the session values of the transaction_isolation and transaction_read_only system variables.

要查看有关 GTID 的信息,请使用 session_track_gtids 系统变量启用 SESSION_TRACK_GTIDS 跟踪器。To see information about GTIDs, enable the SESSION_TRACK_GTIDS tracker using the session_track_gtids system system variable.