目录
[3.2.1 配置文件处理顺序](#3.2.1 配置文件处理顺序)
[3.2.1.1 Windows配置](#3.2.1.1 Windows配置)
[3.2.1.2 Unix和类Unix系统配置](#3.2.1.2 Unix和类Unix系统配置)
[3.2.2 配置文件语法](#3.2.2 配置文件语法)
[3.2.3 指定配置文件](#3.2.3 指定配置文件)
1.配置方式
有几种方法可以指定MySQL程序的选项:
命令行:
在程序名称后面的命令行中列出选项。这对于应用于程序的特定调用的选项来说是常见的。
配置文件:
列出程序启动时读取的配置文件 中的选项。这对于您希望程序每次运行时使用的选项来说是常见的。
环境变量
列出环境变量中的选项(参见第6.2.9节"设置环境变量")
此方法对于每次运行程序时要应用的选项非常有用。在实践中,选项文件更常用于此目的,但第7.8.3节"在Unix上运行多个MySQL实例"讨论了环境变量非常有用的一种情况。它描述了一种方便的技术,使用这些变量为服务器和客户端程序指定TCP/IP端口号和Unix套接字文件。
2.配置优先级
选项是按顺序处理 的,因此,如果一个选项被指定多次,则最后一次出现的选项优先。以下命令使mysql连接到在localhost上运行的服务器:
sql
mysql -h example.com -h localhost
有一个例外 :对于mysqld,--user选项的第一个实例被用作安全预防措施,以防止在选项文件中指定的用户在命令行上被重写。
如果设置了冲突的相关的选项,则后面的选项优先于前面的选项。以下命令以"无列名"模式运行mysql:
sql
mysql --column-names --skip-column-names
MySQL程序首先通过检查环境变量 ,然后查找配置文件 ,然后通过查找命令行 来确定给出哪些选项。
配置优先级从低到高:
环境变量<配置文件<命令行
因为后面的选项优先于前面的选项 ,所以处理顺序意味着环境变量的优先级最低 ,命令行选项的优先级最高。
有一个例外:数据目录中的mysqld-auto.cnf配置文件是最后处理的,因此它甚至优先于命令行选项。
这里博主理解是,mysqld-auto.cnf配置文件中的配置优先级是大于命令行的优先级,也就是说命令行和配置文件都配置了某配置后,以配置文件为准。
您可以通过在配置文件 中为程序指定默认选项值来利用MySQL程序处理选项的方式。
这使您能够避免每次运行程序时键入它们,同时使您能够在必要时使用命令行选项覆盖默认值。
3.配置教程
3.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**。但是,对于缩写形式,如果给定了password的值,则它必须在选项字母后面,没有空格:
如果选项字母后面有空格,则程序无法判断下面的参数是密码值还是其他类型的参数。因此,以下两个命令具有两种完全不同的含义:
第一个命令指示mysql使用test的密码值,但不指定默认数据库。
第二个指令mysql提示输入密码值,并使用test作为默认数据库。
sqlmysql -ptest mysql -p test
在选项名称中,短划线(-)和下划线(_)在大多数情况下可以互换使用,尽管前导短划线不能作为下划线。
例如,--skip-grant-tables 和**--skip_grant_tables**是等效的。
在本手册中,我们在选项名称中使用破折号,下划线有意义的地方除外。例如,--log-bin和--log_bin就是这种情况,它们是不同的选项。我们也鼓励你这样做。
sqlSET GLOBAL general_log = ON; SELECT @@GLOBAL.general_log;
在服务器启动时,系统变量的语法与命令选项的语法相同,因此在变量名中,短划线和下划线可以互换使用。例如,--general_log=ON和--general-log=ON是等效的。(对于选项文件中设置的系统变量也是如此。)
对于采用数值的选项,该值可以用后缀K、M或G来表示1024, 1024² or 1024³ 的倍数。
从MySQL 8.0.14开始,后缀也可以是T、P 和E, 表示1024 ⁴**、1024** ⁵或1024^6的倍数。
后缀字母可以是大写或小写。
例如,下面的命令告诉mysqladmin ping服务器1024次,每次ping之间睡眠10秒:
sqlmysqladmin --count=1K --sleep=10 ping
将文件名指定为选项值时,请避免使用**~ shell元字符**。它可能不会像你所期望的那样被解释。就是避免用这个~~~~~~~~
在命令行中给出包含空格 的选项值时,必须将其引用。
例如,--execute(或-e)选项可以与mysql一起使用,将一个或多个分号分隔的SQL语句传递给服务器。
当使用此选项时,mysql会执行选项值中的语句并退出。语句必须用引号括起来。例如
sql
$> mysql -u root -p -e "SELECT VERSION();SELECT NOW()"
Enter password: ******
+------------+
| VERSION() |
+------------+
| 8.0.19 |
+------------+
+---------------------+
| NOW() |
+---------------------+
| 2019-09-03 10:36:48 |
+---------------------+
$>
注意:
长格式(--execute)后面跟一个等号(=)。
若要在语句中使用带引号的值,必须转义内部引号,或者在语句中与用于引用语句本身的引号使用不同类型的引号。
命令处理器的功能决定了您可以选择使用单引号 还是双引号,以及转义引号字符的语法。
例如,如果命令处理器支持单引号 或双引号引用 ,则可以在语句周围使用双引号 ,并对语句中的任何引用值使用单引号。
博主PS:
写过JS的朋友应该知道这里的意思了。当多个引号嵌套的时候,可以最外层用双引号,内层用单引号。
3.2.使用配置文件
大多数MySQL程序可以从选项文件(有时称为配置文件)中读取启动选项。
博主PS:
官方文档英文原文为:option files (sometimes called configuration files).
中文更适合翻译为配置文件。
配置文件提供了一种方便的方式来指定常用选项,这样每次运行程序时都不需要在命令行中输入这些选项。
要确定程序是否读取配置文件,请使用--help选项调用它。(对于mysqld,请使用--verbose和--help。)如果程序读取选项文件,则帮助消息会指示它要查找哪些文件以及可以识别哪些选项组。
注意:
一个以**--no-defaults选项** 启动的MySQL程序不读取除**.mylogin.cnf**之外的任何选项文件。
在禁用persisted_globals_load系统变量的情况下启动的服务器
无法读取mysqld-auto.cnf。
许多配置文件 都是使用任何文本编辑器创建的纯文本文件。例外情况是:
包含登录路径选项的**.mylogin.cnf**文件。
这是一个由mysql_config_editor实用程序创建的加密文件。
请参阅第"mysql_config_editor--mysql配置实用程序"。
【MySQL精通之路】管理和实用程序-MySQL配置实用程序-mysql_config_editor-CSDN博客
"登录路径"是一个选项组,只允许某些选项:主机、用户、密码、端口和套接字。
客户端程序使用**--login-path** 选项指定要从**.mylogin.cnf**读取的登录路径。
data目录中的mysqld-auto.cnf文件。此JSON格式文件包含持久化的系统变量设置。
它是由服务器在执行SET PERSIST或SET PERSIST_ONLY语句时创建的。
参见"持久化系统变量"。
【MySQL精通之路】系统变量-持久化系统变量-CSDN博客
mysqld-auto.cnf的管理应该留给服务器,而不是手动执行。
3.2.1 配置文件处理顺序
MySQL按照以下讨论中描述的顺序查找选项文件,并读取任何存在的选项文件。如果您要使用的选项文件不存在,请使用刚才讨论的适当方法创建它。
注意:
有关与NDB群集程序一起使用的选项文件的信息
请参阅"NDB群集的配置"
3.2.1.1 Windows配置
在Windows上,MySQL程序按照指定的顺序 从下表中显示的文件中读取启动选项 (首先列出的文件优先读取,稍后读取的文件优先)。
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环境变量的值确定其确切位置:
bash
C:\> echo %WINDIR%
%APPDATA%表示Windows应用程序数据目录的值。使用以下命令根据APPDATA环境变量的值确定其确切位置:
bash
C:\> echo %APPDATA%
BASEDIR 表示MySQL的基本安装目录。
当使用MySQL安装程序安装MySQL 8.0时,通常是C:\PROGRAMDIR\MySQL\MyServer 8.0,其中PROGRAMDIR表示程序目录(通常是Windows的英语版本的程序文件)。
请参阅"适用于Windows的MySQL安装程序"。
参阅待完成,请催更!
重要:虽然MySQL安装程序将大多数文件放在PROGRAMDIR 下,但默认情况下,它会将my.ini安装在**C:\ProgramData\MySQL\MySQLServer8.0\**目录下。
DATADIR 表示MySQL数据目录。
用于查找mysqld-auto.cnf ,其默认值是MySQL编译时内置的数据目录位置,但可以通过**--datadir**进行更改,该datadir指定为在处理mysqld-auto.com.cnf之前处理的配置文件或命令行选项。
3.2.1.2 Unix和类Unix系统配置
在Unix和类Unix系统上,MySQL程序按照指定的顺序从下表中显示的文件中读取启动配置(首先列出的文件优先读取,稍后读取的文件优先)。
注意:
在Unix平台上,MySQL会忽略全局可写的配置文件。这是有意作为一种安全措施。
File Name | 用途 |
---|---|
/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选项为CMake指定的目录。默认情况下,这是位于编译安装目录下的etc目录。
MYSQL_HOME
是一个环境变量,包含特定于服务器的my.cnf文件所在目录的路径。如果没有设置MYSQL_HOME,并且使用mysqld_safe程序启动服务器,则mysqld_safe会将其设置为MYSQL基本安装目录BASEDIR。
DATADIR
表示MySQL数据目录。用于查找mysqld-auto.cnf,其默认值是MySQL编译时内置的数据目录位置,但可以通过--datadir进行更改,该datadir指定为在处理mysqld-auto.com.cnf之前处理的选项文件或命令行选项。
如果找到给定选项的多个实例,则最后一个实例优先,但有一个例外:对于mysqld,--user选项的第一个实例用作安全预防措施,以防止选项文件中指定的用户在命令行上被重写。
3.2.2 配置文件语法
以下配置文件语法适用于手动编辑的文件。
这不包括:
使用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]
group是要为其设置选项的程序或组的名称。在编组行之后,任何选项设置行都将应用于命名编组,直到给出选项文件或另一编组行的末尾为止。选项组名称不区分大小写。
opt_name
这相当于命令行中的--opt_name。
opt_name=value
这相当于命令行中的--opt_name=value。在选项文件中,可以在=字符周围使用空格,这在命令行中是不正确的。va
前导空格 和尾随空格 将自动从选项名称和值中删除。
您可以在选项值中使用转义序列**\b、\t、\n、\r、\\** 和**\s**来表示退格符、制表符、换行符、回车符、反斜杠和空格字符。在选项文件中,应用以下转义规则:
后面跟有有效转义序列字符的反斜杠将转换为该序列所表示的字符。例如,\s被转换为一个空格。
后面没有有效转义序列字符的反斜杠保持不变。例如,\S保持原样。
前面的规则意味着文字反斜杠可以给定为\\,或者如果后面没有有效的转义序列字符,则可以给定为\。
选项文件中的转义序列规则 与SQL语句中字符串文字中的转义顺序规则略有不同。
在后一种情况下,如果"x"不是有效的转义序列字符,\x将变为"x"而不是\x。
参见"字符串文字"。
选项文件值的转义规则与使用\作为路径名分隔符的Windows路径名特别相关。
如果Windows路径名中的分隔符后面跟着转义序列字符,则必须写成\\。
它可以写成\\或\,如果不是。或者,/可以在Windows路径名中使用,并被视为\。
假设您想在配置文件中指定C:\Program Files\MySQL\MySQL Server 8.0的基本目录。
这可以通过多种方式实现。一些例子:
bash
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]组更通用,因为它由所有客户端程序读取,而[mysqldump]组仅由mysqldump读取。
稍后指定的选项会覆盖先前指定的选项,因此将选项组按[client]、[mysqldump]的顺序排列,可以使特定于mysqldump的选项覆盖[client]选项。
以下是一个典型的全局选项文件:
bash
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=16M
max_allowed_packet=128M
[mysqldump]
quick
以下是一个典型的用户选项文件:
bash
[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服务器使用:
bash
[mysqld-8.0]
sql_mode=TRADITIONAL
3.2.3 指定配置文件
可以使用**"!"在配置文件中包含指令以包含其他配置文件和!includedir**用于在特定目录中搜索选项文件。
例如,要包含/home/mydir/myopt.cnf文件,请使用以下指令:
bash
!include /home/mydir/myopt.cnf
要搜索/home/mydir目录并读取在其中找到的选项文件,请使用以下指令:
bash
!includedir /home/mydir
MySQL无法保证读取目录中配置文件的顺序。
注意:
使用找到并包含的任何文件**!includedir指令在Unix操作系统上的文件名必须以.cnf结尾。在Windows上,此指令检查扩展名为.ini或.cnf**的文件。
像编写任何其他配置文件一样,编写包含的配置文件的内容。也就是说,它应该包含多组选项,每个选项前面都有一行[group],指示应用这些选项的程序。
在处理包含的文件时,仅使用当前程序正在查找的组中的那些选项。
其他组将被忽略。假设my.cnf文件包含以下行:
bash
!include /home/mydir/myopt.cnf
假设/home/mydir/myopt.cnf如下所示:
sql
[mysqladmin]
force
[mysqld]
key_buffer_size=16M
如果my.cnf由mysqld处理,则仅使用/home/mydir/myopt.cnf中的[mysqld]组。
如果文件由mysqladmin处理,则只使用[mysqladmin]组。
如果文件由任何其他程序处理,则不会使用/home/mydir/myopt.cnf中的任何选项。
这个includedir指令的处理方式类似,只是读取命名目录中的所有选项文件。
如果选项文件包含!包括或!包括在指令中,无论选项文件出现在文件中的什么位置,只要处理选项文件,都会处理由这些指令命名的文件。
为了使包含指令起作用,文件路径不应在引号内指定,并且不应具有转义序列。例如,my.ini中提供的以下语句读取选项文件myots.ini:
sql
!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是文件中的最后一行,请确保在末尾附加一行换行符**;否则,该行将被忽略。
未完待续,欢迎催更,欢迎关注,点赞,收藏,一键三连
3.3.影响配置文件处理的命令行选项
大多数支持配置文件的MySQL程序都支持以下选项。
因为这些配置会影响配置文件的处理,所以它们必须在命令行中给出,而不是在选项文件中。
为了正常工作,必须先给出这些选项中的每一个,然后再给出其他选项,但以下情况除外:
--print-defaults 可以在**--defaults-file, --defaults-extra-file, --login-path.**之后使用。
在Windows上,如果服务器是使用--defaults文件和--install选项启动的,则必须首先使用--install。请参阅"将MySQL作为Windows服务启动"。
将文件名指定为配置的值时,请避免使用**~shell** 元字符,因为它可能无法按预期进行解析。
文件配置摘要
配置文件 | 描述 |
---|---|
--defaults-extra-file | 除了常规选项文件外读取命名选项文件 |
--defaults-file | 只读命名选项文件 |
--defaults-group-suffix | 选项组后缀值 |
--login-path | 从.mylogin.cnf读取登录路径选项 |
--no-defaults | 读取无选项文件 |
3.3.1 --defaults-extra-file
--defaults-extra-file=file_name
在全局配置文件之后读取此选项文件,但(在Unix上)在用户配置文件之前读取,(在所有平台上)在登录路径文件之前读取。
(有关选项文件使用顺序的信息,请参阅第6.2.2.2节"使用选项文件"。)
如果文件**不存在或无法访问,则会发生错误。**如果file_name不是绝对路径名,则会相对于当前目录进行解析。
3.3.2 --defaults-file
--defaults-file=file_name
只读给定的配置文件。
如果文件不存在或无法访问,则会发生错误。如果指定为相对路径名而不是完整路径名,则文件名将相对于当前目录进行解释。
例外:
即使使用--defaults文件,mysqld也会读取mysqld-auto.cnf, 客户端程序也会读取**.mylogin.cnf。**
请参阅本节的介绍,了解可指定此配置位置约束条件。
3.3.2 --defaults-group-suffix
--defaults-group-suffix=str
不仅读取通常的配置组,还读取具有通常名称和后缀str的组。
例如:
mysql客户端通常读取[client]和[mysql]组。
如果这个选项被指定为--defaults group后缀=_other,mysql还会读取[client_other]和[mysql_other]组。
3.3.3 --login-path
--login-path=name
从**.mylogin.cnf登录路径文件** 中指定的登录路径读取配置。"登录路径"是一个选项组,包含指定要连接到哪个MySQL服务器以及要作为哪个帐户进行身份验证的选项。
要创建或修改登录路径文件,请使用MySQL_config_editor实用程序。
请参阅"mysql_config_editor--mysql配置实用程序"。
【MySQL精通之路】管理和实用程序-MySQL配置实用程序-mysql_config_editor-CSDN博客
客户端程序 读取与登录路径对应的选项组,以及程序默认读取的选项组。考虑以下命令:
sql
mysql --login-path=mypath
默认情况下,mysql客户端读取[client]和[mysql]选项组。
因此,对于显示的命令,mysql从其他选项文件中读取[client]和[mysql],从登录路径文件中读取[client]、[mysql]和[mypath]。
即使使用了**--no defaults选项** ,客户端程序也会读取登录路径文件。
要指定备用登录路径文件名,请设置MYSQL_TEST_LOGIN_FILE环境变量。
请参阅本节的介绍,了解可指定此选项的位置的约束条件。
3.3.4 --no-defaults
不读取任何配置文件。
如果由于从配置文件中读取未知选项 而导致程序启动失败,则不能使用任何默认值来阻止读取这些配置。
例外情况是,即使不使用默认值,客户端程序也会读取**.mylogin.cnf**登录路径文件(如果存在)。这允许以比在命令行上更安全的方式指定密码,即使不存在默认值。要创建.mylogin.cnf,请使用mysql_config_editor实用程序。
请参阅"mysql_config_editor--mysql配置实用程序"。
3.3.5 --print-defaults
打印程序名称及其从配置文件中获得的所有选项。密码值被屏蔽。
请参阅本节的介绍,了解可指定此配置的位置的约束条件。
3.4.配置选项修改器
有些选项是"布尔值",可以打开或关闭控制行为。
例如,mysql客户端支持--column-names选项,该选项决定是否在查询结果的开头显示一行列名。
默认情况下,此选项处于启用状态。
然而,在某些情况下,您可能需要禁用它,例如当将mysql的输出发送到另一个程序时,该程序希望只看到数据,而不是初始头行。
要禁用列名,可以使用以下任意形式指定该选项:
sql
--disable-column-names
--skip-column-names
--column-names=0
--disable和--skip前缀以及=0后缀都具有相同的效果:它们关闭了选项。
选项的"启用"形式可以通过以下任何方式指定:
sql
--column-names
--enable-column-names
--column-names=1
值ON、TRUE、OFF和FALSE也可识别为布尔选项(不区分大小写)。
如果某个选项的前缀为--loose,则如果程序无法识别该选项,则不会退出并返回错误,而是只发出警告:
sql
$> 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时,服务器会产生以下错误:
sql
Maximum value of 'back_log' cannot be set
3.5.使用选项设置程序变量
许多MySQL程序都有内部变量 ,可以在运行时使用set语句进行设置。
参见"变量赋值的SET语法"和"使用系统变量"。
这些程序变量中的大多数也可以在服务器启动时使用与指定程序选项相同的语法进行设置。
例如,mysql有一个max_allowed_packet变量,该变量控制其通信缓冲区的最大大小。
要将mysql的max_allowed_packet变量设置为16MB的值,请使用以下任一命令:
sql
mysql --max_allowed_packet=16777216
mysql --max_allowed_packet=16M
第一个命令以字节为单位指定值。
第二个指定以兆字节为单位的值。对于采用数值的变量,该值可以用后缀K、M或G来表示1024、1024的2次方或1024的3次方的倍数。
(例如,当用于设置max_allowed_packet时,后缀表示千字节、兆字节或千兆字节的单位。)从MySQL 8.0.14开始,后缀也可以是T、P和E,表示10244、10245或10246的倍数。
后缀字母可以是大写或小写。
在选项文件中,变量设置不带前导短划线:
sql
[mysql]
max_allowed_packet=16777216
sql
[mysql]
max_allowed_packet=16M
如果您愿意,选项名称中的下划线可以指定为短划线。以下选项组是等效的。两者都将服务器的密钥缓冲区大小设置为512MB:
sql
[mysqld]
key_buffer_size=512M
[mysqld]
key-buffer-size=512M
用于指定值乘数的后缀可以在程序启动时设置变量时 使用,但不能在运行时使用set设置值。
另一方面,使用SET,您可以使用表达式来分配变量的值,但当您在服务器启动时设置变量时,这是不正确的。
例如,以下第一行在程序调用时是合法的,但第二行不是:
sql
$> mysql --max_allowed_packet=16M
$> mysql --max_allowed_packet=16*1024*1024
相反,以下第二行在运行时是合法的,但第一行不是:
sql
mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
3.6.配置默认值、配置期望值和=符号
按照惯例,分配值的长形式选项用等号**(=)**书写,如下所示:
sql
mysql --host=tonfisk --user=jon
对于需要值(即没有默认值)的配置,不需要等号,因此以下内容也有效:
sql
mysql --host tonfisk --user jon
在这两种情况下,mysql客户端都会尝试使用用户名为"jon"的帐户连接到名为"tonfisk"的主机上运行的mysql服务器。
由于这种行为,当没有为期望的选项提供值时,偶尔会出现问题。
考虑以下示例,其中用户以用户jon的身份连接到运行在主机tonfisk上的MySQL服务器:
sql
$> 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.37 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)
省略其中一个选项的所需值会产生错误,例如此处显示的错误:
sql
$> mysql --host 85.224.35.45 --user
mysql: option '--user' requires an argument
在这种情况下,mysql无法在--user选项后面找到一个值,因为在命令行上,该值后面没有任何内容。
但是,如果您省略了不是最后一个要使用的选项的值,则会得到一个您可能没有预料到的不同错误:
sql
$> mysql --host --user jon
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)
因为mysql假设命令行上**--host后面的任何字符串都是主机名**,
所以--host--user被解释为--host=--user,并且客户端尝试连接到在名为"--user"的主机上运行的mysql服务器。
具有默认值的选项在指定值时总是需要等号;
否则会导致错误。
例如,MySQL server --log error选项 的默认值为host_name.err,其中host_name是运行MySQL的主机的名称。假设您在主机名为"tonfisk"的计算机上运行MySQL,并考虑以下对mysqld_safe的调用:
sql
$> 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
$>
关闭服务器后,按如下方式重新启动服务器:
sql
$> 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**启动服务器,但这不会产生预期效果,如下所示:
sql
$> 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**作为错误日志启动,但随后关闭。检查此文件的最后几行可以看出原因:
sql
$> 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
由于--log error选项提供了一个默认值,因此必须使用等号为其分配一个不同的值,如下所示:
sql
$> mysqld_safe --log-error=my-errors &
[1] 31437
$> 080111 22:54:15 mysqld_safe Logging to '/usr/local/mysql/var/my-errors.err'.
080111 22:54:15 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>
现在服务器已经成功启动,并将错误记录到文件**/usr/local/mysql/var/my-errors.err**中。
在选项文件中指定选项值时也会出现类似的问题。例如,考虑一个my.cnf文件,该文件包含以下内容:
sql
[mysql]
host
user
当mysql客户端读取该文件时,这些条目被解析为**--host--user** 或**--host=--user**,结果如下:
sql
$> mysql
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)
但是,在选项文件中,不使用等号。假设my.cnf文件如下所示:
sql
[mysql]
user jon
在这种情况下,尝试启动mysql会导致不同的错误:
sql
$> mysql
mysql: unknown option '--user jon'
如果在配置文件中写入host tonfisk而不是host=tonfisk,则会出现类似的错误。相反,您必须使用等号:
sql
[mysql]
user=jon
现在登录尝试成功:
sql
$> mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.0.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT USER();
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
1 row in set (0.00 sec)
这与不需要等号的命令行的行为不同:
sql
$> mysql --user jon --host tonfisk
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 8.0.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> SELECT USER();
+---------------+
| USER() |
+---------------+
| jon@tonfisk |
+---------------+
1 row in set (0.00 sec)
在配置文件中指定一个需要值 但没有值的选项 会导致服务器中止并返回错误。