MySQL Router 支援追蹤陳述式,因為它們是由 MySQL Router 從用戶端處理到伺服器,以及對用戶端的回應。追蹤會以 JSON 格式傳回。
這可以進行偵錯、測試、應用程式連線比較等等。
若要設定 ROUTER SET trace
,您必須將以下內容新增至 MySQL Router 組態檔
max_idle_server_connections
:新增至DEFAULT
區段。此值必須設定為至少 1。-
以下值可以新增至
DEFAULT
區段,並套用至所有連線,或者您可以將它們新增至您要詳細檢查的連線個別的ROUTING: ...
區段。client_ssl_mode
:設定為PREFERRED
或REQUIRED
。server_ssl_mode
:設定為PREFERRED
、REQUIRED
或DISABLED
。connection_sharing
:設定為 1 以啟用連線共享。
例如
[DEFAULT]
max_idle_server_connections=64
[routing:{...}]
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
connection_sharing=1
ROUTER TRACE 可以依據工作階段或依據陳述式,在 MySQL 用戶端的命令列上啟用。
-
依據工作階段啟用
ROUTER SET TRACE = 1;
-
依據工作階段停用
ROUTER SET TRACE = 0;
-
依據陳述式啟用
query_attributes router.trace 1;
-
依據陳述式停用
query_attributes router.trace 0;
追蹤會以 JSON 物件傳回,其中包含以下屬性
start_time
:表示跨距開始的日期和時間字串。end_time
:表示跨距結束的日期和時間字串。elapsed_in_span_us
:目前跨距所花費的微秒數。此值是end_time
減去start_time
。status_code
:表示已完成跨距的標準狀態碼。預設值為空白。name
:事件的名稱。attributes
:事件的屬性。-
events
:事件的陣列。這些包含以下內容timestamp
:日期和時間字串。name
:事件的名稱。attributes
:事件的屬性。
例如
> mysql --host=127.0.0.1 --port=6446 --show-warnings
> ROUTER SET trace = 1;
> SELECT @@port;
+--------+
| @@port |
+--------+
| 3306 |
+--------+
1 row in set, 1 warning (0,02 sec)
Note (code 4600): {
"start_time": "2023-03-23T15:31:08.052442Z",
"end_time": "2023-03-23T15:31:08.052653Z",
"elapsed_in_span_us": 211,
"name": "mysql/query",
"attributes": {
"mysql.sharing_blocked": false
},
"events": [
{
"timestamp": "2023-03-23T15:31:08.052444Z",
"name": "mysql/query_classify",
"attributes": {
"mysql.query.classification": "change_on_tracker"
}
},
{
"start_time": "2023-03-23T15:31:08.052455Z",
"end_time": "2023-03-23T15:31:08.052495Z",
"elapsed_in_span_us": 39,
"name": "mysql/connect_and_forward",
"attributes": {
"mysql.remote.is_connected": true,
"mysql.remote.endpoint": "localhost:3306",
"mysql.remote.connection_id": 17,
"db.name": ""
},
"events": [
{
"start_time": "2023-03-23T15:31:08.052458Z",
"end_time": "2023-03-23T15:31:08.052495Z",
"elapsed_in_span_us": 36,
"name": "mysql/forward"
}
]
},
{
"start_time": "2023-03-23T15:31:08.052623Z",
"end_time": "2023-03-23T15:31:08.052627Z",
"elapsed_in_span_us": 3,
"name": "mysql/response",
"attributes": {
"mysql.session.@@SESSION.statement_id": "84"
}
}
]
}
支援以下追蹤事件和屬性
-
mysql/query
-
MySQL Router 接收查詢。
屬性
mysql.sharing_blocked
:布林值。如果連線共享已封鎖,則會顯示mysql.sharing_blocked_by
以及封鎖共享的原因。-
mysql.sharing_blocked_by
:字串。顯示連線共享遭到封鎖的原因。這可以是下列其中一個值trx-state
:交易為作用中。trx-characteristics
:已設定交易狀態。例如,SET TRANSACTION READ ONLY
。some-state-changed
:工作階段處於無法復原的狀態。session-track-gtids
:session_track_gtids
不包含預期的值。session-track-state-change
:session_track_state_change
不包含預期的值。session-track-transaction-info
:session_track_state_change
不包含預期的值。
-
mysql/query_classify
-
描述 MySQL Router 如何在連線共享的內容中分析陳述式。
屬性
-
mysql.query.classification
:以下其中一項或多項的逗號分隔清單accept_session_state_from_session_tracker
:陳述式導致工作階段追蹤器傳回一個接受的通知。ignore_session_tracker_some_state_changed
:陳述式導致工作階段追蹤器傳回一個已忽略的通知。session_not_sharable_on_error
:諸如SET known_variable = 1, unknown_variable = 2
之類的陳述式可能會造成工作階段狀態變更,即使陳述式失敗也是如此。伺服器會回應錯誤,但沒有工作階段追蹤器,即使工作階段狀態已變更也一樣。session_not_sharable_on_success
:如果陳述式修改工作階段狀態,但工作階段追蹤器沒有回報,則設定。forbidden_function_with_connection_sharing
:陳述式包含無法使用連線共享的函數或關鍵字。例如GET DIAGNOSTICS
或LAST_INSERT_ID()
。forbidden_set_with_connection_sharing
:陳述式嘗試設定連線共享所需的工作階段追蹤器資訊。
-
-
mysql/connect_and_forward
-
屬性
-
mysql.remote.is_connected
:布林值。如果fale
,表示沒有連線。如果true
,則會傳回以下值mysql.remote.endpoint
:伺服器連線端點的名稱。mysql.remote.connection_id
:伺服器連線的連線 ID。db.name
:結構描述的名稱。
-
-
mysql/from_pool_or_connect
-
屬性
mysql.remote.candidates
:端點的逗號分隔清單。net.peer.name
:此連線在先前工作階段中連線到的端點主機名稱。net.peer.port
:此連線在先前工作階段中連線到的端點埠。
-
mysql/from_pool
-
屬性
mysql.error_message
:如果status_code
為ERROR
,則會顯示。mysql.remote.connection_id
:伺服器連線的連線 ID。
-
mysql/connect
-
屬性
net.peer.name
:端點的主機名稱。net.peer.port
:端點的埠。
-
mysql/authenticate
-
屬性
-
mysql.remote.needs_full_authentication
:布林值。如果需要完整交握 (true
),或者如果可以快速重設連線 (false
)。如果
true
,後面接著mysql/change_user
。如果false
,後面接著mysql/reset_connected
。
-
-
mysql/server_greeting
-
屬性
mysql.remote.connection_id
:伺服器連線的連線 ID。
-
mysql/client_greeting
-
屬性
db.name
:結構描述的名稱。
-
mysql/tls_connect
-
屬性
tls.version
:使用中的 TLS 版本。tls.cipher
:用於連線的 TLS 加密方式。tls.session_resused
:布林值。如果重複使用 TLS 工作階段,則為True
。
-
mysql/response
-
屬性
mysql.session.@@SESSION.*
:根據伺服器工作階段追蹤器變更的工作階段變數。mysql.session.transaction_state
:交易狀態的逗號分隔清單。mysql.session.transaction_characteristics
:還原交易狀態所需的陳述式。
-
mysql/set_var
-
屬性
mysql.session.@@SESSION.*
:在重新連線之後還原的工作階段變數。
以下事件具有與 mysql/query
相同的屬性
mysql/ping
mysql/stmt_prepare
mysql/stmt_execute
mysql/kill
mysql/statistics
mysql/set_option
mysql/reload
mysql/list_fields
以下事件沒有屬性
mysql/prepare_server_connection
:mysql/reset_connection
:mysql/greeting
:mysql/forward
:
簡單查詢轉送
以下範例顯示簡單轉送查詢的追蹤
MySQL Router 接收查詢。
MySQL Router 將查詢轉送到伺服器。
MySQL Router 等待結果。
MySQL Router 將結果轉送到用戶端。
$ mysql --host=127.0.0.1 --port=6446 --show-warnings
> ROUTER SET trace = 1;
> SELECT @@port;
+--------+
| @@port |
+--------+
| 3306 |
+--------+
1 row in set, 1 warning (0,02 sec)
Note (code 4600): {
"start_time": "2023-03-23T15:31:08.052442Z",
"end_time": "2023-03-23T15:31:08.052653Z",
"elapsed_in_span_us": 211,
"name": "mysql/query",
"attributes": {
"mysql.sharing_blocked": false
},
"events": [
{
"timestamp": "2023-03-23T15:31:08.052444Z",
"name": "mysql/query_classify",
"attributes": {
"mysql.query.classification": "accept_session_state_from_session_tracker"
}
},
{
"start_time": "2023-03-23T15:31:08.052455Z",
"end_time": "2023-03-23T15:31:08.052495Z",
"elapsed_in_span_us": 39,
"name": "mysql/connect_and_forward",
"attributes": {
"mysql.remote.is_connected": true,
"mysql.remote.endpoint": "localhost:3306",
"mysql.remote.connection_id": 17,
"db.name": ""
},
"events": [
{
"start_time": "2023-03-23T15:31:08.052458Z",
"end_time": "2023-03-23T15:31:08.052495Z",
"elapsed_in_span_us": 36,
"name": "mysql/forward"
}
]
},
{
"start_time": "2023-03-23T15:31:08.052623Z",
"end_time": "2023-03-23T15:31:08.052627Z",
"elapsed_in_span_us": 3,
"name": "mysql/response",
"attributes": {
"mysql.session.@@SESSION.statement_id": "84"
}
}
]
}