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
可以在 MySQL 客户端的命令行上为每个会话或每个语句启用 ROUTER TRACE。
-
为每个会话启用
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"
}
}
]
}