29.12.9 Performance Schema Connection Attribute 表
连接属性是应用程序可以在连接时传递给服务器的键值对。对于基于C API的客户端库(libmysqlclient),mysql_options()
和mysql_options4()
函数定义了连接属性集。其他MySQL连接器可能提供自己的属性定义方法。
这些性能模式表公开了属性信息:
-
session_account_connect_attrs
:当前会话和与会话账户关联的其他会话的连接属性 -
session_connect_attrs
:所有会话的连接属性
此外,写入审计日志的连接事件可能包括连接属性。请参阅第8.4.5.4节,“Audit Log File Formats”。
以下划线开头的属性名(_
)是保留给内部使用的,应由应用程序创建。这种约定允许MySQL在不与应用程序属性冲突的情况下引入新的属性,并使应用程序定义自己的属性而不会与内部属性发生冲突。
在给定连接中可见的连接属性集取决于诸如平台、MySQL连接器以及客户端程序等因素。
libmysqlclient客户端库设置这些属性:
-
client_name
:客户端名称(libmysql) -
client_version
:客户端库版本 -
os
:操作系统(例如,Linux, Win64) -
pid
:客户端进程ID -
platform
:机器平台(例如,x86_64) -
thread
:客户端线程ID(Windows only)
其他MySQL连接器可能定义自己的连接属性。
MySQL Connector/++为使用X DevAPI或X DevAPI for C的应用程序定义了这些属性:
-
client_license
:连接器许可证类型(例如,GPL-2.0) -
client_name
:连接器名称(mysql-connector-cpp) -
client_version
:连接器版本 -
os
:操作系统(例如,Linux, Win64) -
pid
:客户端进程ID -
platform
:机器平台(例如,x86_64) -
source_host
:客户端运行的主机名 -
thread
:客户端线程ID(Windows only)
MySQL Connector/J定义了这些属性:
-
client_name
:客户端名称 -
client_version
:客户端库版本 -
os
:操作系统(例如,Linux, Win64) -
client_license
:连接器许可证类型 -
_platform
: 机器平台(例如,x86_64
) -
_runtime_vendor
: Java 运行时环境(JRE)供应商 -
_runtime_version
: Java 运行时环境(JRE)版本
MySQL Connector/NET 定义了这些属性:
-
_client_version
: 客户端库版本。 -
_os
: 操作系统(例如,Linux
,Win64
)。 -
_pid
: 客户端进程 ID。 -
_platform
: 机器平台(例如,x86_64
)。 -
_program_name
: 客户端名称。 -
_thread
: 客户端线程 ID(仅限 Windows)。
Connector/Python 实现定义了这些属性;一些值和属性取决于 Connector/Python 实现(纯 Python 或 c-扩展):
-
_client_license
: 连接器的许可类型;GPL-2.0
或Commercial
。(仅限纯 Python)。 -
_client_name
: 设置为mysql-connector-python
(纯 Python)或libmysql
(c-扩展)。 -
_client_version
: 连接器版本(纯 Python)或 mysqlclient 库版本(c-扩展)。 -
_os
: 运行连接器的操作系统(例如,Linux
,Win64
)。 -
_pid
: 来源机器上的进程标识符(例如,26955
) -
_platform
: 机器平台(例如,x86_64
)。 -
_source_host
: 连接器连接到的机器的主机名。 -
_connector_version
: 连接器版本(例如,8.4.0
)(仅限 c-扩展)。 -
_connector_license
: 连接器的许可类型;GPL-2.0
或Commercial
(仅限 c-扩展)。 -
_connector_name
: 始终设置为mysql-connector-python
(仅限 c-扩展)。
PHP 定义了取决于它是如何编译的属性:
-
使用
libmysqlclient
编译:标准libmysqlclient
属性,前面描述过。 -
使用
mysqlnd
编译:仅有_client_name
属性,其值为mysqlnd
。
许多 MySQL 客户端程序将一个名为 program_name
的属性设置为客户端名称。例如,mysqladmin 和 mysqldump 将 program_name
设置为 mysqladmin
和 mysqldump
,分别。MySQL Shell 将 program_name
设置为 mysqlsh
。
一些 MySQL 客户端程序定义了额外的属性:
从客户端到服务器传输连接属性数据的限制存在:
-
客户端在连接之前设定的固定限制。
-
服务器在连接时设定的固定限制。
-
性能模式在连接时根据配置的固定限制。
使用C API初始化连接时,libmysqlclient
库对客户端侧的连接属性数据总体大小施加64KB限制:调用mysql_options()
导致此限制被违反时,会产生一个CR_INVALID_PARAMETER_NO
错误。其他MySQL连接器可能对客户端侧传输到服务器的连接属性数据施加自己的限制。
在服务器侧,对于连接属性数据的大小检查发生在以下时刻:
-
服务器接受的连接属性数据总体大小有64KB限制。如果客户端尝试发送超过64KB的属性数据,服务器会拒绝连接。否则,服务器认为属性缓冲区有效,并跟踪最长的这样的缓冲区大小,在
Performance_schema_session_connect_attrs_longest_seen
状态变量中。 -
对于接受的连接,性能模式检查属性数据总体大小与
performance_schema_session_connect_attrs_size
系统变量的值。如果属性数据大小超过了这个值,将会发生以下操作:-
性能模式截断属性数据,并增加
Performance_schema_session_connect_attrs_lost
状态变量的值,该变量表示由于截断而丢失连接的数量。 -
如果系统变量
log_error_verbosity
大于1,性能模式将错误日志中写入一条消息:Connection attributes of length N were truncated (N bytes lost) for connection N, user user_name@host_name (as user_name), auth: {yes|no}
警告信息的目的是帮助DBA识别出属性截断发生的客户端。
-
如果属性缓冲区有足够空间,将会在会话属性中添加一个名为_truncated的属性,并以表示丢失字节数的值填充。这使得性能模式能够在连接属性表中暴露每个连接的截断信息,而无需检查错误日志。这些信息可以通过查看而不必查阅错误日志来检验。
-