指定MySQL程序的选项

    有几种方法可以指定MySQL程序的选项:

  • 在程序名称后的命令行上列出选项。这对于应用于程序的特定调用的选项来说很常见。
  • 在程序启动时读取的选项文件中列出选项。这对于希望程序每次运行都使用的选项很常见。
  • 列出环境变量中的选项。对于要在程序每次运行时应用的选项,此方法很有用。

    选项是按顺序处理的,因此,如果多次指定选项,则最后出现的选项优先。以下命令使mysql连接到在localhost上运行的服务器:

mysql -h example.com -h localhost

    有一个例外:对于mysqld,该选项的第一个实例 --user 用作安全预防措施,以防止在命令行中覆盖选项文件中指定的用户。
    如果给出了冲突或相关的选项,则后面的选项优先于前面的选项。以下命令以“ no column names ”模式运行 mysql:

mysql --column-names --skip-column-names

    MySQL程序首先通过检查环境变量,然后通过处理选项文件,然后通过检查命令行来确定给出哪些选项。由于后面的选项优先于前面的选项,因此处理顺序意味着环境变量的优先级最低,而命令行选项的优先级最高。
    通过在选项文件中为程序指定默认选项值,可以利用MySQL程序处理选项的方式。这样一来,您可以避免在每次运行程序时都键入它们,同时可以根据需要使用命令行选项覆盖默认值。
    在旧版本的MySQL中,程序选项可以完整或以任何明确的前缀指定。例如,可以将mysqldump的 -‌-compress 选项指定为 -‌-compr,但不能写做 --comp ,因为后者含义模棱两可。在MySQL 5.7中,不再支持选项前缀,仅接受完整选项。这是因为在为程序实现新选项时,前缀可能会引起问题,而当前明确的前缀将来可能会变得模棱两可。
    示例:
-‌-key-buffer选项现在必须被指定为-‌-key-buffer-size
-‌-skip-grant选项现在必须被指定为-‌-skip-grant-tables

1. 在命令行上使用选项

    在命令行上指定的程序选项遵循一些规则,其中需要注意的几条规则如下:

  • 对于需要取值的长选项,请使用=号分隔选项名称和值。对于需要取值的短选项,选项值可以紧跟在选项字母后面,或者在中间加一个空格: -hlocalhost 和 -h localhost 是相同的。该规则的例外是用于指定MySQL密码的选项,该选项可以用 --password=pass_val 或 --password 的格式给出。在后一种情况下(没有给定密码值),程序会以交互方式提示您输入密码。密码选项也可以缩写为 -ppass-val 或 -p 。但是,对于缩写形式,如果密码值是给定的,则它必须在选项字母后面没有中间空格:如果选项字母后面有空格,程序无法判断后面的参数应该是密码值还是其他类型的参数。因此,以下两个命令具有两个完全不同的含义:
mysql -ptest
mysql -p test

    第一个命令指示mysql使用密码值test,但不指定默认数据库。第二条命令mysql提示输入密码值并将test用作默认数据库。

  • 在选项名称中,破折号(-)和下划线(_)可以互换使用。例如, --skip-grant-tables和 --skip_grant_tables 是等效的(但是,前划线不能作为下划线)。
  • MySQL服务器具有某些只能在启动时指定的命令选项,以及一组系统变量,其中一些可以在启动时,运行时或同时设置。统变量名称使用下划线而不是破折号,并且在临时引用时(例如,使用 SET 或SELECT语句),必须使用下划线:
SET GLOBAL general_log = ON;
SELECT @@GLOBAL.general_log;

    服务器启动时,系统变量的语法与命令选项的语法相同,因此在变量名称中,破折号和下划线可以互换使用。例如,-‌-general_log=ON和 -‌-general-log=ON是等效的。(对于在选项文件中设置的系统变量也是如此。)

  • 对于采用数字值的选项,可以使用K、M或G(大写或小写)作为后缀来指定该值,以指示1024、10242或10243的乘数。例如,以下命令告诉mysqladmin ping服务器1024次,每次ping之间睡眠10秒:
mysqladmin --count=1K --sleep=10 ping
  • 在将文件名指定为选项值时,请避免使用~Shell元字符。可能不会按您预期的那样解释它。
    在命令行中给定包含空格的选项值时,必须用引号引起来。例如, --execute(或-e)选项可与mysql一起使用,以将一个或多个用分号分隔的SQL语句传递给服务器。当使用该选项时,mysql执行选项值中的语句并退出。声明必须用引号引起来。例如:
# mysql -S /var/lib/mysql-replica02/mysql.sock -e "SELECT VERSION();SELECT NOW()"
+-----------+
| VERSION() |
+-----------+
| 5.7.23    |
+-----------+
+---------------------+
| NOW()               |
+---------------------+
| 2020-01-13 15:21:45 |
+---------------------+

    注意:长格式(-‌-execute)后跟等号(=)。
    要在语句中使用带引号的值,您必须转义内部的引号,或在语句内使用与引号本身不同的引号。命令处理器的功能决定了您可以选择使用单引号还是双引号以及转义引号字符的语法。例如,如果命令处理器支持使用单引号或双引号引起来的引用,则可以在语句周围使用双引号,并对语句内的所有带引号的值使用单引号。

2. 使用选项文件

    大多数MySQL程序可以从选项文件(有时称为配置文件)中读取启动选项。选项文件提供了一种方便的方法来指定常用选项,这样就不必在每次运行程序时都在命令行上输入它们。
    注意:以–no-defaults选项开头的MySQL程序除 .mylogin.cnf 以外不读取选项文件。
    许多选项文件是使用任何文本编辑器创建的纯文本文件。.mylogin.cnf 文件是个例外,它包含登录路径选项。这是由mysql_config_editor实用程序创建的加密文件。
    MySQL按照以下讨论中描述的顺序查找选项文件,并读取所有存在的文件。如果您要使用的选项文件不存在,请使用刚刚讨论的适当方法来创建它。

2.1 选项文件处理顺序

    在Unix和类似Unix的系统上,MySQL程序以指定的顺序从下表中显示的文件中读取启动选项(首先列出的文件先读取)。

File NamePurpose
/etc/my.cnfGlobal options
/etc/mysql/my.cnfGlobal options
SYSCONFDIR/my.cnfGlobal options
$MYSQL_HOME/my.cnfServer-specific options (server only)
defaults-extra-fileThe file specified with --defaults-extra-file, if any
~/.my.cnfUser-specific options
~/.mylogin.cnfUser-specific login path options (clients only)

    在上表中,~代表当前用户的主目录($HOME的值)
    DATADIR通常是 /usr/local/mysql/data,尽管这可能因平台或安装方法而异。该值是在编译MySQL时内置的数据目录位置,而不是在mysqld启动时用 --datadir 选项指定的位置。

2.2 选项文件语法(重要)

    选项文件语法的以下说明适用于您手动编辑的文件。不包括使用mysql_config_editor创建并加密的 .mylogin.cnf。
    在选项文件中指定选项的语法类似于命令行语法,但是,在选项文件中,您省略了选项名称中的前两个破折号,并且每行仅指定了一个选项。例如, --quick与 --host=localhost 在命令行上应被指定为 quick与host=localhost,并且在选项文件单独的行。
    选项文件中的空行将被忽略。非空行可以采用以下任何形式:

  • #comment, ;comment
    注释行以#或 ;开头。一个#注释也可以从行的中部开始。
  • [group]
    group是要为其设置选项的程序或组的名称。在组行之后,所有选项设置行都将应用于命名组,直到选项文件末尾或给出另一组。选项组名称不区分大小写。
  • opt_name
    这与命令行上的 --opt_name 等效。
  • opt_name=value
    这与命令行上的 --opt_name=value 等效。在选项文件中,您可以在 = 字符周围留有空格,这在命令行上是不正确的。该值可以选择用单引号或双引号引起来,如果该值包含注释字符 #,则使用引号很有用。

    前导和尾随空格会自动从选项名称和值中删除。
    如果选项组名称与程序名称相同,则该组中的选项专门适用于该程序。例如,[mysqld]和[mysql] 组分别应用于mysqld服务器和 mysql客户端程序。
    MySQL发行版中提供的所有客户端程序都会读取[client]选项组(但mysqld不会读取)。
    [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=8M

[mysqldump]
quick

    这是一个典型的用户选项文件:

[client]
# The following password will be sent to all standard MySQL clients
password="my password"

[mysql]
no-auto-rehash
connect_timeout=2

    要从特定的MySQL发行版系列创建供mysqld服务器只读的选项组,请使用名称为[mysqld-5.6]、[mysqld-5.7]等的组。以下组指示该 sql_mode设置仅由具有5.7.x版本号的MySQL服务器使用:

[mysqld-5.7]
sql_mode=TRADITIONAL
2.3 选项文件包含

    可以在选项文件中使用!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指令,则在处理选项文件时,无论这些指令在文件中出现的位置如何,都将处理由这些指令命名的文件。
    为了使包含指令起作用,不应在引号中指定文件路径,并且文件路径不应包含转义序列。
    示例:
    查询原key_buffer_size:

mysql> SHOW VARIABLES LIKE '%key_buffer_size%';
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+

    在/etc/my.cnf添加:

!include /home/mydir/myopt.cnf

    并按照上面内容填写myopt.cnf内容,重启mysqld。

mysql> SHOW VARIABLES LIKE '%key_buffer_size%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| key_buffer_size | 16777216 |
+-----------------+----------+

    值已经变过来了。

3. 使用选项设置程序变量

    许多MySQL程序都有内部变量,可以在运行时使用该 SET 语句设置。
    大多数程序变量也可以在服务器启动时通过使用与指定程序选项相同的语法进行设置。例如,mysql有一个 max_allowed_packet变量来控制其通信缓冲区的最大大小。要将mysql的max_allowed_packet变量 设置 为16MB,请使用以下命令之一:

mysql --max_allowed_packet=16777216
mysql --max_allowed_packet=16M

    第一个命令以字节为单位指定值。第二个以兆字节为单位指定值。数值后缀可以为 K,M或 G(大写或小写)。
    在选项文件中,变量设置没有前导破折号:

[mysql]
max_allowed_packet=16777216

    或者

[mysql]
max_allowed_packet=16M

    如果愿意,可以将变量名中的下划线指定为破折号。以下选项组是等效的。两者都将服务器密钥缓冲区的大小设置为512MB:

[mysqld]
key_buffer_size=512M

[mysqld]
key-buffer-size=512M

    在调用mysql时可以使用后缀设置变量,但不能使用表达式来设置变量 。在mysql命令行,您可以使用SET表达式来分配变量的值,而为变量添加后缀则不正确。例如,以下第一行在程序调用时是合法的,但第二行不是:

shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024

    相反,以下第二行在运行时是合法的,但第一行则不是:

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;

    今天效率很低啊,频繁走神,写了一天,最后删了一半,文章成了现在的亚子。
在这里插入图片描述

参考文档

https://dev.mysql.com/doc/refman/5.7/en/program-options.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值