MariaDB 10.1.1:系统变量及其元数据
我想如果我说 MariaDB 或 MySQL 服务器对系统变量的了解远不止其值,这应该不会让任何人感到惊讶。实际上,每个变量都可以是会话级或全局级,只读或可写,它有一个相关的帮助文本(在 mysqld --help --verbose
中打印),某些变量只接受来自给定字符串集合的值(自 MariaDB 10.1.0 起,该允许值集合也在 mysqld --help --verbose
中打印),数值变量有有效值的上下限(这些值从未在任何地方打印),等等。我一直认为无法查询这些信息有点浪费。如果可以的话,那将非常方便,特别是对于各种 GUI 客户端——它们可以在工具提示中显示帮助,验证值等等。
但最近我们的用户提出了这个需求——准确地说,是关于系统变量的元数据,例如变量是否只读,它是如何设置的等等。你们提出来,我们就实现了。让我介绍一下 INFORMATION_SCHEMA.SYSTEM_VARIABLES
表。对于每个系统变量,它都会显示其全局值和会话值,全局值的来源(配置文件或命令行、通过 SQL 分配、服务器自动配置、编译时默认值),变量的类型和作用域,其默认值,数值变量的值范围,ENUM/SET 变量的允许值集合,变量是否只读,以及是否可以从命令行设置。当然,还有帮助文本。
常言道,一图胜千言,所以请看这里
MariaDB [test]> SELECT * FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME='JOIN_BUFFER_SIZE'G *************************** 1. row ***************************** VARIABLE_NAME: JOIN_BUFFER_SIZE SESSION_VALUE: 131072 GLOBAL_VALUE: 131072 GLOBAL_VALUE_ORIGIN: COMPILE-TIME DEFAULT_VALUE: 131072 VARIABLE_SCOPE: SESSION VARIABLE_TYPE: BIGINT UNSIGNED VARIABLE_COMMENT: The size of the buffer that is used for joins NUMERIC_MIN_VALUE: 128 NUMERIC_MAX_VALUE: 18446744073709551615 NUMERIC_BLOCK_SIZE: 128 ENUM_VALUE_LIST: NULL READ_ONLY: NO COMMAND_LINE_ARGUMENT: REQUIRED 1 row in set (0.01 sec) MariaDB [test]> SELECT * FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME='PLUGIN_MATURITY'G *************************** 1. row *************************** VARIABLE_NAME: PLUGIN_MATURITY SESSION_VALUE: NULL GLOBAL_VALUE: beta GLOBAL_VALUE_ORIGIN: CONFIG DEFAULT_VALUE: unknown VARIABLE_SCOPE: GLOBAL VARIABLE_TYPE: ENUM VARIABLE_COMMENT: The lowest desirable plugin maturity. Plugins less mature than that will not be installed or loaded NUMERIC_MIN_VALUE: NULL NUMERIC_MAX_VALUE: NULL NUMERIC_BLOCK_SIZE: NULL ENUM_VALUE_LIST: unknown,experimental,alpha,beta,gamma,stable READ_ONLY: YES COMMAND_LINE_ARGUMENT: REQUIRED 1 row in set (0.01 sec)
注意,READ_ONLY
仅表示“运行时不可更改”,该变量仍可能从命令行或配置文件中写入。以下是所有真正不可修改的只读变量列表:
MariaDB [test]> SELECT VARIABLE_NAME,VARIABLE_TYPE FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE READ_ONLY='YES' AND COMMAND_LINE_ARGUMENT IS NULL ORDER BY 1; +---------------------------+-----------------+ | VARIABLE_NAME | VARIABLE_TYPE | +---------------------------+-----------------+ | ARIA_USED_FOR_TEMP_TABLES | BOOLEAN | | CHARACTER_SET_SYSTEM | ENUM | | ERROR_COUNT | BIGINT UNSIGNED | | EXTERNAL_USER | VARCHAR | | GTID_BINLOG_POS | VARCHAR | | GTID_CURRENT_POS | VARCHAR | | HAVE_COMPRESS | VARCHAR | | HAVE_CRYPT | VARCHAR | | HAVE_DYNAMIC_LOADING | VARCHAR | | HAVE_GEOMETRY | VARCHAR | | HAVE_OPENSSL | VARCHAR | | HAVE_PROFILING | VARCHAR | | HAVE_QUERY_CACHE | VARCHAR | | HAVE_RTREE_KEYS | VARCHAR | | HAVE_SSL | VARCHAR | | HAVE_SYMLINK | VARCHAR | | HOSTNAME | VARCHAR | | IN_TRANSACTION | BIGINT UNSIGNED | | LARGE_FILES_SUPPORT | BOOLEAN | | LARGE_PAGE_SIZE | INT UNSIGNED | | LAST_GTID | VARCHAR | | LICENSE | VARCHAR | | LOCKED_IN_MEMORY | BOOLEAN | | LOG_BIN | BOOLEAN | | LOWER_CASE_FILE_SYSTEM | BOOLEAN | | PROTOCOL_VERSION | INT UNSIGNED | | PROXY_USER | VARCHAR | | SKIP_EXTERNAL_LOCKING | BOOLEAN | | SYSTEM_TIME_ZONE | VARCHAR | | VERSION | VARCHAR | | VERSION_COMMENT | VARCHAR | | VERSION_COMPILE_MACHINE | VARCHAR | | VERSION_COMPILE_OS | VARCHAR | | VERSION_MALLOC_LIBRARY | VARCHAR | | WARNING_COUNT | BIGINT UNSIGNED | +---------------------------+-----------------+ 35 rows in set (0.06 sec)
您可能想知道 LOG_BIN
在这个列表中做什么。这是因为在命令行中您永远不能指定这个布尔只读变量,您实际指定的是一个命令行选项 --log-bin
,它接受一个字符串。事实证明,这个新的 SYSTEM_VARIABLES
表很适合突出 MariaDB/MySQL 系统变量内部实现的“暗角”。