MySQL的启动选项和配置文件

425 阅读8分钟

MySQL作为一个数据库服务运行在我们的系统中,竟然是可以运行的服务,那就说明是可以启动的。竟然可以启动就说明是可以按照某种选项进行启动运行的。所以就有各种配置选项。

启动选项

MySQL的设置项一般都有各自的默认值,例如表的默认存储引擎为InnoDB,但是我们可以在程序启动的时候去修改这些默认值。对于这种行为也称之为启动选项

启动选项的设置可以有两种方式:

  1. 在命令行上使用选项
  2. 配置文件中使用选项

在命令行上使用选项

在命令行中使用选项,就是我们在命令控制台中通过命令指定启动选项时需要在选项名前加上前缀--。如果选项名是右多个单词构成的,它们直接是可以通过

  1. 短划线-
  2. 下划线_

连接起来。例如

mysqld --default-storage-engine=MyISAM
mysqld --default_storage_engine=MyISAM

他们的效果都是等价的,都可以成功的设置默认的存储引擎为MyISAM(建议使用配置文件配置)

在启动服务器程序的命令行后边指定启动选项的通用格式

--启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n]
  1. 各个启动选项之间使用空白字符隔开,在每一个启动选项名称前 边添加 --
  2. 对于不需要值的启动选项(skip-networking) ,它们就不需要指定对应的值。对于需要指定值的启动选项(default-storage-engine=MyISAM)我们在指定这个设置项的时候需要显式的指定它的值。
  3. 选项名、=、选项值之间不可以有空白字符 mysqld --default-storage-engine = MyISAM 这就是错误的。

每个MySQL程序都有许多不同的选项。大多数程序提供了一个--help选项,你可以查看该程序支持的全部启动选项以及它们的默认值。 例如,可以使用mysql --help可以看到mysql程序支持的启动选项, mysqld_safe --help可以看到 mysqld_safe 程序支持的启动选项。不过查看mysqld支持的启动选项有些特别,需要使用mysqld -- verbose --help

选项的长短形式

选项又分为长短两种形式。前面提到的default-storage-engine就是长形式了,如果不是专门使用还是很能熟练的一次写出来的。所有为了方便快速的使用,又提供了一些常用选项的短形式。例如下表:

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

这些都是我们使用MySQL客户端连接Server会使用到的,不过我们都是用的短形式(师傅刚开始也没教长形式啊~)。聪明的小伙伴已经发现了,短形式是区分大小写的。例如密码、端口两个的短形式就分别是p字母的大小写。

配置文件中使用选项

在命令行中设置启动选项只对当此启动生效。(很多框架、服务都遵循这一规则)并且为了能更有效的管理配置当前服务,所以我们还是建议使用配置文件(选项文件)来进行配置。每次服务启动,服务就会读取到配置文件中的配置,按照配置文件中的配置来启动服务。循环往复。但是MySQL是从哪里读取这些配置文件呢???

配置文件的路径

目前主流的操作系统就分为两大阵营Windowss、Linux(类Unix) 。所以配置文件在不同系统的路径也有稍许差别。

Windows

在 Windows 操作系统中, MySQL 会按照下列路径来寻找配置文件:

路径名备注
%WINDIR%\my.ini,%WINDIR%\my.cnf%WINDIR% 指的是你机器上 Windows 目录的位置,通常是 C:\WINDOWS。可以在环境变量中查看。
C:\my.ini , C:\my.cnf指定路径下的my.ini,my.cnf
BASEDIR\my.ini , BASEDIR\my.cnfBASEDIR指的是 MySQL 安装目录的路径
defaults-extra-file命令行指定的额外配置文件路径。我们在启动程序时可以通过指定 defaults-extra-file 参数的值来添加额外的配置文件路径
%APPDATA%\MySQL.mylogin.cnf登录路径选项(仅限客户端)。可以在环境变量中查看。

.mylogin.cnf配置文件有点儿特殊,它不是一个纯文本文件(其他的配置文件都是纯 文本文件),而是使用mysql_config_editor实用程序创建的加密文件。文件中只能包含一些用于启动客户 端软件时连接服务器的一些选项,包括 host 、 user 、 password 、 port 和 socket 。而且它只能被客户 端程序所使用。mysql_config_editor实用程序其实是MySQL安装目录下的bin目录下的一个可执行文件,这个实用程序有专用的语法来生成或修改 .mylogin.cnf 文件中的内容。

Linux

在 Linux 操作系统中, MySQL 会按照下列路径来寻找配置文件:

路径名备注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnfSYSCONFDIR 表示在使用 CMake 构建 MySQL 时使用 SYSCONFDIR 选项指定的目录。默认情况下,这是位于编 译安装目录下的 etc 目录。
$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][mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序。

image.png

但是有两个选项组比较特别:

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

需要注意的一点是, mysqld_safe 和 mysql.server 这两个程序在启动时都会读取 [mysqld] 选项组中的内容。通过一下表格看看他们能读取哪些选项组:

启动命令类别能读取的组
mysqld启动服务器[mysqld]、[server]
mysqld_safe启动服务器[mysqld]、[server]、[mysqld_safe]
mysql.server启动服务器[mysqld]、[server]、[mysqld.server]
mysql启动客户端[mysql]、[client]
mysqladmin启动客户端[mysqladmin]、[client]
mysqldump启动客户端[mysqldump]、[client]

特定MySQL版本的专用选项组

我们可以通过在选项组后加上特定的MySQL版本号,例如[mysqld-5.7]。它的含义和[mysqld]一样,不过只有版本号为5.7的mysqld程序才能使用。

配置文件的优先级

上面我们提到有多个地方可以读取MySQL配置文件,那么如果存在不同地方多个配置文件,那么相冲突的配置选项改怎么生效呢?它们之间的优先级是什么呢?

如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准。

读取的顺序就是上面的表格行顺序,最后一个配置文件中的为准。 例如在/etc/my.cnf文件中:

[server] 
default-storage-engine=InnoDB

~/.my.cnf文件中的内容是这样的:

[server] default-storage-engine=MyISAM

按照表格顺序~/.my.cnf在后面,所以存储引擎被设置为MyISAM。

同一个配置文件中多个组的优先级

说同一个命令可以访问配置文件中的多个组,将以最后一个组为准。

[server] 
default-storage-engine=InnoDB 

[mysqld] default-storage-engine=MyISA

例子中 default-storage-engine 既出现在 [mysqld] 组 也出现在 [server] 组,因为 [mysqld] 组在 [server] 组后边,就以 [mysqld] 组中的配置项为准。