MySQL—启动选项和系统变量

小龙 856 2022-02-09

前言

MySQL的服务器程序和客户端程序有许多的设置项,比如对于服务器程序,我们可以设置允许同时连接的客户端数量、客户端和服务器端的通信方式、表默认使用的引擎、查询缓存的大小等等;对于客户端程序,可以指定连接的地址、端口、用户名和密码等等

这些设置项一般都有各自的默认值,比如:服务器程序允许同时连接的客户端的数量为 151 ,表默认使用的引擎是 InnoDB,当然我们可以在服务器程序启动时去修改这些默认值。这种在程序启动时指定的设置也称为 启动选项(Startup options),这些选项控制着程序启动后的行为。

在MySQL安装目录下的 bin 目录中的各种可执行文件(比如 mysql、mysqld )在启动的时候都可以指定启动参数。这些启动命令可以在命令行中指定,也可以在 my.cnf 配置文件中指定。

命令行中指定选项

-h

后面添加IP地址,意味着客服端和服务器端通信将使用TCP/IP网络进行通信。

- -skip-networking

服务器程序启动时在命令行中使用该选项,就表示禁止服务器端和客户端使用TCP/IP通信
mysqld --skip-networking / mysqld --skip_networking

- -default-storage-engine=xxx

该选项是指定数据库中表默认使用的存储引擎
mysqld --default-storage-engine=MyISAM

上面简单介绍了几个选项,简单的连接后可以指定在启动服务器程序的命令后边指定启动选项的通用格式是:

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

每一个选项前面都要添加 - - ,有一些选项需要指定值,有一些则不需要;需要指定值得在选项后面使用 =值 即可。注意 - -与选项之间不能有空格,选项后面的 = 前后不能有空格

选项有很多,我们不可能全部背下来,所以大多数启动程序中都有一个 - -help 选项,使用该选项可以查询该程序支持的全部选项,即对应的默认值。

mysql --help

image.png

选项太多,只截取前面几个,后面还有非常多。--help 给出的选项包含了简写和完整写法(就是短形式和长形式)

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

配置文件中的选项

在命令行中使用选项只对当次启动生效,如果程序重启了那么之前设置的选项就失效了,于是MySQL的设计者就提出了配置文件的概念,我们只需要把要使用到的配置选项都写在这个配置文件中,那么我们只需要配置一次,以后每次启动MySQL时直接加载这个配置文件就可以了。

配置文件路径

在Linux中所以的配置文件都存放在 /etc/my.cnf

image.png

配置文件内容

[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)

在my.cnf配置文件中定义了许多个组: server、mysqld、mysqld_safe、client、mysql、mysqladmin 。每个组下面可以定义若干个启动选项,每个组定义选项的格式都是一样的,只是具体的选项不同。我们就以 serverr 为例学习

[server]  	# 组名称,必须使用中括号"[]"包裹
option1 	# 启动选项1,该选项不需要值
option2=value2 	# 启动选项2,该选项需要值
...

在配置文件中的选项只能使用长形式,并且不需要写 "- -",每一行只能指定一个选项,"="前后可以存在空格

不同的启动程序使用的组区别

启动命令类别能读取的组
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和mysqld中有相同选项,mysqld在server后面,那么就以mysqld中的为准

命令行指定配置文件

- -defaluts-files=/tem/my.txt

在程序启动,使用了 --defaluts-files 指定启动文件,程序在启动时就去查找该文件。

命令行和配置文件的区别

在命令行中使用的配置选项绝大部分都能在配置文件中使用,但有一些专门为命令行设计的选项除外,比如:default-extra-file、defaults-files这种本身就是为了指定配置文件的命令,再放在配置文件中就毫无意义了

注意:在配置文件和命令行中出现了相同的选项,将以命令行中为准

系统变量

MySQL服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为MySQL系统变量,比如允许同时连入的客户端数量用到的系统变量 max_connections 、表的默认存储引擎用 default_storage_engine 表示、查询缓存大小用系统变量 query_cache_size 表示;在服务器程序启动时可以使用命令行货配置文件改变一些系统变量的默认值。但大多数的系统变量都可以在服务器运行的过程中修改,只是这种修改是临时的,服务器重启就重置了。

查询系统变量

SHOW VARIABLES [LIKE 匹配的模式]

系统变量非常多,如果直接使用"SHOW VARIABLES;",查询就刷屏了,所以我们在查询的时候通常会带一个 "LIKE" 过滤条件,只查询我们需要的系统变量,比如:

SHOW VARIABLES LIKE 'default_storage_engine'; 

image.png

也可以使用 "%" 进行模糊匹配

SHOW VARIABLES LIKE 'default%';

image.png

系统变量的范围

不同的客户端连接到一个服务器程序时,对于同一个系统变量可以让不同的客户端拥有不同的值,比如:有A、B两个客户端连接到了服务器,A客户端要用InnoDB,但B客户端要用MyISAN。这样虽然很方便,各个客户端互不干扰。但是有一些系统变量并不是只针对单个客户端的,比如,允许的最大连接数,缓存大小;这些系统变量让某个客户端私有是不合适的。为了解决这种问题,提出了 作用范围 的概念

作用范围分为两张

  • GLOBAL:全局变量,会影响服务器的整体操作
  • SESSION:会话变量,影响某一个客户端的操作(SESSION有个别:LOCAL)

在服务器程序启动的时候,会将每个全局变量初始化默认值。然后服务器为每一个客户端维护一组会话变量,客户端的会话变量在连接到服务器时,使用服务器默认变量作为初始值。

通过启动选项设置的系统变量都是全局的,作用范围都是 "GLOBAL" ,也就是对所以的客户端都有效。

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

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

例:客户端设置全局使用存储引擎

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

例:客户端设置会话使用存储引擎

语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;

设置客户端会话系统变量可以省略 "SESSION"

SET default_storage_engine = MyISAM;

查询系统变量的作用范围

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

注意事项

并不是所有的系统变量都要GLOBAL和SESSION两个作用范围

  • max_connextions 只有 GLOBAL 范围
  • insert_id 只有 SESSION 范围,表示在对某个包含 AUTO_INCREMENT 列进行插入时,该列初始化的值

有一些系统变量只能读取,不能修改

  • version 表示当前MySQL的版本,我们就无法修改,只能查看

# mysql