MySQL 的服务器程序和客户端程序有很多设置项,比如:对于 MySQL 服务器程序,我们可以指定诸如允许同时连入的客户端数量、客户端和服务器通信方式、表的默认存储引擎、查询缓存的大小等的设置项。
对于 MySQL 客户端程序,可以指定需要连接的服务器程序所在主机的主机名或 IP 地址、用户名及密码等信息。
这些设置项一般都有各自的默认值,比方说:

  • 服务器允许同时连入的客户端的默认数量是 151
  • 表的默认存储引擎是 InnoDB

我们可以在程序启动的时候去修改这些默认值,对于这种在程序启动时指定的设置项也称之为启动选项(startup options),这些选项控制着程序启动后的行为。
启动参数可以放在命令行中指定,也可以把它们放在配置文件中指定。
下边以服务端 mysqld 为例,来说明指定启动选项的格式。

在命令行上使用选项

在命令行中指定启动选项时需要在选项名前加上 — 前缀。
如果选项名是由多个单词构成的,它们之间可以由短划线 - 连接起来,也可以使用下划线 _ 连接起来。
也就是说 skip-networkingskip_networking 表示的含义是相同的。


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

  • 对于不需要值的启动选项,比方说 skip-networking ,它们就不需要指定对应的值
  • 在命令行上指定有值的启动选项时需要注意:选项名、=、选项值之间不可以有空白字符

选项的长形式和短形式
例如 skip-networking、default-storage-engine 称为长形式的选项(因为它们很长)
MySQL 对于一些常用的选项提供了短形式,如下所示:

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

短形式的选项名只有一个字母,使用短形式选项时在选项名前只加一个短划线 - 前缀。
使用短形式指定启动选项时,选项名和选项值之间可以没有间隙,也用空白字符隔开
(-p选项有些特殊,-p和密码值之间不能有空白字符)
选项名(短形式和长形式)是区分大小写的,比如 -p 和 -P 选项拥有完全不同的含义。


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

在配置文件中使用选项

在命令行中设置启动选项只对当次启动生效。
可以把需要设置的启动选项都写在配置文件中,每次启动服务器的时候都从这个配置文件里加载相应的启动选项。
由于这个配置文件可以长久的保存在计算机的硬盘里,所以只需我们配置一次,以后就都不用显式的把启动选项都写在启动命令行中了,所以推荐使用配置文件的方式来设置启动选项


配置文件的路径

MySQL 程序在启动时会寻找多个路径下的配置文件,这些路径有的是固定的,有的是可以在命令行指定的。
根据操作系统的不同,配置文件的路径也有所不同。


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

路径名 备注
%WINDIR%\\my.ini%WINDIR%\\my.cnf
C:\\my.iniC:\\my.cnf
BASEDIR\\my.iniBASEDIR\\my.cnf
defaults-extra-file 命令行指定的额外配置文件路径
%APPDATA%\\MySQL\\.mylogin.cnf 登录路径选项(仅限客户端)

Windows 操作系统下配置文件的路径需要知道以下事项:

  • 在给定的前三个路径中,配置文件可以使用 .ini 扩展名,也可以使用 .cnf 扩展名
  • %WINDIR% 指的是你机器上 Windows 目录的位置,通常是 C:\WINDOWS,可以使用 echo %WINDIR% 命令查看
  • BASEDIR 指的是 MySQL 安装目录的路径
  • 第四个路径指的是:在启动程序时可以通过指定 defaults-extra-file 参数的值来添加额外的配置文件路径,比方说我们在命令行上可以这么写:

mysqld --defaults-extra-file=C:\Users\xiaohaizi\my_extra_file.txt 这样 MySQL 服务器启动时就可以额外在那个路径下查找配置文件。

  • %APPDATA% 表示 Windows 应用程序数据目录的值,可以使用 echo %APPDATA% 命令查看
  • 列表中最后一个名 为.mylogin.cnf 配置文件有点儿特殊,它不是一个纯文本文件(其他的配置文件都是纯文本文件),而是使用 mysql_config_editor 实用程序创建的加密文件。

文件中只能包含一些用于启动客户端软件时连接服务器的一些选项,包括
host、user、password、port、socket
它只能被客户端程序所使用。

小贴士:
mysql_config_editor 实用程序是 MySQL 安装目录下的 bin 目录下的一个可执行文件,这个实用程序有专用的语法来生成或修改 .mylogin.cnf 文件中的内容


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

路径名 备注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf 特定于服务器的选项(仅限服务器)
defaults-extra-file 命令行指定的额外配置文件路径
~/.my.cnf 用户特定选项
~/.mylogin.cnf 用户特定的登录路径选项(仅限客户端)

UNIX 操作系统下配置文件的路径需要知道如下事项:

  • SYSCONFDIR 表示在使用 CMake 构建 MySQL 时使用 SYSCONFDIR 选项指定的目录。

默认情况下,这是位于编译安装目录下的 etc 目录。

  • MYSQL_HOME 是一个环境变量,该变量的值是我们自己设置的。

该变量的值代表一个路径,我们可以在该路径下创建一个 my.cnf 配置文件。
这个配置文件中只能放置关于启动服务器程序相关的选项。

  • .mylogin.cnf 只能放置关于客户端相关的选项

言外之意就是:其他的配置文件既能存放服务器相关的选项也能存放客户端相关的选项。


  • 列表中的最后两个以 ~ 开头的路径是用户相关的,类 UNIX 系统中都有一个当前登陆用户的概念,每个用户都可以有一个用户目录,~ 代表用户目录,可以查看 HOME 环境变量的值来确定当前用户的用户目录。

之所以说列表中最后两个配置文件是用户相关的,是因为不同的类 UNIX 系统的用户都可以在自己的用户目
录下创建 .my.cnf 或者 .mylogin.cnf

  • defaults-extra-file 的含义与 Windows 系统中一样。
  • .mylogin.cnf 的含义也同 Windows 系统中一样。

这也就是说,在计算机中这几个路径中的任意一个都可以当作配置文件来使用,如果它们不存在,你可以手动创建一个。

小贴士: 如果使用 mysqld_safe 启动服务器程序,而且也没有主动设置 MySQL_HOME 环境变量的值,那这个环境变量的值将自动被设置为 MySQL 的安装目录


另外,使用mysqld_safe程序启动 MySQL 服务器时,会间接调用 mysqld,所以对于传递给 mysqld_safe 的启动选项来说,如果 mysqld_safe 程序不处理,会接着传递给 mysqld 程序处理。
比方说 skip-networking 选项是由 mysqld 处理的,mysqld_safe 并不处理,但是如果在命令行上这样执行:mysqld_safe --skip-networking。则在 mysqld_safe 调用 mysqld 时,会把它处理不了的这个 skip-networking 选项交给 mysqld 处理。

配置文件的内容

特定MySQL版本的专用选项组

配置文件的优先级

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

defaults-file 的使用

命令行和配置文件中启动选项的区别

在命令行上指定的绝大部分启动选项都可以放到配置文件中,
但是有一些选项是专门为命令行设计的,比方说 defaults-extra-filedefaults-file 这样的选项本身就是为了指定配置文件路径的。


如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准。

启动选项和系统变量的区别

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

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

    系统变量

    MySQL 服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为 MySQL 系统变量。
    比如:允许同时连入的客户端数量用系统变量 max_connections 表示,表的默认存储引擎用系统变量default_storage_engine 表示,查询缓存的大小用系统变量 query_cache_size 表示

MySQL 服务器程序的系统变量有好几百条。每个系统变量都有一个默认值,我们可以使用命令行或者配置文件中的选项在启动服务器时改变一些系统变量的值。
大多数系统变量的值也可以在程序运行过程中修改,而无需停止并重新启动它。


系统变量有两种作用范围

  • global:全局变量,影响服务器的整体操作
  • session:会话变量,影响某个客户端连接的操作,也可称为 local

通过启动选项设置的系统变量的作用范围都是 global 的,也就是对所有客户端都有效。
在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值)。
然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。


以 default_storage_engine 举例,在服务器启动时会初始化一个名为 default_storage_engine,作用范围为global 的系统变量。
之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为 default_storage_engine,作用范围为 session 的系统变量,该作用范围为 session 的系统变量值按照当前作用范围为 global 的同名系统变量值进行初始化,后续可以再更改该会话变量的值。


注意事项

  • 并不是所有系统变量都具有 global 和 session 的作用范围
    • 有一些系统变量只具有 global 作用范围,比方说 max_connections,表示服务器程序支持同时最多有多少个客户端程序进行连接
    • 有一些系统变量只具有 session 作用范围,比如 insert_id,表示插入值时使用的AUTO_INCREMENT 修饰的列的值
    • 大多数系统变量的值既具有 global 作用范围,也具有 session 作用范围
  • 有些系统变量是只读的,并不能设置值
    • 比方 version,表示当前 MySQL 的版本,我们客户端是不能设置它的值的,只能在 show variables 语句里查看

      查看系统变量

      我们可以使用 show [global / session / local] variables [like 匹配的模式]; 命令查看 MySQL 服务器程序支持的系统变量以及它们的当前值。
      若不加作用范围,则默认查看的是 session 作用范围的系统变量。
      由于系统变量太多,所以通常都会带一个 like 过滤条件来查看需要的系统变量的值,like 表达式后边可以跟通配符来进行模糊查询。
      图片.png

      设置系统变量

      大部分的系统变量(全局变量)都可以通过启动服务器时传送启动选项的方式来进行设置(命令行、配置文件)。
      如果启动选项名由多个单词组成,各个单词之间用短划线 - 或者下划线 连接起来都可以,
      但是对应的系统变量之间必须使用下划线
      连接。

服务器程序运行过程中设置系统变量
对于大部分系统变量来说,它们的值可以在服务器程序运行过程中进行动态修改而无需停止并重启服务器。设置系统变量的语法如下:

  1. set [global / session] 系统变量名 = 值;
  2. # 或者
  3. set [@@(global / session).]var_name = XXX;
  4. # 例如:
  5. set session default_storage_engine = MyISAM;
  6. set @@session.default_storage_engine = MyISAM;
  7. set default_storage_engine = MyISAM;

如果在设置系统变量的语句中省略了作用范围,默认的作用范围是 session

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

状态变量

为了让我们更好的了解服务器程序的运行情况,MySQL 服务器程序中维护了好多关于程序运行状态的变量,它们被称为状态变量。
比方说

  • Threads_connected 表示当前有多少客户端与服务器建立了连接
  • Handler_update 表示已经更新了多少行记录

由于状态变量是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序来设置,我们程序员是不能设置的。
与系统变量类似,也有 global 和 session 两个作用范围的状态变量,所以查看状态变量的语句如下:
show [global / session] status [like 匹配的模式];
类似的,如果不写明作用范围,默认的作用范围是 session。