MySQL 的许多程序都可以从选项文件(有时也被称为配置文件)中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项,这样你就不必每次运行程序时都在命令行上输入这些选项。
要确定一个程序是否读取选项文件,你可以使用 --help 选项来调用它。(对于 mysqld,你需要使用 --verbose 和 --help。)如果程序读取选项文件,帮助消息会指示它查找哪些文件以及它识别哪些选项组。
当使用 --no-defaults 选项启动 MySQL 程序时,它会忽略除 .mylogin.cnf 之外的所有默认选项文件。.mylogin.cnf 文件是一个特殊的配置文件,用于存储由 mysql_config_editor 实用程序加密的登录凭据(如用户名和密码)。客户端程序可以使用 --login-path 选项来指定从 .mylogin.cnf 文件中读取的登录路径。
另一方面,如果在启动 MySQL 服务器时禁用了 persisted_globals_load 系统变量,则服务器将不会加载 mysqld-auto.cnf 文件。
许多 MySQL 的选项文件都是使用任何文本编辑器创建的纯文本文件。但是,也存在一些例外情况,这些例外情况如下:
- .mylogin.cnf 文件是 mysql_config_editor 实用程序创建的加密文件,用于存储登录路径选项。这些“登录路径”是允许仅包含特定选项(如 host、user、password、port 和 socket)的选项组。客户端程序使用 --login-path 选项来指定从 .mylogin.cnf 文件中读取哪个登录路径。
要指定一个不同的登录路径文件名,可以设置 MYSQL_TEST_LOGIN_FILE 环境变量。然 而,这个变量实际上主要用于 mysql-test-run.pl 测试实用程序。不过,它也 被 mysql_config_editor 和 MySQL 客户端程序(如 mysql 和 mysqladmin)所识别。
- mysqld-auto.cnf 文件位于 MySQL 服务器的数据目录中,它是一个 JSON 格式的文件,用于存储通过 SET PERSIST 或 SET PERSIST_ONLY 语句设置的持久化系统变量。这个文件是在服务器执行这些语句时自动创建的。这些持久化系统变量在服务器重启后仍然保持有效,因为它们被存储在 mysqld-auto.cnf 文件中。因此,mysqld-auto.cnf 文件的管理应该完全由 MySQL 服务器来处理,而不需要或不应该由管理员手动编辑。
- 选项文件处理顺序
- 选项文件语法
- 选项文件Inclusions
1 选项文件处理顺序
MySQL 在启动时或运行客户端工具时会按照特定的顺序查找选项文件,并读取存在的任何文件。
在 Windows 上,MySQL 程序按照以下顺序读取启动选项文件(列表中先列出的文件先被读取,后面读取的文件具有更高的优先级):
在上面的表中,%WINDIR% 表示您的 Windows 目录的位置。这通常位于 C:\WINDOWS(在较新的 Windows 版本中可能是 C:\Windows)。要确定 WINDIR 环境变量的确切位置,您可以使用以下命令之一(取决于您的命令行环境):
C:\> echo %WINDIR%
%APPDATA% 环境变量代表 Windows 应用程序数据目录的位置。要确定其确切位置,您可以使用以下命令之一(取决于您的命令行环境):
C:\> echo %APPDATA%
当使用 MySQL Installer 安装 MySQL 8.0 时,BASEDIR 通常代表 MySQL 的基础安装目录。对于 Windows 系统,这个目录通常位于 C:\PROGRAMDIR\MySQL\MySQL Server 8.0,其中 PROGRAMDIR 代表程序目录(对于英文版的 Windows 通常是 Program Files)。
虽然 MySQL Installer 将大部分文件放置在 PROGRAMDIR,但它将配置文件 my.ini(或在某些系统中可能是 my.cnf)放置在 C:\ProgramData\MySQL\MySQL Server 8.0\ 目录下。
DATADIR 在 MySQL 中代表数据目录,即 MySQL 存储其数据库文件(如表、索引等)的目录。这个目录的位置在 MySQL 编译时就已经内置了默认值,但可以在启动 mysqld 进程时通过 --datadir 选项来指定。
mysqld-auto.cnf 文件通常与 my.cnf 或 my.ini 配置文件一起使用,但包含了一些由 MySQL Installer 自动生成的设置,如数据目录(datadir)、套接字文件(socket)和 PID 文件(pid-file)的路径。
在 Unix 和 Unix-like 系统上,MySQL 程序按照以下表格中指定的顺序读取启动选项(先列出的文件先被读取,后读取的文件具有更高的优先级)。
在 Unix 平台上,MySQL 故意忽略具有全局可写权限(world-writable)的配置文件,这是一种安全措施。
在上表中,~ 代表当前用户的home目录(即 $HOME 变量的值)。
SYSCONFDIR 表示在构建 MySQL 时通过 CMake 的 SYSCONFDIR 选项指定的目录。默认情况下,这个目录是编译时内置的安装目录下的 etc 目录。
MYSQL_HOME 是一个环境变量,它包含了特定于服务器的 my.cnf 配置文件所在的目录的路径。当 MYSQL_HOME 没有被设置时,如果您使用 mysqld_safe 脚本来启动 MySQL 服务器,mysqld_safe 会将 MYSQL_HOME 设置为 BASEDIR,即 MySQL 的基础安装目录。BASEDIR 通常包含了 MySQL 的二进制文件、库文件和其他核心组件。
DATADIR表示MySQL数据目录。用于查找mysqld-auto.cnf,其默认值是MySQL编译时内置的数据目录位置,但可以通过--datadir进行更改,该datadir指定为在处理mysqld-auto.com.cnf之前处理的选项文件或命令行选项。
如果找到给定选项的多个实例,则最后一个实例优先,但有一个例外:对于mysqld,--user选项的第一个实例用作安全预防措施,以防止选项文件中指定的用户在命令行上被重写。
2 选项文件语法
以下选项文件语法说明适用于手动编辑的文件。这不包括使用mysql_config_editor创建并加密的.mylogin.cnf和服务器以JSON格式创建的mysqld-auto.cnf。
MySQL 程序的任何可以在命令行中给出的长选项也可以在选项文件中给出。如果您想查看某个程序可用的选项列表,可以使用 --help 选项来运行该程序。
选项文件中指定选项的语法与在命令行中指定选项的语法相似,但有一些重要的区别。在选项文件中,您省略了选项名前面的两个短横线(--),并且每个选项单独写在一行上。例如,如果您在命令行中使用了 --quick 和 --host=localhost,那么在选项文件中,您应该将它们分别写在单独的一行上,并且去掉前面的 --。对于形如 --loose-opt_name 的选项,在选项文件中,您应该将其写为 loose-opt_name。
在MySQL的选项文件中,空行会被忽略,而非空行可以采取以下几种形式:
- #comment 或 ;comment
注释行以 # 或 ; 开头。在行中间也可以使用 # 开始注释。
- [group]
group 是您想要为其设置选项的程序或组的名称。在组行之后,任何选项设置行都将应用于指定的组,直到选项文件的末尾或另一个组行被给出。选项组名称不区分大小写。
- opt_name
这等价于命令行上的 --opt_name。
- opt_name=value
这等价于命令行上的 --opt_name=value。在选项文件中,等号(=)周围可以有空格,这在命令行上是不允许的。值可以选择性地用单引号或双引号括起来,这在值包含 # 注释字符时特别有用。
在MySQL的选项文件中,选项名和值的前导和尾随空格会自动被删除。这意味着您可以在编写选项文件时添加额外的空格来增强可读性,而不必担心这些空格会影响选项的实际值。
在选项值中,您可以使用转义序列来表示一些特殊字符。MySQL选项文件中支持的转义序列包括:
- \b:退格(backspace)字符
- \t:制表符(tab)
- \n:换行符(newline)
- \r:回车符(carriage return)
- \\:反斜杠(backslash)字符
- \s:空格(space)字符
在选项文件中,这些转义规则的应用方式是:
- 如果一个反斜杠后面跟着一个有效的转义序列字符,那么它会被转换为该序列所代表的字符。例如,\s 会被转换为空格字符。
- 如果一个反斜杠后面没有跟着一个有效的转义序列字符,那么反斜杠将保持不变。例如,\S 会被保留为 \ 和 S 这两个字符。
前面的规则意味着一个实际的反斜杠字符(backslash, \),需要使用两个反斜杠(\\)来表示,因为单个反斜杠会被解释为转义字符的开始。但是,如果反斜杠后面没有跟随有效的转义序列字符,那么它将被保留为一个单独的反斜杠字符。
选项文件中的转义序列规则与SQL语句中字符串字面量中的转义序列规则略有不同。
在SQL语句的字符串字面量中,如果反斜杠后面跟的不是一个有效的转义序列字符,那么这个反斜杠会被忽略,后面的字符将按原样处理。例如,在SQL字符串中,\x 会被解释为 x,因为 x 不是一个有效的转义序列字符。
然而,在MySQL的选项文件中,情况有所不同。在选项文件中,如果反斜杠后面没有跟随一个有效的转义序列字符,那么反斜杠将保持不变。这意味着,如果您在选项文件中写入 option=\x,它将被解释为 option=\x,而不是 option=x。
Windows路径名中的转义规则在MySQL选项文件中非常重要,因为Windows使用\作为路径名分隔符。在MySQL选项文件中,如果\后面跟着一个转义序列字符,那么它必须被写作\\。如果\后面没有跟着转义序列字符,那么它可以被写作\\或\。另外,在Windows路径名中也可以使用/,它会被当作\来处理。
如果您想在MySQL选项文件中指定一个基于C:\Program Files\MySQL\MySQL Server 8.0的基础目录,以下是一些示例:
basedir="C:\Program Files\MySQL\MySQL Server 8.0"
basedir="C:\\Program Files\\MySQL\\MySQL Server 8.0"
basedir="C:/Program Files/MySQL/MySQL Server 8.0"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s8.0
如果选项组名与程序名相同,那么该组中的选项就专门应用于那个程序。例如,[mysqld]组中的选项专门用于配置mysqld服务器,而[mysql]组中的选项则专门用于配置mysql客户端。
[client]组中的选项确实会被MySQL分发中的所有客户端程序读取,但不会被mysqld服务器读取。
对于使用C API的第三方客户端程序如何使用选项文件,这些程序通常会使用mysql_options()函数来设置运行时参数。
[client]选项组允许您指定应用于所有MySQL客户端的选项。例如,[client]组是设置连接服务器所需密码的合适位置。但是,您必须确保选项文件(如my.cnf或my.ini)只能由您自己访问,以防止其他人发现您的密码。
将选项放入[client]组时要特别小心,因为只有当所有您使用的客户端程序都识别该选项时,它才是安全的。如果某个客户端程序不理解该选项,它可能会在显示错误消息后退出。
组织选项组的一个好方法是首先列出更一般的组,然后列出更具体的组。这样做可以确保更具体的选项能够覆盖更一般的选项。如果您在[client]组中设置了一个选项,然后在[mysqldump]组中设置了相同的选项但值不同,那么[mysqldump]组中的值将覆盖[client]组中的值。这是因为mysqldump在读取其配置时,会先读取[client]组中的通用选项,然后再读取[mysqldump]组中的特定选项。由于[mysqldump]组是更具体的,所以它的选项会覆盖[client]组中的相同选项。
这里是一个典型的通用选项文件:
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=128M
[mysqldump]
Quick
这里是一个典型的用户选项文件:
[client]
# The following password is sent to all standard MySQL clients
password="my password"
[mysql]
no-auto-rehash
connect_timeout=2
要在MySQL的配置文件中为特定MySQL发布系列的mysqld服务器创建仅读的选项组,您可以使用类似于[mysqld-5.7]、[mysqld-8.0]这样的命名方式。如果您想要指定sql_mode设置仅由8.0.x版本的MySQL服务器使用,您应该创建一个名为[mysqld-8.0]的选项组,并在其中设置sql_mode。
[mysqld-8.0]
sql_mode=TRADITIONAL
3 选项文件 Inclusions
在MySQL的配置文件中,您可以使用!include指令来包含其他配置文件,以及!includedir指令来搜索特定目录以包含该目录中的配置文件。这有助于组织复杂的配置,或者根据环境或版本包含不同的配置设置。
例如,要包含/home/mydir/myopt.cnf文件,您可以在主配置文件中使用以下!include指令:
!include /home/mydir/myopt.cnf
要搜索/home/mydir目录并读取在其中找到的选项文件,请使用以下指令:
!includedir /home/mydir
MySQL无法保证读取目录中选项文件的顺序。
使用找到并包含的任何文件!includedir指令在Unix操作系统上的文件名必须以.cnf结尾。在Windows上,此指令检查扩展名为.ini或.cnf的文件。
像编写任何其他选项文件一样,编写包含的选项文件的内容。也就是说,它应该包含多组选项,每个选项前面都有一行[group],指示应用这些选项的程序。
在处理包含的文件时,仅使用当前程序正在查找的组中的那些选项。其他组将被忽略。假设my.cnf文件包含以下行:
!include /home/mydir/myopt.cnf
假设/home/mydir/myopt.cnf如下所示:
[mysqladmin]
force
[mysqld]
key_buffer_size=16M
如果my.cnf由mysqld处理,则仅使用/home/mydir/myopt.cnf中的[mysqld]组。如果文件由mysqladmin处理,则只使用[mysqladmin]组。如果文件由任何其他程序处理,则不会使用/home/mydir/myopt.cnf中的任何选项。
这个includedir指令的处理方式类似,只是读取命名目录中的所有选项文件。
如果选项文件包含!include或!includedir,无论选项文件出现在文件中的什么位置,只要处理选项文件,都会处理由这些指令命名的文件。
为了使包含指令起作用,文件路径不应在引号内指定,并且不应具有转义序列。例如,my.ini中提供的以下语句读取选项文件myots.ini:
!include C:/ProgramData/MySQL/MySQL Server/myopts.ini
!include C:\ProgramData\MySQL\MySQL Server\myopts.ini
!include C:\\ProgramData\\MySQL\\MySQL Server\\myopts.ini
在Windows上,如果!include/path/to/extra.ini是文件中的最后一行,请确保在末尾附加一行换行符;否则,该行将被忽略。