Session 2 启动选项和系统变量

对于在程序启动时指定的设置项,称之为启动选项(startup options),这些选项控制着程序启动后的行为。通常,在命令行中指定启动选项时需要在选项名前加上**--前缀**。

指定启动选项的通用格式一般是这样的:(等号左右无空格

1
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
1
2
mysqld --default-storage-engine = MyISAM # 指定默认引擎
mysqld --skip-networking # 禁止tcp/ip网络通信

大多数程序提供了一个--help选项,你可以查看该程序支持的全部启动选项以及它们的默认值。

有时会对一些常用的启动选项提供短形式,例如:

长形式 短形式 含义
--host -h 主机名
--user -u 用户名
--password -p 密码
--port -P 端口
--version -V 版本信息

为了使下一次重启程序时保留这些启动选项,需要把启动选项写在配置文件(这里又称选项文件)中,

在类UNIX操作系统中,MySQL会按照下列路径来寻找配置文件:

路径名 备注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf 特定于服务器的选项(仅限服务器)
defaults-extra-file 命令行指定的额外配置文件路径
~/.my.cnf 用户特定选项
~/.mylogin.cnf 用户特定的登录路径选项(仅限客户端)

如果在多个配置文件中设置了相同的启动选项,那以按上表顺序为优先级,以最后一个配置文件中的为准。

MYSQL_HOME是一个环境变量,该变量的值是我们自己设置的。我们可以在该路径下创建一个my.cnf配置文件,那么这个配置文件中只能放置关于启动服务器程序相关的选项。

可以通过指定defaults-extra-file参数的值来添加额外的配置文件路径。(至于defaults-file是另一个启动项,指定只到指定路径去找配置文件;这两个启动选项只能作用在命令行

配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]扩起来,像这样:

1
2
3
4
5
6
7
8
9
10
11
12
[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)

每种启动命令都有其对应的能读取的选项组:

启动命令 类别 能读取的组
mysqld 启动服务器 [mysqld][server]
mysqld_safe 启动服务器 [mysqld][server][mysqld_safe]
mysql.server 启动服务器 [mysqld][server][mysql.server]
mysql 启动客户端 [mysql][client]
mysqladmin 启动客户端 [mysqladmin][client]
mysqldump 启动客户端 [mysqldump][client]

[server]组下面的启动选项将作用于所有的服务器程序。[client]组下面的启动选项将作用于所有的客户端程序。

类似[mysqld-5.7]的选项组,它的含义和[mysqld]一样,只不过只有版本号为5.7mysqld程序才能使用这个选项组中的选项。

如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准

启动选项与系统变量的关系是大体相交的。启动选项的名称可以用短划线-或者下划线_连接单词,但是系统变量必须使用下划线_连接

对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改。系统变量的作用范围分为这两种:

  • GLOBAL全局变量,影响服务器的整体操作。
  • SESSION会话变量,影响某个客户端连接的操作。(注:SESSION有个别名叫LOCAL

系统变量的初始值由命令行或选项文件赋予。通过启动选项设置的系统变量的作用范围都是GLOBAL的。

通过客户端程序设置或系统变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SET [GLOBAL|SESSION] 系统变量名 = 值; 
SET 系统变量名 = 值; # 如果省略作用范围,默认是SESSION(仅对当前客户端生效)
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
SHOW VARIABLES [LIKE 匹配的模式]; # 默认也是SESSION

SHOW GLOBAL VARIABLES LIKE "%connection%";
/*
+-----------------------------------+----------------------+
| Variable_name | Value |
+-----------------------------------+----------------------+
| character_set_connection | utf8mb4 |
...
| max_connections | 151 |
| max_user_connections | 0 |
| mysqlx_max_connections | 100 |
+-----------------------------------+----------------------+
*/

MySQL服务器程序中维护了很多关于程序运行状态的变量,它们被称为状态变量。比方说Threads_connected表示当前有多少客户端与服务器建立了连接,Handler_update表示已经更新了多少行记录等。显然,它们的值只能由服务器程序自己来设置,我们是不能设置的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
SHOW STATUS [LIKE 匹配的模式]; # 默认是SESSION

SHOW STATUS LIKE "Thread%";
/*
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 2 |
+-------------------+-------+
*/

可以通过@@变量名(不区分大小写)来获取系统变量值

1
2
3
4
5
6
mysql> select @@version;
+-------------------------+
| @@version |
+-------------------------+
| 8.0.32-0ubuntu0.22.04.2 |
+-------------------------+