MySQL Router 8.4  /  部署 MySQL Router  /  MySQL Router 設定追蹤

3.7 MySQL Router 設定追蹤

MySQL Router 支援追蹤陳述式,因為它們是由 MySQL Router 從用戶端處理到伺服器,以及對用戶端的回應。追蹤會以 JSON 格式傳回。

這有助於除錯、測試、應用程式連線比較等等。

組態

若要組態 ROUTER SET trace,您必須將下列內容新增至 MySQL Router 組態檔

  • max_idle_server_connections:新增至 DEFAULT 區段。此值必須設定為至少 1。

  • 下列值可以新增至 DEFAULT 區段,並套用至所有連線,或者您可以將它們新增至您想要詳細檢查的連線的個別 ROUTING: ... 區段。

    • client_ssl_mode:設定為 PREFERREDREQUIRED

    • server_ssl_mode:設定為 PREFERREDREQUIREDDISABLED

    • connection_sharing:設定為 1 以啟用連線共用。

例如

[DEFAULT]
max_idle_server_connections=64 

[routing:{...}]
client_ssl_mode=PREFERRED 
server_ssl_mode=PREFERRED
connection_sharing=1

啟用 ROUTER TRACE

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_timestart_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-gtidssession_track_gtids 未包含預期值。

    • session-track-state-changesession_track_state_change 未包含預期值。

    • session-track-transaction-infosession_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 DIAGNOSTICSLAST_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_codeERROR,則會顯示。

  • 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:

追蹤範例

簡易查詢轉送

下列範例顯示簡易查詢轉送的追蹤

  1. MySQL Router 收到查詢。

  2. MySQL Router 將查詢轉送至伺服器。

  3. MySQL Router 等待結果。

  4. 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"
      }
    }
  ]
}