6.2.2.2 使用选项文件
大多数 MySQL 程序可以从选项文件中读取启动选项。选项文件提供了一种便捷的方式来指定通常用于命令行的常用选项,以避免每次运行程序时都需要输入这些选项。
要确定一个程序是否读取选项文件,请使用带有 --help
选项的程序(对于 mysqld,使用 --verbose
和 --help
)。如果程序读取选项文件,帮助消息将指出它在哪里查找这些文件以及它识别哪些选项组。
使用 --no-defaults
选项启动的 MySQL 程序只读取 .mylogin.cnf
文件。
服务器在没有启用 persisted_globals_load
系统变量的情况下,不读取 mysqld-auto.cnf
文件。
许多选项文件是普通文本文件,使用任何文本编辑器创建。除外:
-
包含登录路径选项的
.mylogin.cnf
文件。这是一个由 mysql_config_editor 工具创建的加密文件。见 第 6.6.7 节,“mysql_config_editor — MySQL 配置工具”。一个 “登录路径” 是一个允许仅指定以下选项的选项组: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
文件。这是一个 JSON 格式的文件,包含了持久化系统变量设置。它由服务器在执行SET PERSIST
或SET PERSIST_ONLY
语句时创建。见 第 7.1.9.3 节,“持久化系统变量”。管理mysqld-auto.cnf
文件应该留给服务器,不要手动进行。
MySQL 在上述讨论中描述的顺序中查找并读取选项文件。如果您想要使用但不存在的选项文件,请使用适当方法创建它,如前所述。
有关 NDB 集群程序用于的选项文件的信息,请参阅 第 25.4 节,“NDB 集群配置”。
在 Windows 上,MySQL 程序从以下表格中列出的文件中读取启动选项(列表中的前一个文件被读取为第一个,后续文件的设置将覆盖之前的设置):
表 6.1 选项文件在 Windows 系统上读取
File Name | Purpose |
---|---|
%WINDIR%\my.ini , %WINDIR%\my.cnf |
全局选项 |
C:\my.ini , C:\my.cnf |
全局选项 |
,
|
全局选项 |
defaults-extra-file |
使用 --defaults-extra-file 指定的文件,如果有的话 |
|
客户端登录路径选项(仅限客户端) |
|
使用 SET PERSIST 或 SET PERSIST_ONLY 持久化的系统变量(仅限服务器) |
在以下表格中,%WINDIR%
表示 Windows 目录的位置。这通常是 C:\WINDOWS
。要确定其确切位置,请使用以下命令,从 WINDIR
环境变量的值中获取它的位置:
C:\> echo %WINDIR%
%APPDATA%
表示 Windows 应用程序数据目录的值。要确定其确切位置,请使用以下命令,从 APPDATA
环境变量的值中获取它的位置:
C:\> echo %APPDATA%
BASEDIR
表示 MySQL 的基础安装目录。当使用 MSI 安装 MySQL 8.4 时,这通常是 C:\
,其中 PROGRAMDIR
\MySQL\MySQL Server 8.4PROGRAMDIR
表示程序目录(通常为 Program Files
对于英语版本的 Windows)。
尽管 MySQL Configurator 将大多数文件放在 PROGRAMDIR
下,它将 my.ini
放在默认情况下放置在 C:\ProgramData\MySQL\MySQL Server 8.4\
目录中。
DATADIR
表示 MySQL 数据目录。用于查找 mysqld-auto.cnf
的默认值是编译时构建的数据目录位置,但可以通过在命令行或选项文件中指定 --datadir
来更改它。
在 Unix 和类 Unix 系统上,MySQL 程序从以下表格所示的文件中读取启动选项,以指定顺序(列出的第一个文件被读取第一个,后面读取的文件具有优先级)。(列表中的文件越前面,优先级越高)
在 Unix 平台上,MySQL 忽略世界可写的配置文件。这是出于安全考虑而故意这样做。
表 6.2 Unix 和类 Unix 系统上的选项文件顺序
File Name | Purpose |
---|---|
/etc/my.cnf |
全局选项 |
/etc/mysql/my.cnf |
全局选项 |
|
全局选项 |
$MYSQL_HOME/my.cnf |
服务器特定的选项(仅限服务器) |
defaults-extra-file |
使用 --defaults-extra-file 指定的文件,如果有的话 |
~/.my.cnf |
用户特定选项 |
~/.mylogin.cnf |
客户端登录路径选项(仅限客户端) |
|
使用 SET PERSIST 或 SET PERSIST_ONLY 持久化的系统变量(仅限服务器) |
在以下表格中,~
表示当前用户的主目录($HOME
变量的值)。
SYSCONFDIR
表示使用 SYSCONFDIR
选项到 CMake 构建 MySQL 时指定的目录。默认情况下,这是编译时构建的安装目录下的 etc
目录。
MYSQL_HOME
是一个环境变量,它包含了服务器特定的 my.cnf
文件所在目录的路径。如果没有设置 MYSQL_HOME
并且使用 mysqld_safe 启动服务器,那么 mysqld_safe 会将其设置为 BASEDIR
,即MySQL的基础安装目录。
DATADIR
代表MySQL数据目录。用于查找 mysqld-auto.cnf
的默认值是编译时内置的数据目录位置,但可以通过命令行或选项文件中的 --datadir
选项来改变它。
如果在一个给定选项中找到多个实例,最后一个实例将优先考虑,除了 mysqld 的情况,它会使用第一个 --user
选项作为安全预防措施,以防止命令行中指定的用户被选项文件中的用户覆盖。
以下是手动编辑的选项文件语法描述。这不包括使用 mysql_config_editor 创建并加密的 .mylogin.cnf
文件,也不包括服务器创建的 JSON 格式的 mysqld-auto.cnf
文件。
任何可以在运行MySQL程序时作为命令行选项给出的长选项都可以在选项文件中给出。要获取一个程序可用的选项列表,请使用该程序的 --help
选项。(对于 mysqld,使用 --verbose
和 --help
。)
在选项文件中指定选项的语法与命令行语法(见Section 6.2.2.1, “Using Options on the Command Line”)类似。然而,在选项文件中,你省略了每个选项名前的两个短划线,并且只指定一个选项一行上。例如,命令行上的 --quick
和 --host=localhost
应该在选项文件中分别作为 quick
和 host=localhost
在单独的行上指定。要在选项文件中指定以 --loose-
形式给出的选项,写成 opt_name
loose-
。opt_name
选项文件中的空行被忽略。非空行可以采用以下形式之一:
-
#
,comment
;
comment
注释行以
#
或;
开头。一个#
注释可以出现在一行的中间位置。 -
[
group
]group
是你想要设置选项的程序或组名称。一个组行之后,任何选项设置行直到选项文件末尾或另一个组行出现都应用于该命名组。选项组名称不区分大小写。 -
opt_name
这与命令行上的
--
相同。opt_name
-
opt_name
=value
这与命令行上的
--
相同。在选项文件中,你可以在opt_name
=value
=
之前后有空格,这在命令行上是不允许的。值可选地可以用单引号或双引号括起来,这对于包含#
注释字符的值很有用。
选项名称和值两边的前导和尾随空格都会自动删除。
您可以在选项值中使用转义序列 \b
, \t
, \n
, \r
, \\
和 \s
来表示退格键、制表符、换行符、回车符、反斜杠和空格字符。在选项文件中,这些转义规则适用:
-
一个反斜杠后面跟着一个有效的转义序列字符,将被转换为该序列表示的字符。例如,
\s
被转换成一个空格。 -
一个不跟随有效转义序列字符的反斜杠保持不变。例如,
\S
保留原样。
前面的规则意味着可以用 \\
给出一个字面上的反斜杠,也可以用 \
如果它不跟随有效的转义序列字符。
选项文件中的转义序列规则与在 SQL 语句中字符串文字中的规则有所不同。在后一种上下文中,如果 “x
” 不是有效的转义序列字符,\x
变成 “x
” 而不是 \x
。请参阅第 11.1.1 节,“字符串文字”。
对于 Windows 路径名,使用 \
作为路径分隔符的规则尤其重要。路径名中的分隔符必须以 \\
形式写入,如果它后面跟随一个转义序列字符。它可以以 \\
或 \
的形式写入,如果它不跟随。或者,可以在 Windows 路径名中使用 /
,它将被视为 \
。假设您想要在选项文件中指定一个基础目录 C:\Program Files\MySQL\MySQL Server 8.4
。这可以以几种方式完成一些示例:
basedir="C:\Program Files\MySQL\MySQL Server 8.4"
basedir="C:\\Program Files\\MySQL\\MySQL Server 8.4"
basedir="C:/Program Files/MySQL/MySQL Server 8.4"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s8.4
如果选项组的名称与程序名称相同,那么该组中的选项将特定于该程序。例如,[mysqld]
和 [mysql]
组分别适用于mysqld 服务器和mysql 客户端程序,分别。
[client]
选项组由 MySQL 发布的所有客户程序读取(但不是mysqld)。要了解第三方使用 C API 的客户程序如何使用选项文件,请参阅mysql_options()。
[client]
组使您可以指定连接到服务器所需的密码等所有客户端选项。(但请确保选项文件只对自己可用,以防止其他人发现您的密码。)不要将选项放在 [client]
组中,除非它被所有您使用的客户程序识别。否则,如果尝试运行不认识该选项的程序,它们会退出并显示错误消息。
在更一般的选项组之前列出更具体的组。例如,[client]
组是更通用的,因为它被所有客户程序读取,而 [mysqldump]
组只被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 发行版系列中的 mysqld 服务器读取的选项组,请使用名为 [mysqld-8.3]
、[mysqld-8.4]
等的组。以下组指示应该只由 MySQL 服务器版本号为 8.4.x 的服务器使用 sql_
设置:
[mysqld-8.4]
sql_mode=TRADITIONAL
可以在选项文件中使用 !include
指令来包含其他选项文件,以及 !includedir
来搜索特定的目录以找到选项文件。例如,要包含 /home/mydir/myopt.cnf
文件,请使用以下指令:
!include /home/mydir/myopt.cnf
要在 /home/mydir
目录中搜索并读取选项文件,请使用此指令:
!includedir /home/mydir
MySQL 对于目录中的选项文件顺序不做任何保证。
在 Unix 操作系统上,使用 !includedir
指令时,文件名必须以 .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
中提供,将读取选项文件 myopts.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