启动选项和系统变量
# 启动选项和系统变量
# 1. 在命令行上使用选项
如果我们在启动服务器程序的时候就禁止各客户端使用TCP/IP
网络进行通信,可以在启动服务器程序的命令行里添加skip-networking
启动选项,如果选项名是由多个单词构成的,它们之间可以由短划线-
连接起来,也可以使用下划线_
连接起来,也就是说skip-networking
和skip_networking
表示的含义是相同的。就像这样:
mysqld --skip-networking # 等价于 mysqld --skip_networking
在按照上述命令启动服务器程序后,如果我们再使用mysql
来启动客户端程序时,再把服务器主机名指定为127.0.0.1
(IP地址的形式)的话会显示连接失败。
如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
mysqld --default-storage-engine=MyISAM
我们现在就已经把表的默认存储引擎改为MyISAM
了,在客户端程序连接到服务器程序后试着创建一个表:
CREATE TABLE sys_var_demo(
i INT
);
2
3
这个定义语句中我们并没有明确指定表的存储引擎,创建成功后再看一下这个表的结构:
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=utf8mb4
1 row in set (0.01 sec)
2
3
4
5
6
7
可以看到该表的存储引擎已经是MyISAM
了,说明启动选项default-storage-engine
生效了。
所以在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
在命令行上指定有值的启动选项时需要注意,选项名、=、选项值之间不可以有空白字符,比如写成下边这样就是不正确的:
mysqld --default-storage-engine = MyISAM
查看mysql
程序支持的全部启动选项以及它们的默认值:
mysql --help
可以看到mysql
程序支持的启动选项。mysqld_safe --help
可以看到mysqld_safe
程序支持的启动选项。mysqld --verbose --help
可以看到mysqld
程序支持的启动选项。
# 2. 配置文件中使用选项
在命令行中设置启动选项只对当次启动生效,也就是说如果下一次重启程序的时候我们还想保留这些启动选项的话,还得重复把这些选项写到启动命令行中,这样真的神烦唉!于是设计MySQL
的大叔们提出一种配置文件
(也称为选项文件
)的概念,我们把需要设置的启动选项都写在这个配置文件中,每次启动服务器的时候都从这个文件里加载相应的启动选项。由于这个配置文件可以长久的保存在计算机的硬盘里,所以只需我们配置一次,以后就都不用显式的把启动选项都写在启动命令行中了,所以我们推荐使用配置文件的方式来设置启动选项。
# 2.1. 配置文件的路径
MySQL
程序在启动时会寻找多个路径下的配置文件,这些路径有的是固定的,有的是可以在命令行指定的。根据操作系统的不同,配置文件的路径也有所不同,我们分开看一下。
# 2.1.1. Windows操作系统的配置文件
在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
目录的位置BASEDIR
指的是MySQL
安装目录的路径。指定
defaults-extra-file
参数的值来添加额外的配置文件路径,如mysqld --defaults-extra-file=C:\Users\xiaohaizi\my_extra_file.txt
。%APPDATA%
表示Windows
应用程序数据目录的值。.mylogin.cnf
不是一个纯文本文件(其他的配置文件都是纯文本文件),而是使用mysql_config_editor
实用程序创建的加密文件。文件中只能包含一些用于启动客户端软件时连接服务器的一些选项,包括host
、user
、password
、port
和socket
。而且它只能被客户端程序所使用。
# 2.1.2. 类Unix操作系统中的配置文件
在类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
选项指定的目录。MYSQL_HOME
是一个环境变量。defaults-extra-file
的含义与Windows
中的一样。.mylogin.cnf
的含义也同Windows
中的一样。
# 2.1.3. 配置文件的内容
与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]
扩起来,像这样:
[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
像这个配置文件里就定义了许多个组,组名分别是server
、mysqld
、mysqld_safe
、client
、mysql
、mysqladmin
。每个组下边可以定义若干个启动选项,我们以[server]
组为例来看一下填写启动选项的形式(其他组中启动选项的形式是一样的):
[server]
option1 #这是option1,该选项不需要选项值
option2 = value2 #这是option2,该选项需要选项值
...
2
3
4
配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不允许加--
前缀,并且每行只指定一个选项,而且**=
周围可以有空白字符**。可以使用#
来添加注释,从#
出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这些注释内容。
配置文件中不同的选项组是给不同的启动命令使用的,如果选项组名称与程序名称相同,则组中的选项将专门应用于该程序。例如, [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
2
3
然后直接用mysqld
启动服务器程序:
mysqld
虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们上边提到的配置文件路径下查找配置文件,其中就包括/etc/mysql/my.cnf
。
mysql.server仅支持 start 和 stop 作为命令行参数。
# 2.1.4. 特定MySQL版本的专用选项组
我们可以在选项组的名称后加上特定的MySQL
版本号,比如对于[mysqld]
选项组来说,我们可以定义一个[mysqld-5.7]
的选项组,它的含义和[mysqld]
一样,只不过只有版本号为5.7
的mysqld
程序才能使用这个选项组中的选项。
# 2.1.5. 配置文件的优先级
如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准。比方说/etc/my.cnf
文件的内容是这样的:
[server]
default-storage-engine=InnoDB
2
而~/.my.cnf
文件中的内容是这样的:
[server]
default-storage-engine=MyISAM
2
又因为~/.my.cnf
比/etc/my.cnf
顺序靠后,所以如果两个配置文件中出现相同的启动选项,以~/.my.cnf
中的为准,所以MySQL
服务器程序启动之后,default-storage-engine
的值就是MyISAM
。
# 2.1.6. 同一个配置文件中多个组的优先级
如果在同一个配置文件中,比如~/.my.cnf
,在这些组里出现了同样的配置项,比如这样:
[server]
default-storage-engine=InnoDB
[mysqld]
default-storage-engine=MyISAM
2
3
4
那么,将以最后一个出现的组中的启动选项为准,比方说例子中default-storage-engine
既出现在[mysqld]
组也出现在[server]
组,因为[mysqld]
组在[server]
组后边,就以[mysqld]
组中的配置项为准。
# 2.1.7. defaults-file的使用
如果我们不想让MySQL
到默认的路径下搜索配置文件,可以在命令行指定defaults-file
选项,比如这样(以UNIX
系统为例):
mysqld --defaults-file=/tmp/myconfig.txt
这样,在程序启动的时候将只在/tmp/myconfig.txt
路径下搜索myconfig.txt
配置文件。如果文件不存在或无法访问,则会发生错误。
# 2.1.8. 命令行和配置文件中启动选项的区别
如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!比如我们在配置文件中写了:
[server]
default-storage-engine=InnoDB
2
而我们的启动命令是:
mysql.server start --default-storage-engine=MyISAM
那最后default-storage-engine
的值就是MyISAM
!
# 2. 系统变量
# 2.1. 系统变量简介
MySQL
服务器程序运行过程中影响程序行为的变量,它们被称为MySQL
系统变量,比如允许同时连入的客户端数量用系统变量max_connections
表示,表的默认存储引擎用系统变量default_storage_engine
表示,查询缓存的大小用系统变量query_cache_size
表示。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。
# 2.2. 查看系统变量
我们可以使用下列命令查看MySQL
服务器程序支持的系统变量以及它们的当前值:
SHOW VARIABLES [LIKE 匹配的模式];
带一个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 | 800 |
+-----------------+-------+
1 row in set (0.00 sec)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
可以看到,现在服务器程序使用的默认存储引擎就是InnoDB
,允许同时连接的客户端数量最多为800
。别忘了LIKE
表达式后边可以跟通配符来进行模糊查询,也就是说我们可以这么写:
mysql> SHOW VARIABLES LIKE 'default%';
+-------------------------------+-----------------------+
| Variable_name | Value |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
| default_password_lifetime | 0 |
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| default_week_format | 0 |
+-------------------------------+-----------------------+
5 rows in set (0.01 sec)
2
3
4
5
6
7
8
9
10
11
这样就查出了所有以default
开头的系统变量的值。
# 2.3. 设置系统变量
# 2.3.1. 通过启动选项设置
大部分的系统变量
都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项我们上边已经花了大篇幅来唠叨了,就是下边两种方式:
通过命令行添加启动选项。
比方说我们在启动服务器程序时用这个命令:
mysqld --default-storage-engine=MyISAM --max-connections=10
1通过配置文件添加启动选项。
我们可以这样填写配置文件:
[server] default-storage-engine=MyISAM max-connections=10
1
2
3
当使用上边两种方式中的任意一种启动服务器程序后,我们再来查看一下系统变量的值:
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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
可以看到default_storage_engine
和max_connections
这两个系统变量的值已经被修改了。有一点需要注意的是,对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线-
或者下划线_
连接起来都可以,但是对应的系统变量之间必须使用下划线_
连接起来。
# 2.3.2. 服务器程序运行过程中设置
对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。不过系统变量有作用范围之分。
# 设置不同作用范围的系统变量
系统变量的作用范围:
GLOBAL
:全局变量,影响服务器的整体操作。SESSION
:会话变量,影响某个客户端连接的操作。(注:SESSION
有个别名叫LOCAL
)
服务器程序运行期间通过客户端程序设置系统变量的语法:
SET [GLOBAL|SESSION] 系统变量名 = 值;
或者写成这样也行:
SET [@@(GLOBAL|SESSION).]var_name = XXX;
在服务器运行过程中把作用范围为GLOBAL
的系统变量default_storage_engine
的值修改为MyISAM
:
语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;
2
设置会话变量:
语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;
2
3
# 查看不同作用范围的系统变量
默认查看的是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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
如果某个客户端改变了某个系统变量在GLOBAL
作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION
的值,只会影响后续连入的客户端在作用范围为SESSION
的值。
# 注意事项
并不是所有系统变量都具有
GLOBAL
和SESSION
的作用范围。有一些系统变量只具有
GLOBAL
作用范围,比方说max_connections
,表示服务器程序支持同时最多有多少个客户端程序进行连接。有一些系统变量只具有
SESSION
作用范围,比如insert_id
,表示插入值时使用的AUTO_INCREMENT
修饰的列的值。有一些系统变量的值既具有
GLOBAL
作用范围,也具有SESSION
作用范围,比如我们前边用到的default_storage_engine
,而且其实大部分的系统变量都是这样的,
有些系统变量是只读的,并不能设置值。比方说
version
,表示当前MySQL
的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES
语句里查看。
# 2.3.3. 启动选项和系统变量的区别
启动选项
是在程序启动时我们程序员传递的一些参数,而系统变量
是影响服务器程序运行行为的变量,它们之间的关系如下:
大部分的系统变量都可以被当作启动选项传入。
有些系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如
auto_increment_offset
、character_set_client
啥的。有些启动选项也不是系统变量,比如
defaults-file
。
# 3. 状态变量
关于程序运行状态的变量,它们被称为状态变量
。
由于状态变量
是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。与系统变量
类似,状态变量
也有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>
2
3
4
5
6
7
8
9
10
11
12
所有以Thread
开头的SESSION
作用范围的状态变量就都被展示出来了。