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/pingmysql/stmt_preparemysql/stmt_executemysql/killmysql/statisticsmysql/set_optionmysql/reloadmysql/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"
}
}
]
}