day02
设置项一般都有各自的默认值,比方说服务器允许同时连入的客户端的默认数量是151
,表的默认存储引擎是InnoDB
,我们可以在程序启动的时候去修改这些默认值,对于这种在程序启动时指定的设置项也称之为启动选项(startup options)
在命令行上使用选项
- 使用
mysql --help
可以看到mysql
程序支持的启动选项 - 使用
mysqld_safe --help
可以看到mysqld_safe
程序支持的启动选项 - 使用
mysqld --verbose --help
可以查看mysqld
支持的启动选项有些特别
如果我们在启动服务器程序的时候就禁止各客户端使用
TCP/IP
网络进行通信,可以在启动服务器程序的命令行里添加skip-networking
启动选项,就像这样:
mysqld --skip-networking
如果选项名是由多个单词构成的,它们之间可以由短划线-
连接起来,也可以使用下划线_
连接起来,也就是说skip-networking
和skip_networking
表示的含义是相同的。所以上边的写法与下边的写法是等价的:
mysqld --skip_networking
如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
mysqld --default-storage-engine=MyISAM
在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
在命令行上指定有值的启动选项时需要注意,
选项名、=、选项值之间不可以有空白字符
,比如写成下边这样就是不正确的:
mysqld --default-storage-engine = MyISAM
选项的长形式和短形式
长形式 | 短形式 | 含义 |
---|---|---|
–host | -h | 主机名 |
–user | -u | 用户名 |
–password | -p | 密码 |
–port | -P | 端口 |
–version | -V | 版本信息 |
- 短形式的选项名只有一个字母,与使用长形式选项时需要在选项名前加两个短划线
--
不同的是,使用短形式选项时在选项名前只加一个短划线-
前缀
我们在启动服务器程序时指定监听的端口号:
mysqld -P3307
使用短形式指定启动选项时,选项名和选项值之间可以没有间隙,或者用空白字符隔开(-p
选项有些特殊,-p
和密码值之间不能有空白字符),也就是说上边的命令形式和下边的是等价的:
mysqld -P 3307
配置文件中使用选项
我们把需要设置的启动选项都写在这个配置文件
中,每次启动服务器的时候都从这个文件里加载相应的启动选项
。由于这个配置文件可以长久的保存在计算机的硬盘里,所以只需我们配置一次,以后就都不用显式的把启动选项都写在启动命令行中了,所以我们推荐使用配置文件的方式来设置启动选项
。
类Unix操作系统中的配置文件
在类
UNIX
操作系统中,MySQL
会按照下列路径来寻找配置文件:
路径名 | 备注 |
---|---|
/etc/my.cnf | |
/etc/mysql/my.cnf | |
SYSCONFDIR/my.cnf | |
$MYSQL_HOME/my.cnf | 特定于服务器的选项(仅限服务器) |
defaults-extra-file | 命令行指定的额外配置文件路径 |
~/.my.cnf | 用户特定选项 |
~/.mylogin.cnf | 用户特定的登录路径选项(仅限客户端) |
配置文件的内容
与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]
扩起来,像这样:
[server]
(具体的启动选项...)
[mysqld]
(具体的启动选项...)
[mysqld_safe]
(具体的启动选项...)
[client]
(具体的启动选项...)
[mysql]
(具体的启动选项...)
[mysqladmin]
(具体的启动选项...)
像这个配置文件里就定义了许多个组,组名分别是server
、mysqld
、mysqld_safe
、client
、mysql
、mysqladmin
。每个组下边可以定义若干个启动选项,我们以[server]
组为例来看一下填写启动选项的形式(其他组中启动选项的形式是一样的):
[server]
option1 #这是option1,该选项不需要选项值
option2 = value2 #这是option2,该选项需要选项值
...
在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不允许加
--
前缀,并且每行只指定一个选项,而且=
周围可以有空白字符(命令行中选项名、=
、选项值之间不允许有空白字符)。另外,在配置文件中,我们可以使用#
来添加注释,从#
出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这些注释内容。
[mysqld]
组应用于mysqld
服务器程序[mysql]
组应用于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] |
配置文件的优先级
MySQL
将按照我们在上表中给定的顺序依次读取各个配置文件,如果该文件不存在则忽略。值得注意的是,如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准。
比方说
/etc/my.cnf
文件的内容是这样的:
[server]
default-storage-engine=InnoDB
而
~/.my.cnf
文件中的内容是这样的:
[server]
default-storage-engine=MyISAM
又因为~/.my.cnf
比/etc/my.cnf
顺序靠后,所以如果两个配置文件中出现相同的启动选项,以~/.my.cnf
中的为准,所以MySQL
服务器程序启动之后,default-storage-engine
的值就是MyISAM
。
同一个配置文件中多个组的优先级
我们说同一个命令可以访问配置文件中的多个组,比如mysqld
可以访问[mysqld]
、[server]
组,如果在同一个配置文件中,比如~/.my.cnf
,在这些组里出现了同样的配置项,比如这样:
[server]
default-storage-engine=InnoDB
[mysqld]
default-storage-engine=MyISAM
那么,将以最后一个出现的组中的启动选项为准,比方说例子中default-storage-engine
既出现在[mysqld]
组也出现在[server]
组,因为[mysqld]
组在[server]
组后边,就以[mysqld]
组中的配置项为准。
defaults-file的使用
如果我们不想让
MySQL
到默认的路径下搜索配置文件(就是上表中列出的那些),可以在命令行指定defaults-file
选项,比如这样(以UNIX
系统为例):
mysqld --defaults-file=/tmp/myconfig.txt
这样,在程序启动的时候将只在
/tmp/myconfig.txt
路径下搜索配置文件。如果文件不存在或无法访问,则会发生错误。
注意
defaults-extra-file
和defaults-file
的区别,使用defaults-extra-file
可以指定额外的配置文件搜索路径(也就是说那些固定的配置文件路径也会被搜索)。
命令行和配置文件中启动选项的区别
如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!比如我们在配置文件中写了:
[server]
default-storage-engine=InnoDB
而我们的启动命令是:
mysql.server start --default-storage-engine=MyISAM
那最后default-storage-engine
的值就是MyISAM
!
系统变量
系统变量简介
MySQL
服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为MySQL
系统变量,比如允许同时连入的客户端数量用系统变量max_connections
表示,表的默认存储引擎用系统变量default_storage_engine
表示,查询缓存的大小用系统变量query_cache_size
表示,MySQL
服务器程序的系统变量有好几百条,我们就不一一列举了。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。大多数的系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。
查看系统变量
我们可以使用下列命令查看MySQL
服务器程序支持的系统变量以及它们的当前值:
SHOW VARIABLES [LIKE 匹配的模式];
由于系统变量
实在太多了,如果我们直接使用SHOW VARIABLES
查看的话就直接刷屏了,所以通常都会带一个LIKE
过滤条件来查看我们需要的系统变量的值,比方说这么写:
设置不同作用范围的系统变量
我们前边说过,多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的值。比方说狗哥使用客户端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
的,也就是对所有客户端都有效的,因为在系统启动的时候还没有客户端程序连接进来呢。
在服务器程序运行期间通过客户端程序设置系统变量的语法:
SET [GLOBAL|SESSION] 系统变量名 = 值;
或者写成这样也行:
SET [@@(GLOBAL|SESSION).]var_name = XXX;
比如我们想在服务器运行过程中把作用范围为
GLOBAL
的系统变量default_storage_engine
的值修改为MyISAM
,也就是想让之后新连接到服务器的客户端都用MyISAM
作为默认的存储引擎,那我们可以选择下边两条语句中的任意一条来进行设置:
语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;
- 如果只想对本客户端生效,也可以选择下边三条语句中的任意一条来进行设置:
语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;
SET 系统变量名 = 值
和SET SESSION 系统变量名 = 值
是等价的
查看不同作用范围的系统变量
既然
系统变量
有作用范围
之分,那我们的SHOW VARIABLES
语句查看的是什么作用范围
的系统变量
呢?
答:默认查看的是SESSION
作用范围的系统变量。
当然我们也可以在查看系统变量的语句上加上要查看哪个
作用范围
的系统变量,就像这样:
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];
注意:如果某个客户端改变了某个系统变量在
GLOBAL
作用范围的值,并不会影响该系统变量在当前已经连接的客户端作用范围为SESSION
的值,只会影响后续连入的客户端在作用范围为SESSION
的值
启动选项和系统变量的区别
启动选项
是在程序启动时我们程序员传递的一些参数,而系统变量
是影响服务器程序运行行为的变量,它们之间的关系如下:
- 大部分的系统变量都可以被当作启动选项传入
- 有些系统变量是在程序运行过程中自动生成的,是不可以当作启动选项来设置,比如
auto_increment_offset
、character_set_client
啥的 - 有些启动选项也不是系统变量,比如
defaults-file