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


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

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 追蹤器。