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/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"
}
}
]
}