启动命令

mysql --help 可以看到 mysql 程序支持的启动选项。

mysqld_safe --help可以看到 mysqld_safe 程序支持的启动选项。

查看 mysqld 支持的启动选项有些特别,需要使用 mysqld --verbose --help

命令行选项的长形式和短形式

使用长形式选项时在选项名前加两个短划线 –

使用短形式选项时在选项名前只加一个短划线 -

选项名是区分大小写的,比如 -p 和 -P 选项拥有完全不同的含义

配置文件

MySQL 程序在启动时会寻找多个路径下的配置文件,这些路径有的是固定的,有的是可以在命令行指定的

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

路径名 备注
%WINDIR%\my.ini , %WINDIR%\my.cnf
C:\my.ini , C:\my.cnf
BASEDIR\my.ini , BASEDIR\my.cnf
defaults-extra-file 命令行指定的额外配置文件路径
%APPDATA%\MySQL.mylogin.cnf 登录路径选项(仅限客户端)
  • 给定的前三个路径中,配置文件可以使用 .ini 的扩展名,也可以使用 .cnf 的扩展名
  • %WINDIR% 指的是你机器上 Windows 目录的位置,通常是 C:\WINDOWS,可以使用 echo %WINDIR% 查看
  • BASEDIR 指的是 MySQL 安装目录的路径
  • %APPDATA% 表示 Windows 应用程序数据目录的值,可以使用 echo %APPDATA% 查看
  • .mylogin.cnf 配置文件有点儿特殊,它不是一个纯文本文件,而是使用 mysql_config_editor 实用程序创建的加密文件。文件中只能包含一些用于启动客户端软件时连接服务器的一些选项,包括 host 、 user 、 password 、 port 和 socket 。而且它只能被客户端程序所使用。

类Unix操作系统中的配置文件

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

路径名 备注
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf 特定于服务器的选项(仅限服务器)
defaults-extra-file 命令行指定的额外配置文件路径
~/.my.cnf 用户特定选项
~/.mylogin.cnf 用户特定的登录路径选项(仅限客户端)
  • SYSCONFDIR 表示在使用 CMake 构建 MySQL 时使用 SYSCONFDIR 选项指定的目录。默认情况下,这是位于编译安装目录下的 etc 目录
  • MYSQL_HOME 是一个环境变量,该变量的值是我们自己设置的,我们想设置就设置,不想设置就不设置。该变量的值代表一个路径,我们可以在该路径下创建一个 my.cnf 配置文件,那么这个配置文件中只能放置关于启动服务器程序相关的选项
  • 以 ~ 开头的路径是用户相关的,每个用户都可以有一个用户目录, ~ 就代表这个用户目录
  • defaults-extra-file 的含义与Windows中的一样
  • .mylogin.cnf 的含义也同 Windows 中的一样

在 mysqld_safe 调用 mysqld 时,会把它处理不了的这个 skip-networking 选项交给 mysqld 处理

配置文件的内容

配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[] 扩起来

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

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

配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不允许加 – 前缀,并且每行只指定一个选项,而且 = 周围可以有空白字符

在配置文件中,我们可以使用 # 来添加注释,从 # 出现直到行尾的内容都属于注释内容,读取配置文件时会忽略这些注释内容。

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

  • [server] 组下边的启动选项将作用于所有的服务器程序。
  • [client] 组下边的启动选项将作用于所有的客户端程序。
启动命令 类别 能读取的组
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.server程序的启动参数,则必须将它们放在配置文件中,而不是放在命令行中。mysql.server仅支持start和stop作为命令行参数

可以在选项组的名称后加上特定的 MySQL 版本号,比如对于 [mysqld] 选项组来说,我们可以定义一个[mysqld-5.7] 的选项组,它的含义和 [mysqld] 一样,只不过只有版本号为 5.7 的 mysqld 程序才能使用这个选项组中的选项。

配置文件的优先级

MySQL 将按照我们在上表中给定的顺序依次读取各个配置文件,如果该文件不存在则忽略。值得注意的是,如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准

同一个命令可以访问配置文件中的多个组,比如 mysqld 可以访问 [mysqld] 、 [server] 组,如果在同一个配置文件中出现了同样的配置项将以最后一个出现的组中的启动选项为准

如果我们不想让 MySQL 到默认的路径下搜索配置文件(就是上表中列出的那些),可以在命令行指定 defaults-file 选项

mysqld –defaults-file=/tmp/myconfig.txt 这样,在程序启动的时候将只在 /tmp/myconfig.txt 路径下搜索配置文件。如果文件不存在或无法访问,则会发生错误。

注意defaults-extra-filedefaults-file的区别,使用defaults-extra-file可以指定额外的配置文件搜索路径(也就是说那些固定的配置文件路径也会被搜索)

命令行与配置文件的区别

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

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

系统变量

MySQL 服务器程序运行过程中会用到许多影响程序行为的变量,它们被称为 MySQL 系统变量

max_connections:允许同时连入的客户端数量

default_storage_engine:表的默认存储引擎

query_cache_size:查询缓存的大小

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

查看系统变量:SHOW VARIABLES [LIKE 匹配的模式];

设置系统变量:

  • 通过命令行添加启动选项
  • 通过配置文件添加启动选项

对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线 - 或者下划线 _ 连接起来都可以,但是对应的系统变量之间必须使用下划线 _ 连接起来

系统变量的 作用范围

  • GLOBAL :全局变量,影响服务器的整体操作。
  • SESSION :会话变量,影响某个客户端连接的操作。(注: SESSION 有个别名叫 LOCAL )

在服务器启动时,会将每个全局变量初始化为其默认值,然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。

通过启动选项设置的系统变量的作用范围都是 GLOBAL 的,也就是对所有客户端都有效的

服务器程序运行期间通过客户端程序设置系统变量的语法

SET [GLOBAL|SESSION] 系统变量名 = 值;

SET [@@(GLOBAL|SESSION).]var_name = XXX;

想让之后新连接到服务器的客户端都用 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 匹配的模式];

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

注意事项

  • 并不是所有系统变量都具有 GLOBAL 和 SESSION 的作用范围
    • 有一些系统变量只具有 GLOBAL 作用范围,比方说 max_connections
    • 有一些系统变量只具有 SESSION 作用范围,比如 insert_id ,表示在对某个包含 AUTO_INCREMENT 列的表进行插入时,该列初始的值
    • 有一些系统变量的值既具有 GLOBAL 作用范围,也具有 SESSION 作用范围,比如我们前边用到的default_storage_engine ,而且其实大部分的系统变量都是这样的
  • 有些系统变量是只读的,并不能设置值
    • 比方说 version ,表示当前 MySQL 的版本,我们客户端是不能设置它的值的

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

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

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

状态变量

MySQL 服务器程序中维护了好多关于程序运行状态的变量,让我们更好的了解服务器程序的运行情况

状态变量 是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是不能设置的。与 系统变量 类似, 状态变量 也有 GLOBAL 和 SESSION 两个作用范围

查看 状态变量 的语句

SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];