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