youyichannel

志于道,据于德,依于仁,游于艺!

0%

重拾MySQL —— 启动选项和系统变量

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第二章

一、启动选项和配置文件

对于MySQL而言,无论是服务器相关的程序(比如mysqldmysql_safe)还是客户端相关的程序(比如mysqlmysqladmin),在启动的时候基本上都可以指定启动选项,这些启动选项可以在命令行中指定,也可以在配置文件中指定。

以下内容以mysqld为例,阐述指定启动选项的格式。

1.1 在命令行上使用选项

先给出结论,启动服务器程序的命令行后边指定启动选项的通用格式如下:

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

=> 我们可以将各个启动选项写到一行中,每一个启动选项名称前面添加--,各个启动选项之间使用空白字符隔开。对于不需要值的启动选项,比如skip-networking,它们就不需要指定对应的值;对于需要指定值的启动选项,比如default-storage-engine,则在指定这个启动选项的时候需要显式指定它的值,比如 InnoDB等。

📢注意:在命令行中指定有值的启动项时需要注意,选项名、等于号=、选项值之间不可以有空白字符,比如下面的写法就是非法的:mysqld --default-storage-engine = MyISAM

【栗子🌰】

如果我们想在启动服务器程序的时候禁止各客户端使用TCP/IP网络通信,可以在启动服务器程序的命令行中添加skip-networking启动选项:

mysqld --skip-networking

PS:如果选项名是由多个单词构成的,它们之间可以由短划线-连接,也可以使用下划线_连接。

=> 上述例子的写法等价于:mysqld --skip_networking

每个MySQL程序都支持许多不同的选项。大多数程序都提供了一个--help选项,可以用来查看该程序支持的全部启动选项以及它们的默认值。比如mysql --helpmysql_safe --help。不过查看mysqld的启动选项有些特别,需要使用mysqld --verbose --help

但是,不需要记住,只需要直接--help即可,命令行中会给正确的提示:

➜  ~ mysqld --help
mysqld Ver 8.0.31 for macos12 on arm64 (MySQL Community Server - GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Starts the MySQL database server.

Usage: mysqld [OPTIONS]

For more help options (several pages), use mysqld --verbose --help.

选项的长形式和短形式

MySQL对于一些常用的选项提供了短形式,方便我们的使用。比如:

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

短形式的选项名只有一个字母,也只有一个短划线前缀。

使用短形式选项时,选项名和选项值之间可以没有间隙,也可以使用空白字符隔开。

但是-p选项有些特殊,-p和密码值之间不可以有空白字符,不过呢,也不建议在后面跟密码值,问题不大。

1.2 配置文件中的使用选项

命令行中的使用选项只对当次启动生效,为了每次都能加载这些选项,我们需要将这些选项保存到一个文件中,每次启动服务器时从这个文件中加载相应的启动选项。这个文件就是MySQL的配置文件。

1.2.1 配置文件的路径

MySQL启动的时候,会在多个路径下寻找配置文件,这些路径有些是固定的,有些可以在命令行中指定。

类UNIX操作系统中的配置文件

在该操作系统下,MySQL会按照下表的路径依次寻找配置文件

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

📢注意:

  • SYSCONFDIR表示在使用CMake构建MySQL时,使用SYSCONFDIR选项指定的目录。

  • MYSQL_HOME是一个环境变量,可设置可不设置。该变量代表一个路径,我们可以在该路径下创建一个my.cnf配置文件,该配置文件只可以存放与启动服务器程序相关的程序。

    .mylogin.cnf只能存放客户端相关的一些选项,除.mylogin.cnf以及$MYSQL_HOME/my.cnf配置文件外,其余配置文件既可以存放服务器相关的选项,也可以存放客户端相关的选项。

  • defaults-extra-file值的是在启动程序时可以通过该启动选项的值来添加额外的配置文件路径。

  • .mylogin.cnf该配置文件有点特殊,它并不是一个纯文本文件(其余配置文件都是纯文本文件),而是使用mysql_config_editor实用程序创建的加密文件。这个文件只能包含一些在启动客户端程序时用于连接服务器的选项,包括host、user、password、port和socket,而且它只能被客户端程序使用。

    mysql_config_editor实用程序是MySQL安装目录的bin目录下的一个可执行文件。

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 特定于用户的登录路径选项(仅限客户端)

需要注意的是,前三个路径中,配置文件可以使用.ini或者.cnf作为文件扩展名。

1.2.2 配置文件的内容

与在命令行中指定的启动选项不同的是,配置文件中的启动选项被划分为了若干个组,每个组有一个组名,用[]扩起来:

[server]       # server组
option1 # 不需要选项值的选项
option2=value2 # 需要选项值的选项

[client]
(具体的启动选项...)

[mysqld_safe]
(具体的启动选项...)

[mysqladmin]
(具体的启动选项...)

[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]

【栗子🌰】

# /etc/mysql/my.cnf
[server]
skip-networking
defaults-storage-engine=MyISAM

1.2.3 特定MySQL版本的专用选项组

我们可以在选项组的名称后加上特定的MySQL版本号。

【栗子🌰】

[mysqld-5.7] # 含义同[mysqld],但是只有版本号为5.7的mysqld程序才能使用这个选项组的选项

1.2.4 配置文件的优先级

MySQL按照上面的两张配置文件路径表给定的顺序依次读取各个配置文件。如果该文件不存在,则忽略、

📢注意:如果我们在多个配置文件中设置了相同的启动选项,则以最后一个配置文件为准

1.2.5 同一个配置文件中多个组的优先级

同一个程序可以访问配置文件中的多个组,比如mysqld可以访问[mysqld][server]组。如果我们在同一个配置文件中,在[mysqld][server]组中出现了同样的启动选项,以最后一个出现的组中的启动选项为准

【栗子🌰】

[server]
default-storage-engine=InnoDB

[mysqld]
default-storage-engine=MyISAM

最后出现的default-storage-engine=MyISAM生效。

1.2.6 defaults-file的使用

如果我们不想让MySQL到默认的路径下搜索配置文件,则可以在命令行中指定defaults-files选项,比如:

mysqld --defaults-file=/tmp/myconf.txt

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

区别:defaults-filesdefaults-extra-file

使用defaults-extra-file可以指定额外的配置文件路径,也就是说那些固定的配置文件路径也会被搜索。

1.3 在命令行和配置文件中启动选项的区别

在命令行中指定的绝大部分启动选项都可以放到配置文件中,但是有一些选项是专门为命令行设计的,比如defaults-filesdefaults-extra-file,这样的选项本身就是为了指定配置文件路径的,再放到配置文件中就失去了意义。

📢注意:如果同一个启动选项同时出现在命令行和配置文件中,那么以命令行中的启动选项为准。(其实也是符合最后出现为准原则,命令行总是在最后启动的)

二、系统变量

2.1 系统变量简介

MySQL服务器程序在运行过程会用到许多影响程序行为的变量,它们被称为系统变量。

比如:

  • max_connections:允许同时连入的客户端数量
  • default_storage_engine:表的默认存储引擎

每一个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多系统变量的值可以在程序运行过程中修改,无须停止并重启服务器。

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.00 sec)

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.01 sec)

2.3 设置系统变量

2.3.1 通过启动选项指定

大部分系统变量都可以通过在启动服务器时传送启动选项的方式来设置。

设置的方式:

  • 通过命令行添加启动选项
  • 通过配置文件添加启动选项

2.3.2 服务器程序运行过程中设置

大多系统变量的值可以在程序运行过程中修改,无须停止并重启服务器。系统变量还有作用范围之分。

1)设置不同作用范围的系统变量

系统变量的作用范围分为两种:

  • GLOBAL(全局范围):影响服务器的整体操作。具有该作用范围的系统变量称为全局变量
  • SESSION(会话范围):影响某个客户端连接的操作。具有该作用范围的系统变量称为会话变量

服务器启动时,会将每个全局变量初始化为其默认值(可以修改)。服务器还会为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应的全局变量的当前值进行初始化。

在服务器程序运行期间通过客户端程序设置系统变量的命令:

SET [GLOBAL | SESSION] 系统变量值 = 值;

-- or

SET [@@(GLOBAL|SESSION).]系统变量名 = 值;

【🌰栗子】修改不同作用范围的default_storage_engine

GLOBAL修改:

  • SET GLOBAL default_storage_engine = MyISAM
  • SET @@GLOBAL.default_storage_engine = MyISAM

SESSION修改:

  • SET SESSION default_storage_engine = MyISAM
  • SET @@SESSION.default_storage_engine = MyISAM
  • SET default_storage_engine = MyISAM

可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION。

2)查看不同作用范围的系统变量

命令:

SHOW [GLOBAL | SESSION] VARIABLES [LIKE 匹配的模式];
  • 使用GLOBAL修饰符,则会显示全局系统变量的值,如果某个系统变量没有GLOBAL作用范围,不显示。
  • 使用SESSION修饰符(等价于不写修饰符),则显示针对当前连接有效的系统变量值。如果某个系统变量没有SESSION作用范围,则显示GLOBAL作用范围的值。

3)注意事项

  • 并不是所有的系统变量都具有GLOBAL和SESSION的作用范围
    • 只有GLOBAL范围的:max_connecetions ...
    • 只有SESSION范围的:insert_id ...
    • 二者都有的:default_storage_engine ...
  • 有些系统变量是只读的,并不能设置值,比如version

2.3.3 启动选项和系统变量的区别

启动选项是在程序启动时由用户传递的一些参数,系统变量是影响服务器程序运行行为的变量。二者关系:

  • 大部分的系统变量都可以当做启动选项传入
  • 有些系统变量是在程序运行过程中自动生成的,不可以当做启动选项来设置,比如character_set_client
  • 有些启动选项也不是系统变量,比如defaults-file

三、状态变量

为了更好的了解服务器程序的运行情况,MySQL服务器程序中维护了许多关于程序运行状态的变量,被称为状态变量,

比如:

  • Threads_connected:表示当前有多少客户端与服务器建立了连接
  • Innodb_rows_updated:表示更新了多少条以InnoDB为存储引擎的表中的记录

状态变量是用来显示服务器程序运行状态的,因此他们的值只能由服务器程序来设置,不能认为设置。与系统变量类似,状态变量也有GLOBAL和SESSION两个作用范围。

查看状态变量的命令:

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

类似的,不写修饰符等价于SESSION修饰符。

【🌰栗子】

mysql> SHOW STATUS LIKE 'thread%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 8 |
| Threads_connected | 1 |
| Threads_created | 12 |
| Threads_running | 2 |
+-------------------+-------+
4 rows in set (0.01 sec)