文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  伺服器追蹤用戶端連線狀態

7.1.18 伺服器追蹤用戶端連線狀態

MySQL 伺服器實作了數個連線狀態追蹤器。用戶端可以啟用這些追蹤器來接收其連線狀態變更的通知。

連線狀態追蹤器的用途

連線狀態追蹤器具有如下用途

  • 促進連線移轉。

  • 促進交易切換。

追蹤器機制提供一種方法,讓 MySQL 連接器和用戶端應用程式判斷是否有任何連線內容可用,以允許從一個伺服器到另一個伺服器的連線移轉。(若要在負載平衡環境中變更連線,必須偵測是否有連線狀態需要考慮,才能決定是否可以進行切換。)

追蹤器機制允許應用程式知道何時可以將交易從一個連線移動到另一個連線。交易狀態追蹤可以啟用此功能,這對於可能希望將交易從忙碌的伺服器移動到負載較低的伺服器的應用程式很有用。例如,管理用戶端連線池的負載平衡連接器可以在池中可用的連線之間移動交易。

但是,連線切換不能在任意時間完成。如果連線正在進行已執行讀取或寫入的交易,則切換到不同的連線表示原始連線上的交易回滾。連線切換只能在交易內尚未執行任何讀取或寫入時完成。

可能合理切換交易的時間範例

除了知道交易狀態之外,了解交易特性也很有用,以便在將交易移動到不同的連線時使用相同的特性。以下特性與此目的相關

READ ONLY
READ WRITE
ISOLATION LEVEL
WITH CONSISTENT SNAPSHOT

可用的連線狀態追蹤器

為了支援連線追蹤活動,可針對以下類型的用戶端連線狀態資訊提供通知

有關追蹤器相關系統變數的說明,請參閱 第 7.1.8 節,「伺服器系統變數」。這些系統變數允許控制發生哪些變更通知,但不提供存取通知資訊的方法。通知發生在 MySQL 用戶端/伺服器協定中,該協定在 OK 封包中包含追蹤器資訊,以便可以偵測到連線狀態變更。

C API 連線狀態追蹤器支援

為了讓客戶端應用程式能夠從伺服器回傳的 OK 封包中提取狀態變更資訊,MySQL C API 提供了一對函式:

測試套件會話狀態追蹤器支援

mysqltest 程式具有 disable_session_track_infoenable_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_isolationtransaction_read_only 系統變數的會話值。

若要查看有關 GTID 的資訊,請使用 session_track_gtids 系統變數啟用 SESSION_TRACK_GTIDS 追蹤器。