使用选项文件

来自泡泡学习笔记
跳到导航 跳到搜索

大多数 MySQL 程序都可以从选项文件(有时称为配置文件)中读取启动选项。选项文件提供了一种方便的方式来指定常用选项,这样每次运行程序时就不必在命令行中输入它们。

要确定程序是否读取选项文件,请使用 --help 选项调用它。(对于 mysqld,请使用 --verbose 和 --help。)如果程序读取选项文件,则帮助消息会指出它查找哪些文件以及它识别哪些选项组。

注意
使用 --no-defaults 选项启动的 MySQL 程序不会读取除 .mylogin.cnf 之外的任何选项文件。

禁用 persisted_globals_load 系统变量启动的服务器不会读取 mysqld-auto.cnf。

许多选项文件都是纯文本文件,可以使用任何文本编辑器创建。例外情况包括:

1、包含登录路径选项的 .mylogin.cnf 文件。这是由 mysql_config_editor 实用程序创建的加密文件。“登录路径”是一个选项组,只允许特定选项:主机、用户、密码、端口和套接字。客户端程序使用 --login-path 选项从 .mylogin.cnf 中指定要读取的登录路径。

要指定替代的登录路径文件名,请设置 MYSQL_TEST_LOGIN_FILE 环境变量。这个变量被 mysql-test-run.pl 测试实用程序使用,但也被 mysql_config_editor 和 MySQL 客户端(如 mysql、mysqladmin 等)识别。

2、数据目录中的 mysqld-auto.cnf 文件。这个 JSON 格式的文件包含持久化系统变量设置。它是由服务器在执行 SET PERSIST 或 SET PERSIST_ONLY 语句时创建的。mysqld-auto.cnf 的管理应留给服务器,并不应手动执行。

3、选项文件处理顺序

4、选项文件语法

5、选项文件包含


选项文件处理顺序

MySQL按照以下讨论中描述的顺序查找选项文件并读取存在的任何选项文件。如果要使用的选项文件不存在,请使用适当的方法创建它,如刚才所讨论的。

在Windows上,MySQL程序按照以下表格中指定的顺序从文件中读取启动选项(首先列出的文件首先读取,稍后读取的文件具有优先权)。

文件名 用途
%WINDIR%\my.ini,%WINDIR%\my.cnf 全局选项
C:\my.ini,C:\my.cnf 全局选项
BASEDIR\my.ini,BASEDIR\my.cnf 全局选项
defaults-extra-file 使用--defaults-extra-file指定的文件(如果有)
%APPDATA%\MySQL.mylogin.cnf 登录路径选项(仅限客户端)
DATADIR\mysqld-auto.cnf 使用SET PERSIST或SET PERSIST_ONLY持久化的系统变量(仅限服务器)

在前面的表格中,%WINDIR%表示Windows目录的位置。这通常是C:\WINDOWS。请使用以下命令从WINDIR环境变量的值确定其确切位置:

C:> echo %WINDIR%

%APPDATA%表示Windows应用程序数据目录的值。请使用以下命令从APPDATA环境变量的值确定其确切位置:

C:> echo %APPDATA%

BASEDIR表示MySQL基本安装目录。当使用MySQL Installer安装MySQL 8.0时,这通常是C:\PROGRAMDIR\MySQL\MySQL Server 8.0,其中PROGRAMDIR表示程序目录(通常是英文版Windows的Program Files)。

重要提示
尽管MySQL Installer将大多数文件放置在PROGRAMDIR下,但默认情况下它会在C:\ProgramData\MySQL\MySQL Server 8.0\目录下安装my.ini。

DATADIR表示MySQL数据目录。作为查找mysqld-auto.cnf的使用,其默认值是在编译MySQL时内置的数据目录位置,但可以通过在处理mysqld-auto.cnf之前作为选项文件或命令行选项指定--datadir来更改它。


在Unix和类Unix系统上,MySQL程序按照以下表格中指定的顺序从文件中读取启动选项(首先列出的文件首先读取,稍后读取的文件具有优先权)。

注意
在Unix平台上,MySQL会忽略所有可由任何人写入的配置文件。这是一项安全措施。
文件名 用途
/etc/my.cnf 全局选项
/etc/mysql/my.cnf 全局选项
SYSCONFDIR/my.cnf 全局选项
$MYSQL_HOME/my.cnf 服务器特定选项(仅限服务器)
defaults-extra-file 使用--defaults-extra-file指定的文件(如果有)
~/.my.cnf 用户特定选项
~/.mylogin.cnf 用户特定登录路径选项(仅限客户端)
DATADIR/mysqld-auto.cnf 使用SET PERSIST或SET PERSIST_ONLY持久化的系统变量(仅限服务器)

在前面的表格中,~表示当前用户的主目录($HOME的值)。

SYSCONFDIR表示在构建MySQL时使用CMake的SYSCONFDIR选项指定的目录。默认情况下,这是编译安装目录下的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。)

在选项文件中指定选项的语法类似于命令行语法。但是,在选项文件中,您省略了选项名称的前两个破折号,并且每行只指定一个选项。例如,在命令行上使用--quick和--host=localhost应在选项文件中的不同行上分别指定为quick和host=localhost。要在选项文件中指定--loose-opt_name形式的选项,请将其写为loose-opt_name。

选项文件中的空行将被忽略。非空行可以采用以下任何形式:

#comment, ;comment

注释行以#或;开头。#注释也可以在行中间开始。
[group]

组是您要设置选项的程序或组的名称。在组行之后,任何选项设置行都适用于命名组,直到选项文件的末尾或给出另一个组行。选项组名称不区分大小写。
opt_name

这相当于命令行上的--opt_name。
opt_name=value

这相当于命令行上的--opt_name=value。在选项文件中,您可以在=字符周围有空格,这在命令行上不是真实的。如果值包含#注释字符,则可以选择将该值括在单引号或双引号中,这是有用的。

选项名称和值的前导和尾随空格将自动删除。

您可以在选项值中使用转义序列\b、\t、\n、\r、\\和\s来表示退格、制表符、换行符、回车符、反斜杠和空格字符。在选项文件中,这些转义规则适用:

1、后跟有效转义序列字符的反斜杠将转换为序列表示的字符。例如,\s将转换为空格。

2、未后跟有效转义序列字符的反斜杠保持不变。例如,\S保留不变。


前面的规则意味着可以将文字反斜杠指定为\\,或者如果未后跟有效转义序列字符,则可以将其指定为\。

选项文件中选项值的转义规则特别适用于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设置MySQL服务器的8.0.x版本号:

[mysqld-8.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是文件中的最后一行,请确保在结尾附加换行符;否则,该行将被忽略。