2、MySQL
的调控按钮–启动选项和系统变量
声明:此博客是本人学习《MySQL是怎样运行的:从根儿上理解MySQL》的学习笔记,侵权必删。如果你发现博客中有错误,还请告诉我,我会第一时间修改并给予您诚挚的感谢ღ( ´・ᴗ・` )。
启动选项
定义
在程序启动时可以设置一些控制程序后续操作的选项,叫做启动项。在
MySQL
的bin目录下的可执行文件基本都可以设置启动选项。
MySQL
程序的启动选项可以在命令行中指定,也可以在配置文件中指定,下面我们来具体看看这两种指定方式有何区别。
在命令行上使用选项
在命令行上使用启动选项的通用格式为:
服务名称 --启动项1[=值1] --启动项2[=值2] … --启动项n[=值n]
也就是说,我们可以在一个程序后面设置多个启动选项,每个启动选项之间用空格分开。
对于命令行上设置的启动选项,有以下注意事项:
- 对于长名称的启动项(如
default-storage-engine
等),前面都要加上“--”
,且名称与“--”
之间不能有空格;对于短名称的启动项(如-h
等),其前面要加上“-”
,同样不能有空格; - 如果启动项必须指定值(如
default-storage-engine
需要指定存储引擎),其值与启动项名称中间用“=”连接; - 选项区分大小写,如
-p
表示密码,-P
表示端口号。
MySQL
程序有那么多的选项,怎么查看启动选项呢?
大多数程序都提供了“
--help
”选项,可以通过该选项查看程序的所有支持的选项及其默认值;有一个例外:
mysqld
,其需要使用mysqld --verbose --help
查看。
选项的长名称和短名称
为了使用的方便,设计人员将一些常用的长名称选项添加了对应的短名称,如host
和h
。长短名称之间有如下区别:
- 前缀不同:长名称前要加
“--”
,短名称前加“-”
; - 规则不同:在选项有值的情况下,长名称的选项与其值之间不能有空格,短名称选项与值之间可以有。如:
-h root
或-hroot
。
其他
启动选项具有传递性。比如通过mysqld_safe --skip_networking
来启动一个服务器程序,mysqld_safe
并不会处理这个选项,因为mysqld_safe
内部调用了mysqld
,该选项就会传递给mysqld
使用。
在配置文件中使用选项(推荐)
MySQL
程序在启动时,会从配置文件中读取对应的配置信息,用来指导程序的各种行为,而Windows
系统下和类Unix
系统下配置文件的位置和名称是不同的,下面就两类平台的配置文件进行具体说明。
对于Windows
系统,MySQL
程序执行时会依次读取下述配置文件:
路径名 | 备注 |
---|---|
%WINDIR\my.ini ,%WINDIR%\my.cnf | 是Windows 目录的位置,一般是C:\\WINDOWS |
C:\my.ini,C:\my.cnf | |
BASEDIR\my.ini,BASEDIR\my.cnf | BASEDIR 是MySQL 安装目录的路径 |
defaults-extra-file | 命令行中指定的额外配置文件路径 |
%APPDATA%\MySQL\mylogin.cnf | 登录路径选项(仅限客户端),APPDATA 是Windows 数据存储的位置。只有该文件不是文本文件,需要用mysql_config_editor 实用工具来修改。 |
对于类Unix
系统,MySQL
程序执行时会依次读取下述配置文件:
路径名 | 备注 |
---|---|
/etc/my.cnf | |
/etc/mysql/my.cnf | |
SYSCONFDIR/my.cnf | 在使用CMake 构建MySQL 时使用SYSCONFDIR 选项指定的目录 |
$MYSQL_HOME/my.cnf | 特定于服务器的选项(仅限服务器)。 这个文件需要我们自己创建,如果我们不创建,默认是 MySQL 安装目录。 |
defaults-extra-file | 命令行指定的额外配置文件路径 |
~/.my.cnf | 用户特定选项 |
~/.mylogin.cnf | 用户特定的登录路径选项(仅限客户端) |
配置文件的内容
对于不同的启动选项,MySQL
会在配置文件中将其分组,比如只能设置于服务器的选项、只能设置在客户端的选项等等。
# 配置文件具体格式如下:
[分组名1] # 分组名要用中括号[]括起来
option1 # 该选项不需要值
option2 = value2 # 该选项的值为 value2
... # 还可以有更多的启动选项
[分组名2]
...
... # 还可以有更多的分组
在一个配置文件中可以有多个分组,每个分组下可以有多个启动选项。例如下方就是一个配置文件的例子:
[client]
# pipe=
# socket=MYSQL
port=3306
[mysql]
no-beep
对于配置文件的内容,有以下注意事项:
-
配置文件中的选项名必须是长名称,且不带任何前缀(“–“或”-”);
-
若选项带值,"="与名称、值之间可以有空格,也可以没有;
-
不同分组都按分组名单独为某一程序使用,比如分组
[mysqld]
只能被mysqld
程序使用,但有两个配置文件例外:- [server]:这个分组下面的选项服务于所有服务器程序,
- [client]:这个分组下面的选项服务于所有客户端程序;
-
上面说过,程序对配置文件的读取都是有顺序的,如果两个配置文件中,或者一个配置文件中的不同位置上有选项重复或冲突,则以后读取的那个为准。
-
如果想要指定服务器的版本才能使用某个选项,可以在该选项分组名上添加版本号。
# 任何版本的mysqld程序都能使用
[mysqld]
(选项...)
# 如果我们在mysqld分组名上添加8.0版本号,那么只有8.0版本的mysqld程序才能使用该分组的选项
[mysqld-8.0]
(选项...)
修改读取配置文件的默认路径
之前表中列出的配置文件路径是每个mysql
程序读取的默认路径,如果我们不想从默认路径读取,那么可以修改指定从哪一个路径读取:
mysqld --defaults-file=/tmp/myconfig.txt
# 经过这样的修改,现在mysqld程序只能从/tmp/myconfig.txt文件下读取配置文件
关于命令行和配置文件中使用启动选项的注意事项:
- 如果一个启动选项同时出现在了命令行和配置文件中,以命令行中的为准;
- 有些启动选项是只能用在命令行中的,如设置额外配置文件的选项
--defaults_config_file
,设置默认读取路径的选项--defaults_file
等。
系统变量
不同于启动选项,我们有时候并不想重启服务器,而是想在服务器运行时控制服务器的行为,这就需要用到系统变量。
系统变量是在服务器运行时影响程序行为的变量。
系统变量的作用范围
有全局变量和会话变量两种,会话变量又称局部变量,分别用GLOBAL
和SESSION
(或LOCAL
)表示。
全局变量对连接到服务器的所有客户端都生效,会话变量只对某一个客户端生效。
查看系统变量
可以通过如下语句查看系统变量:
# 查看全局变量
SHOW GLOBAL VARIABLES; -- 查看所有全局变量
SHOW GLOBAL VARIABLES LIKE '匹配值'; -- 查看对应匹配值的全局变量
# 查看会话变量
SHOW SESSION VARIABLES; -- 查看当前连接所有会话变量
SHOW SESSION VARIABLES LIKE '匹配值'; -- 查看对应匹配值的会话变量
# 对于匹配值的应用,如下图:
设置系统变量:
可以通过如下语句设置系统变量:
# 设置全局变量的两种语法
SET GLOBAL 变量名=变量值;
SET @@GLOBAL.变量名=变量值;
# 设置会话变量的两种语法
SET SESSION 变量名=变量值;
SET @@SESSION.变量名=变量值;
# 例如:
SET GLOBAL default_storage_engine = MyISAM;
-- 等价于
SET @@GLOBAL.default_storage_engine = MyISAM;
也可以通过启动选项设置系统变量:
# 通过命令行
mysqld --default-storage-engine=MyISAM --max-connections=10
# 通过配置文件
[server]
default-storage-engine=MyISAM
max-connections=10
注意:
- 大部分系统变量在设置之后不用重启服务器就可以生效,但是通过配置文件设置的系统变量需要重启;
- 如果设置全局变量,当前连接并不会生效,而是以后连入的连接才会生效。
对于系统变量,有如下的注意事项:
- 对于由多个单词组成的系统变量,单词之间必须用下划线"_“连接,而对应的启动选项可以用”__“或”-"连接;
- 在查看和设置系统变量时,如果没有指定全局或者会话变量,默认是会话变量;如:
# 查看全部会话变量
SHOW VARIABLES;
# 设置会话变量
SET 变量名=变量值;
- 不是所有的系统变量都有全局和会话之分,有些系统变量只有全局属性,比如
max_connections
,表示服务器的最大连接数,而有些系统变量只有会话属性,如insert_id
,表示设置了AUTO_INCRIMENT
的列在增加时的初始值; - 有些系统变量时只读的,不能修改其值,比如
version
。
状态变量
定义:
表示程序运行状态的变量。
注意事项:
-
状态变量不能被程序员设置,是程序运行过程中系统修改的;
-
状态变量也有全局和会话之说,如果不指定,就是会话变量;
查看状态变量:
SHOW GLOBAL STATUS LIKE 'thread%'; -- 查看前缀是thread的全局状态变量