Mysql之启动选项和配置文件

如果你用过手机,你的手机上一定有一个设置的功能,你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。 假如没有这些设置功能,我们的生活将置于尴尬的境地,比如在图书馆里无法把手机设置为静音,无法把流量开关关掉以节省 流量,在别人得知解锁密码后无法更改密码~ MySQL的服务器程序和客户端程序也有很多设置项,比如对于MySQL服务器程 序,我们可以指定诸如允许同时连入的客户端数量、客户端和服务器通信方式、表的默认存储引擎、查询缓存的大小吧啦吧啦 的设置项。

这些设置项一般都有各自的默认值,比方说服务器允许同时连入的客户端的默认数量是151,表的默认存储引擎是InnoDB,我 们可以在程序启动的时候去修改这些默认值,对于这种在程序启动时指定的设置项也称之为启动选项(startup options),这些 选项控制着程序启动后的行为。在MySQL安装目录下的bin目录中的各种可执行文件,不论是服务器相关的程序(比 如mysqld、mysqld_safe)还是客户端相关的程序(比如mysql、mysqladmin),在启动的时候基本都可以指定启动参数。这些 启动参数可以放在命令行中指定,也可以把它们放在配置文件中指定。下边我们会以mysqld为例,来详细唠叨指定启动选项的 格式。

在命令行上使用选项

如果我们在启动客户端程序时在-h参数后边紧跟服务器的IP地址,这就意味着客户端和服务器之间需要通过TCP/IP网络进行通 信。因为我的客户端程序和服务器程序都装在一台计算机上,所以在使用客户端程序连接服务器程序时指定的主机名 是127.0.0.1的情况下,客户端进程和服务器进程之间会使用TCP/IP网络进行通信。如果我们在启动服务器程序的时候就禁止 各客户端使用TCP/IP网络进行通信,可以在启动服务器程序的命令行里添加skip-networking启动选项,就像这样:
mysqld --skip-networking可以看到,我们在命令行中指定启动选项时需要在选项名前加上--前缀。另外,如果选项名是由多个单词构成的,它们之间可 以由短划线-连接起来,也可以使用下划线_连接起来,也就是说skip-networking和skip_networking表示的含义是相同的。所 以上边的写法与下边的写法是等价的:
mysqld --skip_networking 在按照上述命令启动服务器程序后,如果我们再使用mysql来启动客户端程序时,再把服务器主机名指定为127.0.0.1(IP地址的形式)的话会显示连接失败:

mysql -h127.0.0.1 -uroot -p Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)

这就意味着我们指定的启动选项skip-networking生效了!

再举一个例子,我们前边说过如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用InnoDB作为表的存储引 擎。如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
mysqld --default-storage-engine=MyISAM 我们现在就已经把表的默认存储引擎改为MyISAM了,在客户端程序连接到服务器程序后试着创建一个表:

mysql> -> ->
CREATE TABLE sys_var_demo( i INT
);
Query OK, 0 rows affected (0.02 sec)

这个定义语句中我们并没有明确指定表的存储引擎,创建成功后再看一下这个表的结构:

mysql> SHOW CREATE TABLE sys_var_demo\G *************************** 1. row ***************************
Table: sys_var_demo
Create Table: CREATE TABLE `sys_var_demo` (
`i` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 1 row in set (0.01 sec)

可以看到该表的存储引擎已经是MyISAM了,说明启动选项default-storage-engine生效了。

所以在启动服务器程序的命令行后边指定启动选项的通用格式就是这样的:
--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]

也就是说我们可以将各个启动选项写到一行中,各个启动选项之间使用空白字符隔开,在每一个启动选项名称前边添加--。对 于不需要值的启动选项,比方说skip-networking,它们就不需要指定对应的值。对于需要指定值的启动选项,比如default- storage-engine我们在指定这个设置项的时候需要显式的指定它的值,比方说InnoDB、MyISAM啦什么的~ 在命令行上指定有 值的启动选项时需要注意,选项名、=、选项值之间不可以有空白字符,比如写成下边这样就是不正确的:

mysqld --default-storage-engine = MyISAM

选项的长形式和短形式
我们前边提到的skip-networking、default-storage-engine称之为长形式的选项(因为它们很长),设计MySQL的大叔为了我 们使用的方便,对于一些常用的选项提供了短形式,我们列举一些具有短形式的启动选项来瞅瞅(MySQL支持的短形式选项太 多了,全列出来会刷屏的):

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

短形式的选项名只有一个字母,与使用长形式选项时需要在选项名前加两个短划线--不同的是,使用短形式选项时在选项名前
只加一个短划线-前缀。有一些短形式的选项我们之前已经接触过了,比方说我们在启动服务器程序时指定监听的端口号:

mysqld -P3307

使用短形式指定启动选项时,选项名和选项值之间可以没有间隙,或者用空白字符隔开(-p选项有些特殊,-p和密码值之间不 能有空白字符),也就是说上边的命令形式和下边的是等价的:
mysqld -P 3307
另外,选项名是区分大小写的,比如-p和-P选项拥有完全不同的含义,大家需要注意一下。

配置文件中使用选项

在命令行中设置启动选项只对当次启动生效,也就是说如果下一次重启程序的时候我们还想保留这些启动选项的话,还得重复 把这些选项写到启动命令行中,这样真的神烦唉!于是设计MySQL的大叔们提出一种配置文件(也称为选项文件)的概念,我们把 需要设置的启动选项都写在这个配置文件中,每次启动服务器的时候都从这个文件里加载相应的启动选项。由于这个配置文件 可以长久的保存在计算机的硬盘里,所以只需我们配置一次,以后就都不用显式的把启动选项都写在启动命令行中了,所以我 们推荐使用配置文件的方式来设置启动选项。

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

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

像这个配置文件里就定义了许多个组,组名分别是server、mysqld、mysqld_safe、client、mysql、mysqladmin。每个组下边 可以定义若干个启动选项,我们以[server]组为例来看一下填写启动选项的形式(其他组中启动选项的形式是一样的):

[server]
option1 #这是option1,该选项不需要选项值
option2 = value2 #这是option2,该选项需要选项值 ...

在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中只能使用长形式的选项。在配置文件中指定的启动选项 不允许加--前缀,并且每行只指定一个选项,而且=周围可以有空白字符(命令行中选项名、=、选项值之间不允许有空白字 符)。另外,在配置文件中,我们可以使用#来添加注释,从#出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这 些注释内容。为了大家更容易对比启动选项在命令行和配置文件中指定的区别,我们再把命令行中指定option1和option2两个 选项的格式写一遍看看:
--option1 --option2=value2

配置文件中不同的选项组是给不同的启动命令使用的,如果选项组名称与程序名称相同,则组中的选项将专门应用于该程序。 例如, [mysqld]和[mysql]组分别应用于mysqld服务器程序和mysql客户端程序。不过有两个选项组比较特别:

  • [server]组下边的启动选项将作用于所有的服务器程序。
  • [client]组下边的启动选项将作用于所有的客户端程序。

需要注意的一点是,mysqld_safe和mysql.server这两个程序在启动时都会读取[mysqld]选项组中的内容。为了直观感受一 下,我们挑一些启动命令来看一下它们能读取的选项组都有哪些:


image.png

现在我们以macOS操作系统为例,在/etc/mysql/my.cnf这个配置文件中添加一些内容(Windows系统参考上边提到的配置文件 路径):

[server]
skip-networking default-storage-engine=MyISAM

然后直接用mysqld启动服务器程序:
mysqld
虽然在命令行没有添加启动选项,但是在程序启动的时候,就会默认的到我们上边提到的配置文件路径下查找配置文件,其中 就包括/etc/mysql/my.cnf。又由于mysqld命令可以读取[server]选项组的内容,所以skip-networking和default-storage- engine=MyISAM这两个选项是生效的。你可以把这些启动选项放在[client]组里再试试用mysqld启动服务器程序,看一下里边 的启动选项生效不(剧透一下,不生效)。

配置文件的优先级
我们前边唠叨过MySQL将在某些固定的路径下搜索配置文件,我们也可以通过在命令行上指定defaults-extra-file启动选项来 指定额外的配置文件路径。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-filedefaults-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过滤条件来查 看我们需要的系统变量的值,比方说这么写:

image.png

可以看到,现在服务器程序使用的默认存储引擎就是InnoDB,允许同时连接的客户端数量最多为151。别忘了LIKE表达式后边 可以跟通配符来进行模糊查询,也就是说我们可以这么写:


image.png

这样就查出了所有以default开头的系统变量的值。

设置系统变量

通过启动选项设置
大部分的系统变量都可以通过启动服务器时传送启动选项的方式来进行设置。如何填写启动选项我们上边已经花了大篇幅来唠 叨了,就是下边两种方式:
通过命令行添加启动选项。 比方说我们在启动服务器程序时用这个命令:
mysqld --default-storage-engine=MyISAM --max-connections=10 通过配置文件添加启动选项。
我们可以这样填写配置文件:
[server]
default-storage-engine=MyISAM
max-connections=10

当使用上边两种方式中的任意一种启动服务器程序后,我们再来查看一下系统变量的值:


image.png

可以看到default_storage_engine和max_connections这两个系统变量的值已经被修改了。有一点需要注意的是,对于启动选 项来说,如果启动选项名由多个单词组成,各个单词之间用短划线-或者下划线连接起来都可以,但是对应的系统变量之间必 须使用下划线连接起来。

服务器程序运行过程中设置
系统变量比较牛逼的一点就是,对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并
重启服务器。不过系统变量有作用范围之分,下边详细唠叨下。

设置不同作用范围的系统变量
我们前边说过,多个客户端程序可以同时连接到一个服务器程序。对于同一个系统变量,我们有时想让不同的客户端有不同的 值。比方说狗哥使用客户端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作为默认的存储引擎,那我们可以选择下边两条语句中的任意一条来进行设置:

语句一: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;

从上边的语句三也可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是SESSION。也就是说SET 系统 变量名 = 值和SET SESSION 系统变量名 = 值是等价的。

查看不同作用范围的系统变量
既然系统变量有作用范围之分,那我们的SHOW VARIABLES语句查看的是什么作用范围的系统变量呢?

答:默认查看的是SESSION作用范围的系统变量。
当然我们也可以在查看系统变量的语句上加上要查看哪个作用范围的系统变量,就像这样: SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];

下边我们演示一下完整的设置并查看系统变量的过程:


image.png

可以看到,最初default_storage_engine的系统变量无论是在GLOBAL作用范围上还是在SESSION作用范围上的值都是InnoDB, 我们在SESSION作用范围把它的值设置为MyISAM之后,可以看到GLOBAL作用范围的值并没有改变。

小贴士: 如果某个客户端改变了某个系统变量在GLOBAL作用范围的值,并不会影响该系统变量在当前已经连接 的客户端作用范围为SESSION的值,只会影响后续连入的客户端在作用范围为SESSION的值。

注意事项

  • 并不是所有系统变量都具有GLOBAL和SESSION的作用范围
  1. 有一些系统变量只具有GLOBAL作用范围,比方说max_connections,表示服务器程序支持同时最多有多少个客户端 程序进行连接。
  2. 有一些系统变量只具有SESSION作用范围,比如insert_id,表示在对某个包含AUTO_INCREMENT列的表进行插入时, 该列初始的值。
  3. 有一些系统变量的值既具有GLOBAL作用范围,也具有SESSION作用范围,比如我们前边用到 的default_storage_engine,而且其实大部分的系统变量都是这样的,
  • 有些系统变量是只读的,并不能设置值。 比方说version,表示当前MySQL的版本,我们客户端是不能设置它的值的,只能在SHOW VARIABLES语句里查看。

启动选项和系统变量的区别
启动选项是在程序启动时我们程序员传递的一些参数,而系统变量是影响服务器程序运行行为的变量,它们之间的关系如下:

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

状态变量

为了让我们更好的了解服务器程序的运行情况,MySQL服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变 量。比方说Threads_connected表示当前有多少客户端与服务器建立了连接,Handler_update表示已经更新了多少行记录吧啦 吧啦,像这样显示服务器程序状态信息的状态变量还有好几百个,我们就不一一唠叨了,等遇到了会详细说它们的作用的。

由于状态变量是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。 与系统变量类似,状态变量也有GLOBAL和SESSION两个作用范围的,所以查看状态变量的语句可以这么写:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];

类似的,如果我们不写明作用范围,默认的作用范围是SESSION,比方说这样:


image.png

所有以Thread开头的SESSION作用范围的状态变量就都被展示出来了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351