6. 配置文件的使用
6.1 配置文件的格式
6.1配置文件格式
与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号 []扩起来,像这样:
[root@centos7-mysql-1 ~]# vim /etc/my.cnf
[server] (具体的启动选项...) [mysqld] (具体的启动选项...) [mysqld_safe] (具体的启动选项...) [client] (具体的启动选项...) [mysql] (具体的启动选项...) [mysqladmin] (具体的启动选项...)
像这个配置文件里就定义了许多个组,组名分别是server
、 mysqld
、mysqld_safe
、client
、mysql
、
mysqladmin
。每个组下边可以定义若干个启动选项,我们以[server]
组为例来看一下填写启动选项的形式 (其他组中启动选项的形式是一样的)
[server] option1 #这是dption1,该选项不需要选项值 option2=value2 #这是option2,该选项需要选项值
在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中指定的启动选项不允许--前缀,并且
每行只指定一个选项,而且=周围可以有空白字符(命令行中选项名、=、选项值之间不允许有空白字符)。另
外,在配置文件中,我们可以使用#来添加注释,从#出现直到行尾的内容都属于注释内容,读取配置文件时会
忽略这些注释内容。
6.2 启动命令与选项组
[root@centos7-mysql-1 ~]# cd /usr/bin [root@centos7-mysql-1 bin]# ls
[root@centos7-mysql-1 bin]# cd /usr/sbin [root@centos7-mysql-1 sbin]# ls
配置文件中不同的选项组是给不同的启动命令使用的。不过有两个选项组比较特别:
- [serverl组下边的启动选项将作用于所有的服务 器程序。
- [client]组下边的启动选项将作用于所有的客户端程序。
下面是启动命令能读取的选项组都有哪些:
比如,在/etc/mysql/my.cnf
这个配置文件中添加一些内容:
[server] skip-networking default-storage-engine=MyISAM
然后直接用mysqld
启动服务器程序:
mysqld
虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们上边提到的配置文件路径下查找配置文件,其中就包括/etc/my.cnf。又由于mysqld命令可以读取[server]选项组的内容,所以skip-networking和default-storage-engine=MyISAM这两个选项是生效的。你可以把这些启动选项放在 [client]组里再试试用mysqld启动服务器程序,就不生效。
6.3特定MySQL版本的专用选项组
我们可以在选项组的名称后加上特定的MySQL
版本号,比如对于[mysqld]
选项组来说,我们可以定义一个 [mysqld-5.7]
的选项组,它的含义和[mysqld]
一样,只不过只有版本号为5.7
的mysqld
程序才能使用这个选项组中的选项。
6.4同一个配置文件中多个组的优先级
我们说同一个命令可以访问配置文件中的多个组,比如mysqld
可以访问[mysqld]
、[server]
组,如果在同一个配置文件中,比如~/.my.cnf
,在这些组里出现了同样的配置项,比如这样:
[server] default-storage-engine=InnoDB [mysqld] default-storage-engine=MyISAM
那么,将以最后一个出现的组中的启动选项为准,比方说例子中default-storage-engine
既出现在[mysqld]
组也出现在[server]
组,因为[mysqld]
组在[server]
组后边,就以[mysqld]
组中的配置项为准。
6.5命令行和配置文件中启动选项的区别
在命令行上指定的绝大部分启动选项都可以放到配置文件中,但是有一些选项是专门为命令行设计的,比方说 defaults-extra-file、 defaults-file这样的选项本身就是为了指定配置文件路径的,再放在配置文件中使用就没啥意义了。
如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!比如我们在配置文件中写了:
[server] default-storage-engine=InnoDB
而我们的启动命令是:
mysql.server start --default-storage-engine=MyISAM
7. 系统变量(复习)
7.1系统变量简介
变量由系统定义,不是用户定义,属于服务器层面。启动MySQL服务,生成MySQL服务实例期间,MySQL将为 MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例的属性、特征。这些系统变量的值要么是编译MySQL时参数的默认值,要么是配置文件(例如my.ini等)中的参数值。大家可以通过网址
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html查看MySQL文档的系统变量。
系统变量分为全局系统变量(需要添加global关键字)以及会话系统变量(需要添加session关键字),有时也把全局系统变量简称为全局变量,有时也把会话系统变量称为local变量。如果不写,默认会话级别。静态变量(在MySQL服务实例运行期间它们的值不能使用set动态修改)属于特殊的全局系统变量。
每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在 MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制。 如下图:
7.2 查看系统变量
- 查看所有或部分系统变量
#查看所有全局变量 SHOW GLOBAL VARIABLES: #查看所有会话变量 SHOW SESSION VARIABLES; #或 SHOW VARIABLES;
#查看满足条件的部分系统变量。 SHOW GLOBAL VARIABLES LIKE'%标识符%'; #查看满足条件的部分会话变量 SHOW SESSION VARIABLES LIKE '%标识符%';
举例:
SHOW GLOBAL VARIABLES LIKE 'admin_%’;
- 查看指定系统变量
作为MvSQL编码规范,MvSQL中的系统变量以两个“@”
开头,其中“@@global”仅用王标记全局系统变
量,“@@session”仅用于标记会话系统变量。“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。
#查看指定的系统变量的值 SELECT @dglobal.变量名; #查看指定的会话变量的值 SELECT @@session.变量名; #或者 SELECT @@变量名
7.3 设置系统变量
有些时候,数据库管理员需要修改系统变量的默认值,以便修改当前会话或者MySQL服务实例的属性、特征。具体方法;
7.3.1通过启动选项设置
大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项我们总结一下, 主要是两种方式:
- 通过命令行添加启动选项
比方说我们在启动服务器程序时用这个命令:
mysqld --default-storage-engine=MyISAM --max-connections=10
- 通过配置文件添加启动选项
我们可以这样填写配置文件:
[server] default-storage-engine=MyISAM max-connections=10
当使用上边两种方式中的任意一种启动服务器程序后,我们再来查看一下系统变量的值:
mysql> SHOW VARIABLES LIKE 'default_storage_engine'; | Variable_name | Value | +------------------------+--------+ | default_storage_engine | MyISAM | +------------------------+--------+ 1 row in set (0.05 sec)
可以看到default_storage_engine和max_connections这两个系统变量的值已经被修改了。有一点需要注意 的是,对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线-或者下划线_连接起来都 可以,但是它对应的系统变量的单词之间必须使用下划线_连接起来。
7.3.2 服务器出现运行过程中设置
对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。但是,系统变量有作用范围之分。
设置不同作用范围的系统变量
多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的值。比方说客户端A,他想让当前客户端对应的默认存储引擎为InnoDB,所以他可以把系统变量default_storage_engine的值设置为InnoDB;客户端B,他想让当前客户端对应的默认存储引擎为MyISAM,所以他可以把系统变量default_storage_engine的值设置为MyISAM。这样两个客户端拥有不同的默认存储引擎,使用时互不影响,十分方便。但是这样各个客户端都私有一份系统变量会产生这么两个问题:
有一些系统变量并不是针对单个客户端的,比如允许同时连接到服务器的客户端数量max_connections,查 询缓存的大小query_cache_size,这些公有的系统变量让某个客户端私有显然不合适。
一个新连接到服务器的客户端对应的系统变量的值该怎么设置?
为了解决这两个问题,MySQL提出了系统变量作用范围的概念,具体来说作用范围分为这两种:
GLOBAL:全局变量,影响服务器的整体操作。
SESSION:会话变量,影响某个客户端连接的操作。(注:SESSION有个别名叫LOCAL)
在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认 值)。然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。
以default_storage_engine举例,在服务器启动时会初始化一个名为default_storage_engine,作用范围为GLOBAL的系统变量。之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为 default_storage_engine,作用范围为SESSION的系统变量,该作用范围为SESSION的系统变量值按照当前作用范围为GLOBAL的同名系统变量值进行初始化。
很显然,通过启动选项设置的系统变量的作用范围都是GLOBAL的,也就是对所有客户端都有效的,因为在系统 启动的时候还没有客户端程序连接进来呢。了解了系统变量的GLOBAL和SESSION作用范围之后,我们再看一下在服务器程序运行期间通过客户端程序设置系统变量的语法:
SET [GLOBAL|SESSION]系统变量名=值;
或者写成这样也行:
SET [@@(GLOBAL| SESSION).]var_name = XXX;
比如,服务器运行过程中把作用范围为GLOBAL
的系统变量default_storage_engine
的值修改为MyISAM
,也就是想让之后新连接到服务器的客户端都用MyISAM作为默认的存储引擎,那我们可以选择下边两条语句中的任意一条来进行设置:
#方式一: Tl SET GLOBAL default_storage_engine = MyISAM; #方式二: SET @@GL0BAL.default_storage_engine = MyISAM;
如果只想对本客户端生效,也可以选择下边三条语句中的任意一条来进行设置:
#方式一: SET SESSION default_storage_engine = MyISAM; #方式二: sET @@SESSION.default_storage_engine = MyISAM; #方式三: SET default_storage_engine = MyISAM;
从上边的方式三可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION
。也就是说SET 系统变量名 = 值
和SET SESSION 系统变量名 = 值
是等价的。
查看不同作用范围的系统变量
既然系统变量有作用范围之分,那我们的SHOW VARIABLES
语句查看的是什么作用范围的系统变量呢?
答:默认查看的是SESSION
作用范围的系统变量。
我们也可以在查看系统变量的语句上加上要查看哪个作用范围
的系统变量:
SHOW [GLOBALI SESSION] VARIABLES [LIKE 匹配的模式];
下边我们演示一下完整的设置并查看系统变量的过程:
mysql> SHOW SESSION VARIABLES LIKE 'default_storage_engine'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | +------------------------+--------+ 1 row in set (0.01 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)
可以看到,最初default_storage_engine的系统变量无论是在GLOBAL作用范围上还是在SESSION作用范围 上的值都是InnoDB,我们在SESSION作用范围把它的值设置为MyISAM之后,可以看到GLOBAL作用范围的值并没有改变。
小贴士:如果某个客户端改变了某个系统变量在GLOBAL作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION的值,只会影响后续连入的客户端在作用范围为SESSION的值。
注意事项
并不是所有系统变量都具有GLOBAL
和SESSION
的作用范围。
有一些系统变量只具有GLOBAL作用范围,比方说max_connections,表示服务器程序支持同时最多有多少 个客户端程序进行连接。
有一些系统变量只具有SESSION作用范围,比如insert_id,表示在对某个包含AUTO_INCREMENT列的表进行插入时,该列初始的值。
有一些系统变量的值既具有GLOBAL作用范围,也具有SESSION作用范围,比如我们前边用到的default_storage_engine,而且其实大部分的系统变量都是这样的
有些系统变量是只读的,并不能设置值。
比方说version,表示当前MySQL的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES语句里查看。
2022/7/30 11:17
最后
p105~p109
Markdown 41609 字数 1571 行数
HTML 36828 字数 897 段落