首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

小刘说

砥砺前行
首页
  • 监控

    • grafana
    • prometheus
  • 学习笔记

    • 《核心系统命令实战》
    • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
    • 《Ansible权威指南》
  • 博客搭建
  • git
  • python
  • 友情链接
  • 文档编写规范
  • 我用过的电脑
  • 喷涂相关
  • 每日一溜
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 初识MySQL
  • 启动选项和系统变量
    • 1. 在命令行上使用选项
    • 2. 配置文件中使用选项
      • 2.1. 配置文件的路径
      • 2.1.1. Windows操作系统的配置文件
      • 2.1.2. 类Unix操作系统中的配置文件
      • 2.1.3. 配置文件的内容
      • 2.1.4. 特定MySQL版本的专用选项组
      • 2.1.5. 配置文件的优先级
      • 2.1.6. 同一个配置文件中多个组的优先级
      • 2.1.7. defaults-file的使用
      • 2.1.8. 命令行和配置文件中启动选项的区别
    • 2. 系统变量
      • 2.1. 系统变量简介
      • 2.2. 查看系统变量
      • 2.3. 设置系统变量
      • 2.3.1. 通过启动选项设置
      • 2.3.2. 服务器程序运行过程中设置
      • 设置不同作用范围的系统变量
      • 查看不同作用范围的系统变量
      • 注意事项
      • 2.3.3. 启动选项和系统变量的区别
    • 3. 状态变量
  • 字符集和比较规则
  • InnoDB记录存储结构-行
  • InnoDB记录存储结构-页
  • B+ 树索引
  • MySQL 的数据目录
  • 《MySQL 是怎样运行的:从根儿上理解 MySQL》
小刘
2022-11-21
目录

启动选项和系统变量

# 启动选项和系统变量

# 1. 在命令行上使用选项

如果我们在启动服务器程序的时候就禁止各客户端使用TCP/IP网络进行通信,可以在启动服务器程序的命令行里添加skip-networking启动选项,如果选项名是由多个单词构成的,它们之间可以由短划线-连接起来,也可以使用下划线_连接起来,也就是说skip-networking和skip_networking表示的含义是相同的。就像这样:

mysqld --skip-networking # 等价于 mysqld --skip_networking
1

在按照上述命令启动服务器程序后,如果我们再使用mysql来启动客户端程序时,再把服务器主机名指定为127.0.0.1(IP地址的形式)的话会显示连接失败。

如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:

mysqld --default-storage-engine=MyISAM
1

我们现在就已经把表的默认存储引擎改为MyISAM了,在客户端程序连接到服务器程序后试着创建一个表:

CREATE TABLE sys_var_demo(
    i INT
);
1
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)
1
2
3
4
5
6
7

可以看到该表的存储引擎已经是MyISAM了,说明启动选项default-storage-engine生效了。

所以在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:

--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
1

在命令行上指定有值的启动选项时需要注意,选项名、=、选项值之间不可以有空白字符,比如写成下边这样就是不正确的:

mysqld --default-storage-engine = MyISAM
1

查看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]
(具体的启动选项...)

1
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,该选项需要选项值
...
1
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
1
2
3

然后直接用mysqld启动服务器程序:

mysqld
1

虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们上边提到的配置文件路径下查找配置文件,其中就包括/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
1
2

而~/.my.cnf文件中的内容是这样的:

[server]
default-storage-engine=MyISAM
1
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
1
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
1

这样,在程序启动的时候将只在/tmp/myconfig.txt路径下搜索myconfig.txt配置文件。如果文件不存在或无法访问,则会发生错误。

# 2.1.8. 命令行和配置文件中启动选项的区别

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

[server]
default-storage-engine=InnoDB
1
2

而我们的启动命令是:

mysql.server start --default-storage-engine=MyISAM
1

那最后default-storage-engine的值就是MyISAM!

# 2. 系统变量

# 2.1. 系统变量简介

MySQL服务器程序运行过程中影响程序行为的变量,它们被称为MySQL系统变量,比如允许同时连入的客户端数量用系统变量max_connections表示,表的默认存储引擎用系统变量default_storage_engine表示,查询缓存的大小用系统变量query_cache_size表示。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。

# 2.2. 查看系统变量

我们可以使用下列命令查看MySQL服务器程序支持的系统变量以及它们的当前值:

SHOW VARIABLES [LIKE 匹配的模式];
1

带一个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)
1
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)
1
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)
1
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] 系统变量名 = 值;
1

或者写成这样也行:

SET [@@(GLOBAL|SESSION).]var_name = XXX;
1

在服务器运行过程中把作用范围为GLOBAL的系统变量default_storage_engine的值修改为MyISAM:

语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;
1
2

设置会话变量:

语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;
1
2
3
# 查看不同作用范围的系统变量

默认查看的是SESSION作用范围的系统变量

在查看系统变量的语句上加上要查看哪个作用范围的系统变量,就像这样:

SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
1

下边我们演示一下完整的设置并查看系统变量的过程:

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)
1
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 匹配的模式];
1

类似的,如果我们不写明作用范围,默认的作用范围是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>
1
2
3
4
5
6
7
8
9
10
11
12

所有以Thread开头的SESSION作用范围的状态变量就都被展示出来了。

上次更新: 2024/05/11, 03:55:33

← 初识MySQL 字符集和比较规则→

最近更新
01
kubernetes控制器-Service
08-18
02
kubernetes控制器-Deployment
08-08
03
kubernetes调度基础
07-27
更多文章>
Theme by Vdoing | Copyright © 2023-2024 本站支持IPv6访问 本站支持SSL安全访问
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式