大多数MySQL程序可以从选项文件(有时称为配置文件)中读取启动选项。选项文件提供了一种方便的方法来指定常用的选项,这样每次运行程序时都不需要在命令行上输入它们。
要确定程序是否读取选项文件,请使用--help选项调用它。(对于mysqld,使用--verbose和--help。)如果程序读取选项文件,帮助消息会指示它要查找哪些文件以及识别哪些选项组。
注意:以--no-defaults选项启动的MySQL程序读取.mylogin.cnf以外的任何选项文件。以禁用persisted_globals_load系统变量启动的服务器无法读取mysqld-auto.cnf。
许多选项文件都是使用任何文本编辑器创建的纯文本文件。例外情况如下:
- 包含登录路径选项的.mylogin.cnf文件。这是一个由mysql_config_editor实用程序创建的加密文件。"登录路径"是一个选项组,只允许某些选项:主机、用户、密码、端口和套接字。客户端程序使用--login-path选项指定从.mylogin.cnf读取的登录路径。
要指定另一个登录路径文件名,请设置MYzhenTEST_login_file环境变量。此变量由mysql-test-run.pl测试实用程序使用,但也可由mysql_config_editor和mysql客户端(如mysql、mysqladmin等)识别。
- 数据目录中的mysqld-auto.cnf文件。此JSON格式文件包含持久化的系统变量设置。它是由服务器在执行SET PERSIST或SET PERSIST_ONLY语句时创建的。mysqld-auto.cnf的管理应该留给服务器,而不是手动执行。
- 选项文件处理顺序。
- 选项文件语法。
- 选项文件包含。
1 选项文件处理顺序
MySQL按照以下讨论中描述的顺序查找选项文件,并读取任何存在的选项文件。如果要使用的选项文件不存在,请使用刚才讨论的适当方法创建它。
在Windows上,MySQL程序按照指定的顺序从下表所示的文件中读取启动选项(先读取列出的文件,后读取的文件优先)。
在上表中,%WINDIR%表示Windows目录的位置。这通常是C:\WINDOWS。使用以下命令根据WINDIR环境变量的值确定其确切位置:
C:\> echo %WINDIR%
%APPDATA%表示Windows应用程序数据目录的值。使用以下命令根据APPDATA环境变量的值确定其确切位置:
C:\> echo %APPDATA%
BASEDIR代表MySQL的基本安装目录。当使用MySQL安装程序安装MySQL 8.0时,这通常是C:\PROGRAMDIR\MySQL\MySQL Server 8.0,其中PROGRAMDIR表示程序目录(通常是Windows英文版本的Program Files)。
注意:虽然MySQL安装程序将大多数文件放置在PROGRAMDIR下,但默认情况下,它会将my.ini安装在C:\ProgramData\MySQL\MyServer8.0\目录下。
DATADIR代表MySQL数据目录。用于查找mysqld-auto.cnf时,其默认值是编译MySQL时内置的数据目录位置,但可以通过在处理mysqld-auto-cnf之前将--datadir指定为选项文件或命令行选项来更改。
在Unix和类Unix系统上,MySQL程序按照指定的顺序从下表所示的文件中读取启动选项(先读取列出的文件,后读取的文件优先)。
注意:在Unix平台上,MySQL忽略了全球可写的配置文件。这是有意作为安全措施。
在上表中,~表示当前用户的主目录($home的值)。
SYSCONFDIR表示在构建MySQL时,使用SYSCONFDIR选项为CMake指定的目录。默认情况下,这是位于已编译安装目录下的etc目录。
my_RESHOME是一个环境变量,包含服务器特定my.cnf文件所在目录的路径。如果未设置MYSQL HOME,并且您使用mysqld_safe程序启动服务器,mysqld_security会将其设置为MYSQL基本安装目录BASEDIR。
DATADIR代表MySQL数据目录。用于查找mysqld-auto.cnf时,其默认值是编译MySQL时内置的数据目录位置,但可以通过在处理mysqld-auto-cnf之前将--datadir指定为选项文件或命令行选项来更改。
如果找到给定选项的多个实例,则最后一个实例优先,但有一个例外:对于mysqld,--user选项的第一个实例用作安全预防措施,以防止在选项文件中指定的用户在命令行上被覆盖。
2 选项文件语法
以下选项文件语法说明适用于手动编辑的文件。这不包括.mylogin.cnf和mysqld-auto.cnf,前者是使用mysql_config_editor创建的,并且是加密的,后者是服务器以JSON格式创建的。
在运行MySQL程序时,命令行上可能给出的任何长选项也可以在选项文件中给出。要获取程序的可用选项列表,请使用--help选项运行它。(对于mysqld,使用--verbose和--help。)
在选项文件中指定选项的语法类似于命令行语法。但是,在选项文件中,可以省略选项名称中的前两个破折号,并且每行只指定一个选项。例如,命令行上的--quick和--host=localhost应在选项文件的单独行中指定为quick和host=localhost。要在选项文件中指定格式为--lose-opt_name的选项,请将其写为lose-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。
选项文件值的转义规则与Windows路径名特别相关,Windows路径名使用\作为路径名分隔符。如果Windows路径名中的分隔符后面跟有转义序列字符,则必须写为\\。如果不是,它可以写成\\或\。或者,/可以用于Windows路径名,并被视为\。假设您想在选项文件中指定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]和[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-5.7]、[mysqld-8.0]等的组。以下组表示sql_mode设置应仅由版本号为8.0.x的MySQL服务器使用:
[mysqld-8.0]
sql_mode=TRADITIONAL
3 选项文件包含
在选项文件中可以使用!include指令,以包含其他选项文件和!included用于在特定目录中搜索选项文件。例如,要包含/home/mydir/myot.cnf文件,请使用以下指令:
!include /home/mydir/myopt.cnf
要搜索/home/mydir目录并读取其中找到的选项文件,请使用以下指令:
!includedir /home/mydir
MySQL不保证读取目录中选项文件的顺序。
注意:在Unix操作系统中,如果软件或系统使用!includedir
来查找并包含目录下的配置文件,那么确实有可能存在一种约定,即只有文件名以.cnf
结尾的文件才会被包含。这种约定是为了提高配置文件的可识别性和管理性。然而,在Windows操作系统中,.cnf
扩展名在某些Windows应用程序中也可能被用作配置文件的扩展名,但更常见的是使用.ini
扩展名来表示初始化文件,这些文件通常包含软件运行所需的配置设置。因此,如果!includedir
(或类似的)指令在Windows环境下也被用于查找和包含配置文件,那么它可能会检查具有.ini
或.cnf
扩展名的文件。
像其他选项文件一样写入包含的选项文件的内容。也就是说,它应该包含多组选项,每组选项前面都有一个[group]行,指示选项适用的程序。
在处理包含的文件时,只使用当前程序正在查找的组中的选项。其他群组(groups )被忽略了。假设my.cnf文件包含以下行:
!include /home/mydir/myopt.cnf
假设/home/mydir/myot.cnf看起来像这样:
[mysqladmin]
force
[mysqld]
key_buffer_size=16M
如果my.cnf由mysqld处理,则只使用/home/mydir/myot.cnf中的[mysqld]组。如果文件由mysqladmin处理,则只使用[mysqladmin]组。如果文件由任何其他程序处理,则不使用/home/mydir/myot.cnf中的任何选项。
!includedir
指令在处理时与单个文件包含指令(如!include
)相似,但有一个关键的区别:!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是文件的最后一行,请确保在末尾附加换行符;否则,该行将被忽略。