MySQL Router 9.0  /  部署 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_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-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:布林值。如果 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_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"
      }
    }
  ]
}