大多数 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 Cluster 程序使用的选项文件的信息,请参阅 第 25.4 节,“NDB Cluster 配置”。
在 Windows 上,MySQL 程序从以下表格所示的文件中读取启动选项,按照指定的顺序(文件列表首先读取,后续文件读取优先)。
表 6.1 Windows 系统上的选项文件
File Name | Purpose |
---|---|
,
|
全局选项 |
C:\my.ini , C:\my.cnf |
全局选项 |
,
|
全局选项 |
defaults-extra-file |
文件指定的 --defaults-extra-file , 如果有 |
|
登录路径选项(客户端 only) |
|
系统变量持久化使用 SET PERSIST 或 SET PERSIST_ONLY (服务器 only) |
在上表中, %WINDIR%
代表 Windows 目录的位置。这通常是 C:\WINDOWS
。使用以下命令确定其确切位置从 WINDIR
环境变量的值:
C:\> echo %WINDIR%
%APPDATA%
代表 Windows 应用程序数据目录的值。使用以下命令确定其确切位置从 APPDATA
环境变量的值:
C:\> echo %APPDATA%
BASEDIR
代表 MySQL 基础安装目录。当 MySQL 8.3 使用 MSI 安装时,这通常是 C:\
,其中 PROGRAMDIR
\MySQL\MySQL Server 8.3PROGRAMDIR
代表程序目录(通常是 Program Files
,用于英语版本的 Windows)。
尽管 MySQL 配置器将大多数文件放在 PROGRAMDIR
下,但它将 my.ini
安装在 C:\ProgramData\MySQL\MySQL Server 8.3\
目录下。
DATADIR
代表 MySQL 数据目录。作为找到 mysqld-auto.cnf
的默认值是编译时 MySQL 的数据目录位置,但可以通过 --datadir
选项或命令行选项在处理 mysqld-auto.cnf
之前指定。
在 Unix 和 Unix-like 系统上,MySQL 程序从以下文件中读取启动选项,按照指定的顺序(文件列表首先读取,文件读取后具有优先权)。
在 Unix 平台上,MySQL 忽视世界可写的配置文件。这是一个故意的安全措施。
表 6.2 Unix 和 Unix-Like 系统上的选项文件
File Name | Purpose |
---|---|
/etc/my.cnf |
全局选项 |
/etc/mysql/my.cnf |
全局选项 |
|
全局选项 |
$MYSQL_HOME/my.cnf |
服务器特定选项(服务器 only) |
defaults-extra-file |
文件指定的 --defaults-extra-file , 如果有 |
~/.my.cnf |
用户特定选项 |
~/.mylogin.cnf |
用户特定登录路径选项(客户端 only) |
|
系统变量持久化使用 SET PERSIST 或 SET PERSIST_ONLY (服务器 only) |
在上表中, ~
代表当前用户的主目录($HOME
的值)。
SYSCONFDIR
代表使用 SYSCONFDIR
选项到 CMake 时 MySQL 的编译目录。默认情况下,这是编译安装目录下的 etc
目录。
MYSQL_HOME
是一个环境变量,包含服务器特定 my.cnf
文件所在目录的路径。如果 MYSQL_HOME
未设置,并且您使用 mysqld_safe 程序启动服务器,mysqld_safe 将其设置为 BASEDIR
,即 MySQL 基础安装目录。
DATADIR
代表 MySQL 数据目录。用于查找 mysqld-auto.cnf
,其默认值是 MySQL 编译时的数据目录位置,但可以通过 --datadir
选项文件或命令行选项在处理 mysqld-auto.cnf
之前进行更改。
如果找到多个实例的给定选项,最后一个实例优先,除非:对于 mysqld,第一个 --user
选项实例用于安全预防,以防止在选项文件中指定的用户被命令行覆盖。
以下描述的选项文件语法适用于手动编辑的文件。这排除了 .mylogin.cnf
,它使用 mysql_config_editor 创建并加密,以及 mysqld-auto.cnf
,服务器以 JSON 格式创建。
任何可以在命令行上指定的长选项都可以在选项文件中指定。要获取程序的可用选项列表,请使用 --help
选项运行它。(对于 mysqld,使用 --verbose
和 --help
。)
在选项文件中指定选项的语法与命令行语法相似(见 第 6.2.2.1 节,“在命令行上使用选项”)。然而,在选项文件中,您省略了选项名称前的两个破折号,并且每行只能指定一个选项。例如,命令行上的 --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
” 而不是 \
。见 第 11.1.1 节,“字符串文字”。x
选项文件值的转义规则对 Windows 路径名尤其重要,后者使用 \
作为路径名分隔符。在 Windows 路径名中,分隔符必须写作 \\
如果它跟随转义序列字符。它可以写作 \\
或 \
如果它不跟随转义序列字符。或者,/
可以在 Windows 路径名中使用,并被视为 \
。假设您想在选项文件中指定基本目录 C:\Program Files\MySQL\MySQL Server 8.3
。这可以以多种方式完成。一些示例:
basedir="C:\Program Files\MySQL\MySQL Server 8.3"
basedir="C:\\Program Files\\MySQL\\MySQL Server 8.3"
basedir="C:/Program Files/MySQL/MySQL Server 8.3"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s8.3
如果选项组名称与程序名称相同,则该组中的选项将专门应用于该程序。例如,[mysqld]
和 [mysql]
组分别应用于 mysqld 服务器和 mysql 客户端程序。
选项组 [client]
由所有客户端程序读取(但不是 mysqld)。要了解第三方客户端程序如何使用选项文件,请参阅 C API 文档中的 mysql_options()。
选项组 [client]
启用您指定适用于所有客户端的选项。例如,[client]
是指定连接到服务器的密码的适当组。(但请确保选项文件只能由您自己访问,以便其他人无法发现您的密码。)确保不要将选项放在 [client]
组中,除非该选项被所有客户端程序所识别。如果您尝试运行不理解该选项的程序,它们将在显示错误消息后退出。
首先列出更 general 的选项组,然后是更 specific 的组。例如,[client]
组是更 general 的,因为它被所有客户端程序读取,而 [mysqldump]
组只被 mysqldump 读取。后面的选项将覆盖前面的选项,因此将选项组的顺序设置为 [client]
、[mysqldump]
,以便 mysqldump-specific 选项覆盖 [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
要创建仅供 mysqld 服务器从特定 MySQL 发布系列读取的选项组,请使用名称为 [mysqld-8.2]
、[mysqld-8.3]
等的组。以下组表明 sql_mode
设置仅供 MySQL 服务器 8.3.x 版本号使用:
[mysqld-8.3]
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