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
:布林值。如果為false
,則沒有連線。如果為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"
}
}
]
}