MySQL8 中文参考(八)(2)https://developer.aliyun.com/article/1565882
6.2.2 指定程序选项
6.2.2.1 在命令行上使用选项
6.2.2.2 使用选项文件
6.2.2.3 影响选项文件处理的命令行选项
6.2.2.4 程序选项修饰符
6.2.2.5 使用选项设置程序变量
6.2.2.6 选项默认值,期望值的选项和=符号
有几种方法可以为 MySQL 程序指定选项:
- 在程序名称后面列出命令行上的选项。这对于适用于程序特定调用的选项很常见。
- 在程序启动时读取的选项文件中列出选项。这对于您希望程序每次运行时使用的选项很常见。
- 在环境变量中列出选项(参见第 6.2.9 节,“设置环境变量”)。这种方法适用于您希望每次程序运行时应用的选项。在实践中,选项文件更常用于此目的,但第 7.8.3 节,“在 Unix 上运行多个 MySQL 实例”讨论了一种情况,其中环境变量可以非常有用。它描述了一种使用这些变量指定服务器和客户端程序的 TCP/IP 端口号和 Unix 套接字文件的方便技术。
选项按顺序处理,因此如果一个选项被多次指定,最后一次出现的选项优先。以下命令使mysql连接到运行在localhost
上的服务器:
mysql -h example.com -h localhost
有一个例外情况:对于mysqld,第一个--user
选项实例被用作安全预防措施,以防止在选项文件中指定的用户被在命令行上覆盖。
如果给出冲突或相关选项,后续选项优先于先前选项。以下命令以“无列名”模式运行mysql:
mysql --column-names --skip-column-names
MySQL 程序通过检查环境变量确定首先给出哪些选项,然后通过处理选项文件,最后通过检查命令行。因为后续选项优先于先前选项,处理顺序意味着环境变量具有最低优先级,命令行选项具有最高优先级。
对于服务器,有一个例外情况:数据目录中的mysqld-auto.cnf选项文件最后处理,因此甚至优先于命令行选项。
你可以利用 MySQL 程序处理选项的方式,通过在选项文件中指定程序的默认选项值。这样一来,你就可以避免每次运行程序时都输入它们,同时又可以通过使用命令行选项在必要时覆盖默认值。
原文:
dev.mysql.com/doc/refman/8.0/en/command-line-options.html
6.2.2.1 在命令行上使用选项
在命令行上指定的程序选项遵循以下规则:
- 选项在命令名称之后给出。
- 选项参数以一个短横线或两个短横线开头,取决于它是选项名称的短格式还是长格式。许多选项都有短格式和长格式。例如,
-?
和--help
是指示 MySQL 程序显示帮助消息的选项的短格式和长格式。 - 选项名称区分大小写。
-v
和-V
都是合法的,并且具有不同的含义(它们是--verbose
和--version
选项的相应短格式)。 - 一些选项在选项名称后面需要一个值。例如,
-h localhost
或--host=localhost
表示 MySQL 服务器主机给客户端程序。选项值告诉程序 MySQL 服务器运行的主机名称。 - 对于需要值的长选项,选项名称和值之间用
=
符号分隔。对于需要值的短选项,选项值可以紧跟在选项字母后面,或者选项字母后面可以有一个空格:-hlocalhost
和-h localhost
是等效的。一个例外是用于指定 MySQL 密码的选项。这个选项可以以长格式给出,如--password=*
pass_val*
,也可以作为--password
。在后一种情况下(没有给出密码值),程序会交互式提示您输入密码。密码选项也可以以短格式给出,如-p*
pass_val*
或-p
。但是,对于短格式,如果给出了密码值,必须紧跟在选项字母后面,不能有空格:如果选项字母后面有空格,程序无法判断后面的参数是密码值还是其他类型的参数。因此,以下两个命令具有完全不同的含义:
mysql -ptest mysql -p test
- 第一个命令指示mysql使用密码值
test
,但没有指定默认数据库。第二个命令指示mysql提示输入密码值,并将test
作为默认数据库。 - 在选项名称中,短横线(
-
)和下划线(_
)在大多数情况下可以互换使用,尽管前导短横线不能用下划线表示。例如,--skip-grant-tables
和--skip_grant_tables
是等效的。
在本手册中,我们在选项名称中使用破折号,除非下划线具有特殊意义。例如,--log-bin
和--log_bin
是不同的选项。我们鼓励您也这样做。 - MySQL 服务器有一些只能在启动时指定的命令选项,以及一组系统变量,其中一些可以在启动时、运行时或两者同时设置。系统变量名称使用下划线而不是破折号,并且在运行时引用时(例如,使用
SET
或SELECT
语句),必须使用下划线写成:
SET GLOBAL general_log = ON; SELECT @@GLOBAL.general_log;
- 在服务器启动时,系统变量的语法与命令选项相同,因此在变量名称中,破折号和下划线可以互换使用。例如,
--general_log=ON
和--general-log=ON
是等效的。(这也适用于在选项文件中设置的系统变量。) - 对于需要数字值的选项,值可以附加
K
、M
或G
后缀,以表示 1024、1024² 或 1024³ 的倍数。从 MySQL 8.0.14 开始,后缀也可以是T
、P
和E
,表示 1024⁴、1024⁵ 或 1024⁶ 的倍数。后缀字母可以是大写或小写。
例如,以下命令告诉mysqladmin向服务器发送 1024 次 ping,每次 ping 之间间隔 10 秒:
mysqladmin --count=1K --sleep=10 ping
- 当指定文件名作为选项值时,避免使用
~
shell 元字符。它可能不会被解释为你期望的那样。
在命令行中给出包含空格的选项值时,必须用引号引起来。例如,--execute
(或 -e
)选项可与mysql一起使用,将一个或多个以分号分隔的 SQL 语句传递给服务器。当使用此选项时,mysql执行选项值中的语句并退出。语句必须用引号括起来。例如:
$> mysql -u root -p -e "SELECT VERSION();SELECT NOW()" Enter password: ****** +------------+ | VERSION() | +------------+ | 8.0.19 | +------------+ +---------------------+ | NOW() | +---------------------+ | 2019-09-03 10:36:48 | +---------------------+ $>
注意
长格式(--execute
)后跟等号(=
)。
要在语句中使用带引号的值,你必须要么转义内部的引号,要么在语句中使用与引用语句本身不同类型的引号。你的命令处理器的功能决定了你可以使用单引号还是双引号以及转义引号字符的语法。例如,如果你的命令处理器支持使用单引号或双引号进行引用,你可以在语句周围使用双引号,并在语句中使用单引号引用任何值。
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 Cluster 程序一起使用的选项文件的信息,请参见第 25.4 节,“NDB Cluster 的配置”。
在 Windows 上,MySQL 程序按照以下表格中显示的顺序读取启动选项(先读取列出的文件,后读取的文件优先)。
表 6.1 Windows 系统上读取的选项文件
文件名 | 目的 |
%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
)。参见第 2.3.3 节,“Windows 上的 MySQL Installer”。
重要提示
尽管 MySQL Installer 将大多数文件放在*PROGRAMDIR
*下,但默认情况下会将my.ini
安装在C:\ProgramData\MySQL\MySQL Server 8.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 |
全局选项 |
* 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 构建时使用的SYSCONFDIR
选项指定的目录。默认情况下,这是编译安装目录下的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
选项的第一个实例作为安全预防措施,防止在命令行中覆盖选项���件中指定的用户。
选项文件语法
下面对选项文件语法的描述适用于您手动编辑的文件。这不包括使用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
”而不是 \*
x*
。参见 第 11.1.1 节,“字符串文字”。
选项文件值的转义规则对于使用 \
作为路径名分隔符的 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
选项文件包含
可以在选项文件中使用!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*
是文件中的最后一行,请确保在末尾添加一个换行符;否则,该行将被忽略。
6.2.2.3 影响选项文件处理的命令行选项
大多数支持选项文件的 MySQL 程序处理以下选项。由于这些选项会影响选项文件处理,因此必须在命令行中给出,而不是在选项文件中。为了正常工作,这些选项中的每一个必须在其他选项之前给出,但有以下例外:
--print-defaults
可以立即在--defaults-file
、--defaults-extra-file
或--login-path
之后使用。- 在 Windows 上,如果服务器使用
--defaults-file
和--install
选项启动,则--install
必须首先。请参见第 2.3.4.8 节,“将 MySQL 作为 Windows 服务启动”。
在指定文件名作为选项值时,避免使用~
shell 元字符,因为它可能不会按您的预期解释。
表 6.3 选项文件选项摘要
选项名称 | 描述 |
–defaults-extra-file | 除了通常的选项文件外,还读取指定的选项文件 |
–defaults-file | 仅读取指定的选项文件 |
–defaults-group-suffix | 选项组后缀值 |
–login-path | 从.mylogin.cnf 中读取登录路径选项 |
–no-defaults | 不读取任何选项文件 |
--defaults-extra-file=*
file_name*
命令行格式 | --defaults-extra-file=filename |
类型 | 文件名 |
默认值 | [none] |
- 读取此选项文件在全局选项文件之后,但(在 Unix 上)在用户选项文件之前,并且(在所有平台上)在登录路径文件之前。(有关选项文件使用顺序的信息,请参见第 6.2.2.2 节,“使用选项文件”。)如果文件不存在或无法访问,将会出现错误。如果*
file_name
*不是绝对路径名,则将其解释为相对于当前目录。
请参阅本节开头有关此选项可能指定位置的限制。 --defaults-file=*
file_name*
命令行格式 | --defaults-file=filename |
类型 | 文件名 |
默认值 | [none] |
- 仅读取给定的选项文件。如果文件不存在或无法访问,则会出现错误。*
file_name
*如果作为相对路径名而不是完整路径名给出,则会相对于当前目录进行解释。
例外情况:即使使用--defaults-file
,mysqld会读取mysqld-auto.cnf
,客户端程序会读取.mylogin.cnf
。
请参阅本节介绍有关此选项可能指定的位置的约束。 --defaults-group-suffix=*
str*
命令行格式 | --defaults-group-suffix=string |
类型 | 字符串 |
默认值 | [none] |
- 不仅读取通常的选项组,还读取具有通常名称和后缀*
str
*的组。例如,mysql客户端通常会读取[client]
和[mysql]
组。如果将此选项给出为--defaults-group-suffix=_other
,mysql还会读取[client_other]
和[mysql_other]
组。 --login-path=*
name*
命令行格式 | --login-path=name |
类型 | 字符串 |
默认值 | [none] |
- 从
.mylogin.cnf
登录路径文件中的命名登录路径读取选项。 “登录路径”是一个包含指定要连接到哪个 MySQL 服务器以及要进行身份验证的帐户的选项组。要创建或修改登录路径文件,请使用mysql_config_editor实用程序。请参阅第 6.6.7 节,“mysql_config_editor — MySQL Configuration Utility”。
客户端程序读取与命名登录路径对应的选项组,以及程序默认读取的选项组。考虑以下命令:
mysql --login-path=mypath
- 默认情况下,mysql客户端读取
[client]
和[mysql]
选项组。因此,对于所示的命令,mysql从其他选项文件读取[client]
和[mysql]
,并从登录路径文件中读取[client]
、[mysql]
和[mypath]
。
即使使用--no-defaults
选项,客户端程序也会读取登录路径文件。
要指定替代的登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE
环境变量。
请参阅本节介绍有关此选项可能指定的位置的约束。 --no-defaults
命令行格式 | --no-defaults |
类型 | 布尔值 |
默认值 | false |
- 不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,则可以使用
--no-defaults
来防止读取它们。
例外情况是,即使使用了--no-defaults
,客户端程序仍会读取.mylogin.cnf
登录路径文件(如果存在)。这样即使存在--no-defaults
,也可以以比在命令行上更安全的方式指定密码。要创建.mylogin.cnf
,请使用mysql_config_editor实用程序。请参阅第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。 --print-defaults
命令行格式 | --print-defaults |
类型 | 布尔值 |
默认值 | false |
- 打印程序名称以及从选项文件获取的所有选项。密码值被掩码。
请参阅本节开头有关此选项可能被指定的位置的限制。
6.2.2.4 程序选项修饰符
一些选项是“布尔”类型的,控制可以打开或关闭的行为。例如,mysql 客户端支持一个 --column-names
选项,用于确定是否在查询结果开头显示一行列名。默认情况下,此选项已启用。但是,在某些情况下,您可能希望禁用它,例如当将 mysql 的输出发送到另一个只期望看到数据而不是初始标题行的程序时。
要禁用列名,可以使用以下任何形式指定该选项:
--disable-column-names --skip-column-names --column-names=0
--disable
和 --skip
前缀以及 =0
后缀都具有相同的效果:它们关闭选项。
选项的“启用”形式可以通过以下任何方式指定:
--column-names --enable-column-names --column-names=1
对于布尔选项,值 ON
、TRUE
、OFF
和 FALSE
也被识别(不区分大小写)。
如果一个选项以 --loose
为前缀,程序在不识别该选项时不会退出,而是只发出警告:
$> mysql --loose-no-such-option mysql: WARNING: unknown option '--loose-no-such-option'
当您在同一台机器上从多个 MySQL 安装运行程序并在选项文件中列出选项时,--loose
前缀可能很有用。可以使用 --loose
前缀(或选项文件中的 loose
)提供可能不被所有程序版本识别的选项。识别该选项的程序版本会正常处理它,而不识别它的版本会发出警告并忽略它。
--maximum
前缀仅适用于 mysqld,允许限制客户端程序设置会话系统变量的大小。要实现这一点,使用带有变量名的 --maximum
前缀。例如,--maximum-max_heap_table_size=32M
防止任何客户端将堆表大小限制设置为大于 32M。
--maximum
前缀用于具有会话值的系统变量。如果应用于仅具有全局值的系统变量,将会出现错误。例如,使用 --maximum-back_log=200
,服务器会产生此错误:
Maximum value of 'back_log' cannot be set
6.2.2.5 使用选项设置程序变量
许多 MySQL 程序具有内部变量,可以使用SET
语句在运行时设置。参见 Section 15.7.6.1, “SET Syntax for Variable Assignment”,以及 Section 7.1.9, “Using System Variables”。
这些程序变量中的大多数也可以通过使用适用于指定程序选项的相同语法在服务器启动时设置。例如,mysql有一个max_allowed_packet
变量,控制其通信缓冲区的最大大小。要将mysql的max_allowed_packet
变量设置为 16MB 的值,请使用以下任一命令:
mysql --max_allowed_packet=16777216 mysql --max_allowed_packet=16M
第一个命令以字节为单位指定值。第二个以兆字节为单位指定值。对于需要数字值的变量,值可以附加K
、M
或G
后缀,表示 1024、1024²或 1024³的倍增器。(例如,用于设置max_allowed_packet
时,后缀表示千字节、兆字节或千兆字节的单位。)从 MySQL 8.0.14 开始,后缀也可以是T
、P
和E
,表示 1024⁴、1024⁵或 1024⁶的倍增器。后缀字母可以是大写或小写。
在选项文件中,变量设置不带前导破折号:
[mysql] max_allowed_packet=16777216
或:
[mysql] max_allowed_packet=16M
如果愿意,选项名称中的下划线可以指定为破折号。以下选项组是等效的。两者都将服务器的键缓冲区大小设置为 512MB:
[mysqld] key_buffer_size=512M [mysqld] key-buffer-size=512M
使用后缀来指定值的倍增器可以在程序调用时设置变量,但不能在运行时使用SET
来设置值。另一方面,使用SET
,你可以使用表达式来赋值变量的值,在服务器启动时设置变量时不适用这一点。例如,以下行中的第一行在程序调用时是合法的,但第二行不是:
$> mysql --max_allowed_packet=16M $> mysql --max_allowed_packet=16*1024*1024
相反,以下行中的第二行在运行时是合法的,但第一行不是:
mysql> SET GLOBAL max_allowed_packet=16M; mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
6.2.2.6 选项默认值、期望值的选项和等号
按照惯例,分配值的长形式选项使用等号(=
)符号编写,就像这样:
mysql --host=tonfisk --user=jon
对于需要值的选项(即没有默认值的选项),等号是不需要的,因此以下内容也是有效的:
mysql --host tonfisk --user jon
在这两种情况下,mysql客户端尝试连接到名为“tonfisk”的主机上运行的 MySQL 服务器,使用用户名“jon”。
由于这种行为,当某个期望值的选项没有提供值时,有时会出现问题。考虑以下示例,用户连接到运行在主机tonfisk
上的 MySQL 服务器,用户名为jon
:
$> mysql --host 85.224.35.45 --user jon Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 8.0.36 Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SELECT CURRENT_USER(); +----------------+ | CURRENT_USER() | +----------------+ | jon@% | +----------------+ 1 row in set (0.00 sec)
省略其中一个选项所需的值会导致错误,如下所示:
$> mysql --host 85.224.35.45 --user mysql: option '--user' requires an argument
在这种情况下,mysql无法找到跟在--user
选项后面的值,因为在命令行中它后面没有内容。然而,如果你省略了不是最后一个要使用的选项的值,你会得到一个不同的错误,可能不是你期望的:
$> mysql --host --user jon ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)
因为mysql假定在命令行中跟在--host
后面的任何字符串都是主机名,--host
--user
被解释为--host=--user
,客户端尝试连���到名为--user
的 MySQL 服务器。
具有默认值的选项在分配值时总是需要等号;如果不这样做会导致错误。例如,MySQL 服务器的--log-error
选项具有默认值*
host_name*.err
,其中*host_name
*是 MySQL 正在运行的主机的名称。假设你正在一台名为“tonfisk”的计算机上运行 MySQL,并考虑以下对mysqld_safe的调用:
$> mysqld_safe & [1] 11699 $> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var $>
关闭服务器后,按以下方式重新启动:
$> mysqld_safe --log-error & [1] 11699 $> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var $>
结果是相同的,因为--log-error
后面没有跟任何其他内容,它提供了自己的默认值。(&
字符告诉操作系统在后台运行 MySQL;MySQL 本身会忽略它。)现在假设你希望将错误日志记录到名为my-errors.err
的文件中。你可能尝试使用--log-error my-errors
来启动服务器,但这并没有产生预期的效果,如下所示:
$> mysqld_safe --log-error my-errors & [1] 31357 $> 080111 22:53:31 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 080111 22:53:32 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended [1]+ Done ./mysqld_safe --log-error my-errors
服务器尝试使用/usr/local/mysql/var/tonfisk.err
作为错误日志启动,但随后关闭。检查这个文件的最后几行显示了原因:
$> tail /usr/local/mysql/var/tonfisk.err 2013-09-24T15:36:22.278034Z 0 [ERROR] Too many arguments (first extra is 'my-errors'). 2013-09-24T15:36:22.278059Z 0 [Note] Use --verbose --help to get a list of available options! 2013-09-24T15:36:22.278076Z 0 [ERROR] Aborting 2013-09-24T15:36:22.279704Z 0 [Note] InnoDB: Starting shutdown... 2013-09-24T15:36:23.777471Z 0 [Note] InnoDB: Shutdown completed; log sequence number 2319086 2013-09-24T15:36:23.780134Z 0 [Note] mysqld: Shutdown complete
MySQL8 中文参考(八)(4)https://developer.aliyun.com/article/1565884