手机都有设置功能,可以设置来电铃声、音量大小、解锁密码等。如果没有这些设置,很多场景会变得不便(无法静音、无法关闭流量、无法修改密码)。MySQL 的服务器程序和客户端程序也有很多设置项,例如对于 MySQL 服务器程序,可以指定允许同时连入的客户端数量、客户端和服务器通信方式、表的默认存储引擎、排序缓冲区大小等;对于 MySQL 客户端程序,可以指定需要连接的服务器程序所在主机的主机名或 IP 地址、用户名及密码等信息。
这些设置项一般都有各自的默认值。例如服务器允许同时连入的客户端默认数量是 151,表的默认存储引擎是 InnoDB。可以在程序启动时修改这些默认值。在程序启动时指定的设置项称为启动选项(startup options),它们控制程序启动后的行为。MySQL 安装目录下 bin 目录中的各种可执行文件,无论是服务器相关程序(如 mysqld、mysqld_safe)还是客户端相关程序(如 mysql、mysqladmin),在启动时基本都可以指定启动参数。这些启动参数既可以放在命令行中指定,也可以放在配置文件中指定。下面以 mysqld 为例,详细介绍指定启动选项的格式。本节关注的是设置启动选项的方式,下面的启动选项不必纠结其具体作用,之后会对重要选项逐一说明。
启动客户端程序时在 -h 参数后紧跟服务器的 IP 地址,就意味着客户端和服务器之间需要通过 TCP/IP 网络通信。因为客户端程序和服务器程序装在同一台计算机上,所以使用客户端程序连接服务器时指定主机名为 127.0.0.1 的情况下,两者通过 TCP/IP 通信。如果要在启动服务器程序时禁止各客户端使用 TCP/IP 网络通信,可以在启动命令行里添加 skip-networking 启动选项:
mysqld --skip-networking可以看到,在命令行中指定启动选项时需要在选项名前加 -- 前缀。如果选项名由多个单词构成,单词之间既可以用短划线 - 连接,也可以用下划线 _ 连接,即 skip-networking 和 skip_networking 含义相同。所以上面的写法与下面的写法等价:
mysqld --skip_networking按上述命令启动服务器后,如果再使用 mysql 启动客户端程序并把服务器主机名指定为 127.0.0.1(IP 地址形式),会显示连接失败:
mysql -h127.0.0.1 -uroot -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)这说明 skip-networking 启动选项生效了。
再举一个例子。前面说过,如果在创建表的语句中没有显式指定表的存储引擎,会默认使用 InnoDB。如果想改变表的默认存储引擎,可以这样写启动命令:
mysqld --default-storage-engine=MyISAM把表的默认存储引擎改为 MyISAM 后,在客户端程序连接服务器后创建一张表:
mysql> CREATE TABLE sys_var_demo(
-> i INT
-> );
Query OK, 0 rows affected (0.02 sec)创建语句中没有明确指定表的存储引擎,创建成功后再看这张表的结构:
mysql> SHOW CREATE TABLE sys_var_demo\G
*************************** 1. row ***************************
Table: sys_var_demo
Create Table: CREATE TABLE `sys_var_demo` (
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.01 sec)注:以上为 5.7 时代的输出。MySQL 8.0 起
SHOW CREATE TABLE不再显示整型显示宽度(写成int而非int(11)),且未显式指定字符集时默认为utf8mb4,即末行会显示DEFAULT CHARSET=utf8mb4。
可以看到该表的存储引擎已是 MyISAM,说明启动选项 default-storage-engine 生效了。
在启动服务器程序的命令行后面指定启动选项的通用格式是:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]即把各个启动选项写到一行中,各选项之间用空白字符隔开,每个选项名前面加 --。对于不需要值的启动选项(如 skip-networking),无需指定值;对于需要值的启动选项(如 default-storage-engine),需要显式指定值(如 InnoDB、MyISAM)。在命令行指定有值的启动选项时,选项名、=、选项值之间不可以有空白字符,写成下面这样是不正确的:
mysqld --default-storage-engine = MyISAM每个 MySQL 程序都有许多不同的选项。大多数程序提供了 --help 选项,可以查看该程序支持的全部启动选项及默认值。例如,mysql --help 可查看 mysql 程序支持的启动选项,mysqld_safe --help 可查看 mysqld_safe 程序支持的启动选项。查看 mysqld 支持的启动选项有些特别,需要使用 mysqld --verbose --help。
前文提到的 skip-networking、default-storage-engine 属于长形式选项。为方便使用,设计者给一些常用选项提供了短形式。下面列举一些具有短形式的启动选项(MySQL 支持的短形式选项很多,这里只列部分):
| 长形式 | 短形式 | 含义 |
|---|---|---|
--host | -h | 主机名 |
--user | -u | 用户名 |
--password | -p | 密码 |
--port | -P | 端口 |
--version | -V | 版本信息 |
短形式选项名只有一个字母。与长形式选项前加两个短划线 -- 不同,短形式选项前只加一个短划线 - 前缀。一些短形式选项在前文已经接触过,例如启动服务器程序时指定监听端口:
mysqld -P3307使用短形式指定启动选项时,选项名和选项值之间可以没有间隙,或用空白字符隔开(-p 选项较特殊,-p 和密码值之间不能有空白字符),也就是说上面的命令与下面等价:
mysqld -P 3307另外,选项名区分大小写,例如 -p 和 -P 含义完全不同,需要注意。
在命令行中设置启动选项只对当次启动生效。如果重启程序后还想保留这些选项,就得重复把它们写到启动命令行中,很不方便。于是引入了 配置文件(也称 选项文件)的概念:把需要设置的启动选项写在配置文件中,每次启动时都从该文件加载相应选项。由于配置文件可以长久保存在硬盘上,只需配置一次,后续就无需在启动命令行中重复书写,因此推荐使用配置文件的方式来设置启动选项。
MySQL 程序启动时会寻找多个路径下的配置文件,这些路径有的是固定的,有的可在命令行指定。根据操作系统的不同,配置文件路径也有所不同。
在 Windows 操作系统中,MySQL 会按下列路径寻找配置文件:
| 路径名 | 备注 |
|---|---|
%WINDIR%\my.ini,%WINDIR%\my.cnf | |
C:\my.ini,C:\my.cnf | |
BASEDIR\my.ini,BASEDIR\my.cnf | |
defaults-extra-file | 命令行指定的额外配置文件路径 |
%APPDATA%\MySQL\.mylogin.cnf | 登录路径选项(仅限客户端) |
阅读这些 Windows 配置文件路径时需要注意:
在前三个路径中,配置文件可以使用 .ini 扩展名,也可以使用 .cnf 扩展名;
%WINDIR% 指机器上 Windows 目录的位置,通常是 C:\WINDOWS,可用下面命令查看:
echo %WINDIR%BASEDIR 指 MySQL 安装目录的路径,某 Windows 机器上的 BASEDIR 为:
C:\Program Files\MySQL\MySQL Server 8.0第四个路径指可以在启动程序时通过指定 defaults-extra-file 参数的值来添加额外配置文件路径,例如在命令行这样写:
mysqld --defaults-extra-file=C:\Users\xiaohaizi\my_extra_file.txt这样 MySQL 服务器启动时就会额外在 C:\Users\xiaohaizi\my_extra_file.txt 路径下查找配置文件。
%APPDATA% 表示 Windows 应用程序数据目录的值,可用下面命令查看:
echo %APPDATA%列表中最后一个名为 .mylogin.cnf 的配置文件比较特殊:它不是纯文本文件(其他配置文件都是纯文本),而是用 mysql_config_editor 实用程序创建的加密文件。它只能包含一些用于启动客户端软件时连接服务器的选项,包括 host、user、password、port 和 socket,且只能被客户端程序使用。
mysql_config_editor 实用程序是 MySQL 安装目录下 bin 目录中的一个可执行文件,它有专用的语法来生成或修改 .mylogin.cnf 文件中的内容。如何使用这个程序不属于本文讨论范围,可参考 MySQL 官方文档。
在类 UNIX 操作系统中,MySQL 会按下列路径寻找配置文件:
| 路径名 | 备注 |
|---|---|
/etc/my.cnf | |
/etc/mysql/my.cnf | |
SYSCONFDIR/my.cnf | |
$MYSQL_HOME/my.cnf | 特定于服务器的选项(仅限服务器) |
defaults-extra-file | 命令行指定的额外配置文件路径 |
~/.my.cnf | 用户特定选项 |
~/.mylogin.cnf | 用户特定的登录路径选项(仅限客户端) |
阅读这些 UNIX 配置文件路径时需要注意:
SYSCONFDIR 表示使用 CMake 构建 MySQL 时由 SYSCONFDIR 选项指定的目录。默认情况下,这是位于编译安装目录下的 etc 目录。
::: tip 小贴士 如果对 CMake、编译不熟悉,可以跳过这部分,不影响后续内容。 :::
MYSQL_HOME 是一个环境变量,其值由我们自己设置。它代表一个路径,可以在该路径下创建 my.cnf 配置文件,该配置文件中只能放置启动服务器程序相关的选项(其他配置文件既能存放服务器相关选项,也能存放客户端相关选项;.mylogin.cnf 除外,它只能存放客户端相关选项)。
::: tip 小贴士 如果使用 mysqld_safe 启动服务器程序且未主动设置 MySQL_HOME 环境变量,该变量的值会自动被设置为 MySQL 的安装目录,即 MySQL 服务器会在安装目录下查找名为 my.cnf 的配置文件(注意 mysql.server 会调用 mysqld_safe,所以用 mysql.server 启动服务器时也会在安装目录下查找配置文件)。 :::
最后两个以 ~ 开头的路径是用户相关的。类 UNIX 系统有当前登录用户的概念,每个用户都有一个用户目录,~ 就代表这个用户目录,可以查看 HOME 环境变量来确定。例如某 macOS 机器上的用户目录是 /Users/xiaohaizi。之所以说最后两个配置文件是用户相关的,是因为不同的类 UNIX 用户都可以在自己的用户目录下创建 .my.cnf 或 .mylogin.cnf,即不同登录用户使用的这两个配置文件是不同的。
defaults-extra-file 的含义与 Windows 中相同。
.mylogin.cnf 的含义也与 Windows 中相同,它不是纯文本文件,只能用 mysql_config_editor 实用程序创建或修改,用于存放客户端登录服务器时的相关选项。
也就是说,上述路径中的任意一个都可以当作配置文件使用;如果不存在,可以手动创建,例如在 ~/.my.cnf 路径下创建一个配置文件。
另外,前面介绍过,使用 mysqld_safe 程序启动服务器时,会间接调用 mysqld。对于传递给 mysqld_safe 的启动选项,如果 mysqld_safe 程序不处理,会接着传递给 mysqld 程序处理。例如 skip-networking 由 mysqld 处理、mysqld_safe 不处理,但如果命令行这样执行:
mysqld_safe --skip-networking则在 mysqld_safe 调用 mysqld 时,会把它处理不了的 skip-networking 选项交给 mysqld 处理。
与命令行指定启动选项不同,配置文件中的启动选项被划分为若干组,每组有一个组名,用中括号 [] 扩起来:
[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)这个配置文件里定义了许多组,组名分别为 server、mysqld、mysqld_safe、client、mysql、mysqladmin。每个组下可以定义若干启动选项。以 [server] 组为例看填写形式(其他组形式相同):
[server]
option1 # 这是 option1,该选项不需要选项值
option2 = value2 # 这是 option2,该选项需要选项值
...配置文件中指定启动选项的语法类似于命令行语法,但配置文件中只能使用长形式选项,不允许加 -- 前缀,且每行只指定一个选项。= 周围可以有空白字符(命令行中选项名、=、选项值之间不允许有空白字符)。另外,配置文件中可用 # 添加注释,从 # 出现直到行尾的内容都属于注释,读取时忽略。为了对比命令行和配置文件中指定选项的区别,再写出命令行中指定 option1 和 option2 的格式:
--option1 --option2=value2配置文件中不同的选项组供不同的启动命令使用。如果选项组名称与程序名称相同,则该组中的选项专门应用于该程序。例如 [mysqld] 和 [mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序。不过有两个选项组比较特别:
[server] 组下的启动选项作用于所有服务器程序;[client] 组下的启动选项作用于所有客户端程序。注意,mysqld_safe 和 mysql.server 这两个程序启动时都会读取 [mysqld] 选项组中的内容。下面列出一些启动命令能读取的选项组:
| 启动命令 | 类别 | 能读取的组 |
|---|---|---|
mysqld | 启动服务器 | [mysqld]、[server] |
mysqld_safe | 启动服务器 | [mysqld]、[server]、[mysqld_safe] |
mysql.server | 启动服务器 | [mysqld]、[server]、[mysql.server] |
mysql | 启动客户端 | [mysql]、[client] |
mysqladmin | 启动客户端 | [mysqladmin]、[client] |
mysqldump | 启动客户端 | [mysqldump]、[client] |
以 macOS 操作系统为例,在 /etc/mysql/my.cnf 配置文件中添加一些内容(Windows 系统参考前面提到的配置文件路径):
[server]
skip-networking
default-storage-engine=MyISAM然后直接用 mysqld 启动服务器程序:
mysqld虽然命令行没有添加启动选项,但程序启动时会到上述配置文件路径下查找配置文件,其中就包括 /etc/mysql/my.cnf。由于 mysqld 命令可以读取 [server] 选项组的内容,所以 skip-networking 和 default-storage-engine=MyISAM 这两个选项会生效。也可以把这些启动选项放在 [client] 组里,再用 mysqld 启动服务器,会发现其中的启动选项不生效。
如果想指定 mysql.server 程序的启动参数,必须把它们放在配置文件中,而不是放在命令行中。mysql.server 仅支持 start 和 stop 作为命令行参数。
可以在选项组名称后加上特定的 MySQL 版本号。例如对 [mysqld] 选项组,可以定义一个 [mysqld-8.0] 的选项组,其含义与 [mysqld] 相同,只不过只有版本号为 8.0 的 mysqld 程序才能使用该组中的选项。
前面提到 MySQL 会在某些固定路径下搜索配置文件,也可以通过在命令行指定 defaults-extra-file 启动选项来添加额外配置文件路径。MySQL 会按上表给定顺序依次读取各个配置文件,文件不存在则忽略。需要注意的是,如果在多个配置文件中设置了相同的启动选项,以最后一个配置文件中的为准。例如 /etc/my.cnf 的内容为:
[server]
default-storage-engine=InnoDB而 ~/.my.cnf 的内容为:
[server]
default-storage-engine=MyISAM因为 ~/.my.cnf 比 /etc/my.cnf 顺序靠后,所以两个配置文件中出现相同启动选项时以 ~/.my.cnf 为准,MySQL 服务器启动后 default-storage-engine 的值就是 MyISAM。
同一个命令可以访问配置文件中的多个组,例如 mysqld 可以访问 [mysqld]、[server] 组。如果在同一个配置文件(如 ~/.my.cnf)的这些组里出现相同配置项,例如:
[server]
default-storage-engine=InnoDB
[mysqld]
default-storage-engine=MyISAM那么以最后一个出现的组中的启动选项为准。例如 default-storage-engine 同时出现在 [mysqld] 和 [server] 组,因为 [mysqld] 组在 [server] 组后面,以 [mysqld] 组中的配置项为准。
如果不想让 MySQL 到默认路径下搜索配置文件(即前面列出的那些),可以在命令行指定 defaults-file 选项,例如(以 UNIX 系统为例):
mysqld --defaults-file=/tmp/myconfig.txt这样程序启动时就只在 /tmp/myconfig.txt 路径下搜索配置文件。如果文件不存在或无法访问,会发生错误。
注意区分 defaults-extra-file 和 defaults-file:使用 defaults-extra-file 可以指定额外的配置文件搜索路径(那些固定的配置文件路径仍会被搜索);而 defaults-file 会替换默认搜索路径。
命令行中指定的绝大部分启动选项都可以放到配置文件中,但有一些选项专门为命令行设计,例如 defaults-extra-file、defaults-file 本身用于指定配置文件路径,放在配置文件中没有意义。其余只能用在命令行而不能用到配置文件中的选项这里不一一列举,用到时再说明。
特别需要注意:如果同一个启动选项既出现在命令行中,又出现在配置文件中,以命令行中的启动选项为准。例如配置文件中写了:
[server]
default-storage-engine=InnoDB而启动命令是:
mysql.server start --default-storage-engine=MyISAM那么 default-storage-engine 的最终值就是 MyISAM。
MySQL 服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为 MySQL 系统变量。例如允许同时连入的客户端数量用系统变量 max_connections 表示,表的默认存储引擎用 default_storage_engine 表示,排序缓冲区大小用 sort_buffer_size 表示。MySQL 服务器程序的系统变量有好几百条。每个系统变量都有默认值,可以用命令行或配置文件中的选项在启动服务器时改变部分系统变量的值;大多数系统变量的值也可以在程序运行过程中修改,无需停止并重启。
可以用下列命令查看 MySQL 服务器程序支持的系统变量及当前值:
SHOW VARIABLES [LIKE 匹配的模式];由于系统变量太多,直接使用 SHOW VARIABLES 会输出大量内容,通常带一个 LIKE 过滤条件来查看需要的系统变量值,例如:
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.01 sec)
mysql> SHOW VARIABLES like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)可以看到当前服务器默认存储引擎是 InnoDB,允许同时连接的客户端数量最多为 151。LIKE 表达式后面可以跟通配符做模糊查询,例如:
mysql> SHOW VARIABLES LIKE 'default%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
| default_password_lifetime | 0 |
| default_storage_engine | InnoDB |
| default_table_encryption | OFF |
| default_tmp_storage_engine | InnoDB |
| default_week_format | 0 |
+-------------------------------+-----------------------+
7 rows in set (0.00 sec)
mysql>这样就查出了所有以 default 开头的系统变量值。
大部分系统变量都可以通过启动服务器时传递启动选项的方式设置,方式有两种:
通过命令行添加启动选项:
mysqld --default-storage-engine=MyISAM --max-connections=10通过配置文件添加启动选项:
[server]
default-storage-engine=MyISAM
max-connections=10用上面两种方式中的任意一种启动服务器后,再查看系统变量值:
mysql> SHOW VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 10 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql>可以看到 default_storage_engine 和 max_connections 这两个系统变量的值已被修改。需要注意:对于启动选项,如果选项名由多个单词组成,各单词之间用短划线 - 或下划线 _ 连接都可以;但对应的系统变量之间必须用下划线 _ 连接。
系统变量的一个重要特性是:大部分系统变量的值可以在服务器程序运行过程中动态修改,无需停止并重启服务器。不过系统变量有作用范围之分。
多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,有时希望不同客户端有不同的值。例如狗哥使用客户端 A,想把当前客户端对应的默认存储引擎设为 InnoDB;猫爷使用客户端 B,想把默认存储引擎设为 MyISAM。这样两个客户端拥有不同的默认存储引擎,互不影响。但各客户端私有一份系统变量会带来两个问题:
max_connections、Buffer Pool 大小 innodb_buffer_pool_size,这些公有系统变量让某个客户端私有不合适;为解决这两个问题,设计者提出了系统变量的作用范围概念,分为两种:
GLOBAL:全局变量,影响服务器的整体操作;SESSION:会话变量,影响某个客户端连接的操作。(注:SESSION 有个别名叫 LOCAL)服务器启动时,会将每个全局变量初始化为其默认值(可通过命令行或选项文件指定的选项更改这些默认值)。然后服务器为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。
以 default_storage_engine 为例:服务器启动时会初始化一个名为 default_storage_engine、作用范围为 GLOBAL 的系统变量。之后每有一个客户端连接,服务器都会为该客户端单独分配一个名为 default_storage_engine、作用范围为 SESSION 的系统变量,该会话变量值按当前同名全局变量的值初始化。
显然,通过启动选项设置的系统变量作用范围都是 GLOBAL(对所有客户端有效),因为在系统启动时还没有客户端连接进来。了解了 GLOBAL 和 SESSION 作用范围之后,看服务器运行期间通过客户端程序设置系统变量的语法:
SET [GLOBAL|SESSION] 系统变量名 = 值;或者写成:
SET [@@(GLOBAL|SESSION).]var_name = XXX;例如在服务器运行过程中把作用范围为 GLOBAL 的系统变量 default_storage_engine 的值改为 MyISAM(让之后新连接的客户端都用 MyISAM 作默认存储引擎),可以选下面两条语句之一:
语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;如果只想对本客户端生效,可选下面三条语句之一:
语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;从 语句三 可以看出,如果在设置系统变量的语句中省略作用范围,默认作用范围是 SESSION。即 SET 系统变量名 = 值 与 SET SESSION 系统变量名 = 值 等价。
既然系统变量有作用范围之分,SHOW VARIABLES 语句查看的是哪种作用范围?
答:默认查看 SESSION 作用范围的系统变量。
也可以在查看语句上指定要查看的作用范围:
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];下面演示完整的设置并查看系统变量的过程:
mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SET SESSION default_storage_engine = MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE 'default_storage_engine';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+
1 row in set (0.00 sec)
mysql>可以看到,最初 default_storage_engine 在 GLOBAL 和 SESSION 作用范围的值都是 InnoDB,在 SESSION 作用范围改为 MyISAM 后,GLOBAL 作用范围的值没有改变。
如果某个客户端改变了某系统变量在 GLOBAL 作用范围的值,并不会影响该系统变量在当前已连接客户端的 SESSION 值,只会影响后续连入客户端在 SESSION 作用范围的值。
GLOBAL 和 SESSION 两种作用范围:
GLOBAL 作用范围,如 max_connections(表示服务器最多支持同时多少个客户端连接);SESSION 作用范围,如 insert_id(表示插入值时 AUTO_INCREMENT 修饰的列的值);GLOBAL 作用范围,也具有 SESSION 作用范围,如 default_storage_engine,大部分系统变量都是如此。version 表示当前 MySQL 版本,客户端不能设置它的值,只能在 SHOW VARIABLES 语句里查看。启动选项 是程序启动时传递的参数,系统变量 是影响服务器程序运行行为的变量。两者的关系如下:
character_set_client、server_uuid 等;defaults-file。为便于了解服务器程序的运行情况,MySQL 服务器程序维护了很多关于运行状态的变量,它们被称为状态变量。例如 Threads_connected 表示当前有多少客户端与服务器建立了连接,Handler_update 表示已更新多少行记录。这样的状态变量还有好几百个,遇到时再详细说明。
由于状态变量用来显示服务器程序运行状况,它们的值只能由服务器程序自己设置,程序员不能设置。与系统变量类似,状态变量也有 GLOBAL 和 SESSION 两个作用范围,查看语句如下:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];如果不写明作用范围,默认是 SESSION,例如:
mysql> SHOW STATUS LIKE 'thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 1 |
+-------------------+-------+
4 rows in set (0.00 sec)
mysql>所有以 Thread 开头的 SESSION 作用范围状态变量都被展示出来。