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 系统变量内部实现的“暗角”。