大多数 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、mysqladmin 等 MySQL 客户端识别。数据目录中的
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 系统上读取的选项文件
文件名 | 用途 |
---|---|
,
|
全局选项 |
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 9.0 时,这通常是 C:\
,其中 PROGRAMDIR
\MySQL\MySQL Server 9.0PROGRAMDIR
表示程序目录(对于英文版本的 Windows,通常是 Program Files
)。
尽管 MySQL 配置器将大多数文件放在 PROGRAMDIR
下,但默认情况下它会将 my.ini
安装在 C:\ProgramData\MySQL\MySQL Server 9.0\
目录下。
DATADIR
表示 MySQL 数据目录。用于查找 mysqld-auto.cnf
时,其默认值是编译 MySQL 时内置的数据目录位置,但可以通过在处理 mysqld-auto.cnf
之前处理的选项文件或命令行选项中指定的 --datadir
进行更改。
在 Unix 和类 Unix 系统上,MySQL 程序从下表所示的文件中读取启动选项,顺序如下(首先列出的文件先读取,后读取的文件优先)。
在 Unix 平台上,MySQL 会忽略可被所有人写入的配置文件。这是一种出于安全考虑的故意行为。
表 6.2 Unix 和类 Unix 系统上读取的选项文件
文件名 | 用途 |
---|---|
/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
表示在构建 MySQL 时使用 SYSCONFDIR
选项指定给 CMake 的目录。默认情况下,这是编译时安装目录下的 etc
目录。
MYSQL_HOME
是一个环境变量,其中包含服务器特定的 my.cnf
文件所在的目录的路径。如果未设置 MYSQL_HOME
并且您使用 mysqld_safe 程序启动服务器,则 mysqld_safe 会将其设置为 BASEDIR
,即 MySQL 的基本安装目录。
DATADIR
表示 MySQL 数据目录。用于查找 mysqld-auto.cnf
时,其默认值是编译 MySQL 时内置的数据目录位置,但可以通过在处理 mysqld-auto.cnf
之前处理的选项文件或命令行选项中指定的 --datadir
进行更改。
如果找到给定选项的多个实例,则最后一个实例优先,但有一个例外:对于 mysqld,出于安全预防措施,将使用 --user
选项的第一个实例,以防止在命令行上覆盖选项文件中指定的用户。
以下选项文件语法说明适用于您手动编辑的文件。这不包括使用 mysql_config_editor 创建并加密的 .mylogin.cnf
,以及服务器以 JSON 格式创建的 mysqld-auto.cnf
。
运行 MySQL 程序时,可以在命令行上给出的任何长选项也可以在选项文件中给出。要获取程序的可用选项列表,请使用 --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 9.0
。这可以通过几种方式完成。一些例子
basedir="C:\Program Files\MySQL\MySQL Server 9.0"
basedir="C:\\Program Files\\MySQL\\MySQL Server 9.0"
basedir="C:/Program Files/MySQL/MySQL Server 9.0"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s9.0
如果选项组名称与程序名称相同,则该组中的选项将专门应用于该程序。例如,[mysqld]
和 [mysql]
组分别应用于 mysqld 服务器和 mysql 客户端程序。
[client]
选项组由 MySQL 发行版中提供的所有客户端程序读取(但不是由 mysqld 读取)。要了解使用 C API 的第三方客户端程序如何使用选项文件,请参阅 mysql_options() 处的 C API 文档。
[client]
组使您能够指定应用于所有客户端的选项。例如,[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.4]
、[mysqld-9.0]
等的组。以下组指示 sql_mode
设置应仅由版本号为 9.0.x 的 MySQL 服务器使用
[mysqld-9.0]
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
如果 mysqld 正在处理 my.cnf
,则只会使用 /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