调用MySQL程序 (参考MySQL官方文档)
调用MySQL程序 (参考MySQL官方文档)
要从命令行(即从shell或命令提示符)调用MySQL程序,请输入程序名,后跟指示程序要执行的操作所需的任何选项或其他参数。
以下命令显示了一些示例程序调用。shell>表示命令解释程序的提示;这不是你打字的一部分。你看到的特别提示取决于您的命令解释程序。
对于sh、ksh或bash,典型的提示是$,对于csh或tcsh,则是%
C:\>用于Windows command.com或cmd.exe命令解释器。
1 shell> mysql --user=root test 2 shell> mysqladmin extended-status variables 3 shell> mysqlshow --help 4 shell> mysqldump -u root personnel
以单破折号或双破折号(--,-)开头的参数指定程序选项。选项通常指示程序应与服务器建立的连接类型或影响其操作模式。
非选项参数(没有前导破折号的参数)为程序提供附加信息。例如,mysql程序将第一个nonoption参数解释为数据库名,因此命令mysql--user=root test指示您要使用测试数据库。
后面描述单个程序的部分指出程序支持哪些选项,并描述任何附加非选项参数的含义。
一些选项对许多程序都是通用的。其中最常用的是指定连接参数的--host(or-h)、--user(or-u)和--password(or-p)选项。它们指示运行MySQL服务器的主机,以及MySQL的用户名和密码。
所有MySQL客户端程序都理解这些选项;它们使您能够指定要连接到的服务器以及要在该服务器上使用的帐户。
其他连接选项包括--port(或-P)指定TCP/IP端口号和--socket(或-S)指定Unix上的Unix套接字文件。
您可能发现有必要使用安装MySQL程序的bin目录的路径名来调用这些程序。如果你得到一个“找不到程序”,很可能就是这样尝试从bin目录以外的任何目录运行MySQL程序时出错。
为了更方便地使用MySQL,可以将bin目录的路径名添加到path环境变量设置中。这使您可以只键入程序名而不是整个路径名来运行程序。例如,如果mysql安装在/usr/local/mysql/bin中,
则可以通过将其作为mysql调用来运行程序,而不必将其作为/usr/local/mysql/bin/mysql调用。
1> 指定程序选项
有几种方法可以指定MySQL程序的选项:
•在命令行中列出程序名后面的选项。对于应用于程序的特定调用的选项,这是常见的。
•列出程序启动时读取的选项文件中的选项。对于希望程序每次运行时使用的选项,这是常见的。
•列出环境变量中的选项,此方法对于每次程序运行时要应用的选项非常有用。实际上,选项文件更常用于此目的,
选项是按顺序处理的,因此如果多次指定某个选项,则以最后一个选项为准。以下命令使mysql连接到本地主机上运行的服务器:
1 mysql -h example.com -h localhost
有一个例外:对于mysqld,--user选项的第一个实例用作安全预防措施,以防止选项文件中指定的用户在命令行上被重写。
如果给出了冲突或相关的选项,则后面的选项优先于前面的选项。以下命令在“no column names”中运行mysql模式:
1 mysql --column-names --skip-column-names
MySQL程序首先通过检查环境变量,然后通过处理选项文件,然后通过检查命令行来确定给定的选项。
因为后面的选项优先于前面的选项,所以处理顺序意味着环境变量的优先级最低,而命令行选项的优先级最高。
通过在选项文件中指定程序的默认选项值,可以利用MySQL程序处理选项的方式。这使您能够在每次运行程序时避免键入它们,同时允许您在必要时使用命令行选项覆盖默认值。
注意
在旧版本的MySQL中,程序选项可以指定为完整的或任何明确的前缀。例如,--compress选项可以作为--compr而不是--comp提供给mysqldump,因为后者是不明确的。
在MySQL 5.7中,选项前缀不再受支持;只接受完整选项。这是因为当为程序实现新选项时,前缀可能会导致问题,并且当前不明确的前缀可能在将来变得不明确。这一变化的一些影响:
--key buffer选项现在必须指定为--key buffer size。
--skip grant选项现在必须指定为--skip grant tables。
1、
在命令行上使用选项
在命令行上指定的程序选项遵循以下规则:
•选项在命令之后。
•选项参数以一个破折号或两个破折号开头,这取决于它是选项名称的短格式还是长格式。许多选择既有短形式,也有长形式。
例如,-?和--help是一种短格式和长格式的选项,用于指示MySQL程序显示其帮助消息。
•选项名称区分大小写。-v和-v都是合法的,有不同的含义。(它们是对应的--verbose和--version选项的缩写形式。)
•有些选项在选项名称后面有一个值。例如,-h localhost或--host=localhost向客户端程序指示MySQL服务器主机。选项值告诉程序运行MySQL服务器的主机的名称。
•对于接受值的长选项,请使用=号分隔选项名称和值。对于接受值的短选项,选项值可以紧跟在选项字母后面,或者在-h localhost和-h localhost之间可以有一个空格。
此规则的一个例外是指定MySQL密码的选项。此选项可以长格式指定为--password=pass_val或--password。在后一种情况下(没有给出密码值),
则程序以交互方式提示您输入密码。密码选项也可以缩写为-ppass-val或-p。
但是,对于缩写形式,如果给定密码值,则必须遵循选项字母,且不能有空格:如果选项字母后面有空格,程序就无法判断后面的参数应该是密码值还是其他类型的参数。
因此,以下两个命令有两个完全不同的含义:
1 mysql -ptest 2 mysql -p test
第一个命令指示mysql使用test的密码值,但没有指定默认数据库。第二个命令mysql提示输入密码值并使用test作为默认数据库。
•在选项名称中,短划线(-)和下划线(u)可以互换使用。例如,-skip-grant表和--skip_grant_表是等价的。(但是,前导虚线不能作为下划线。)
•MySQL服务器有一些命令选项,这些选项只能在启动时指定,还有一组系统变量,其中一些可以在启动时、运行时或两者同时设置。
系统变量名称使用下划线而不是破折号,并且在运行时引用时(例如,使用SET或SELECT语句),必须使用下划线编写:
1 SET GLOBAL general_log = ON; 2 SELECT @@GLOBAL.general_log;
在服务器启动时,系统变量的语法与命令选项的语法相同,因此在变量名中,破折号和下划线可以互换使用。例如,--general_log=ON和--general log=ON是等价的。
在命令行上给定时,必须引用包含空格的选项值。例如
--execute(或-e)选项可与mysql一起用于向服务器传递一个或多个分号分隔的SQL语句。当使用此选项时,MySQL执行选项值中的语句并退出。报表必须用引号括起来。例如:
1 shell> mysql -u root -p -e "SELECT VERSION();SELECT NOW()" 2 Enter password: ****** 3 +------------+ 4 | VERSION() | 5 +------------+ 6 | 5.7.29 | 7 +------------+ 8 +---------------------+ 9 | NOW() | 10 +---------------------+ 11 | 2019-09-03 10:36:28 | 12 +---------------------+ 13 shell> 14 15 Note
长形式(--execute)后跟等号(=)。
若要在语句中使用带引号的值,必须转义内部引号,或者在语句中使用与用于引用语句本身的引号不同的引号类型。
命令处理器的功能决定了您是否可以使用单引号或双引号以及转义引号字符的语法。
例如,如果命令处理器支持使用单引号或双引号进行引号引用,则可以在语句周围使用双引号,并对语句中的任何引号值使用单引号。
2> 使用选项文件
大多数MySQL程序可以从选项文件(有时称为配置文件)中读取启动选项。选项文件提供了一种方便的方法来指定常用的选项,以便在每次运行程序时不必在命令行中输入这些选项。
要确定程序是否读取选项文件,请使用--help选项调用它。(对于mysqld,请使用--verbose和--help。)如果程序读取选项文件,则帮助消息指示它查找哪些文件以及识别哪些选项组。
注意
以--no defaults选项启动的MySQL程序不会读取除.mylogin.cnf之外的任何选项文件。
许多选项文件是纯文本文件,使用任何文本编辑器创建。异常是包含登录路径选项的.mylogin.cnf文件。这是由mysql配置编辑器实用程序创建的加密文件。
“登录路径”是只允许某些选项的选项组:主机、用户、密码、端口和套接字。客户端程序使用--login path选项指定要从.mylogin.cnf读取的登录路径。
要指定备用登录路径文件名,请设置MYSQL_TEST_login_file环境变量。此变量由mysql-test-run.pl测试实用程序使用,但mysql配置编辑器和mysql、mysqladmin等mysql客户端也可以识别此变量。
MySQL按照以下讨论中所描述的顺序查找选项文件,并读取存在的任何文件。如果您想使用的选项文件不存在,则使用适当的方法创建它,如刚才所讨论的。
注意
在Unix和类Unix系统上,MySQL程序按照指定的顺序从下表所示的文件中读取启动选项(首先列出的文件先读取,以后读取的文件优先)。
1 File Name Purpose 2 /etc/my.cnf Global options 3 /etc/mysql/my.cnf Global options 4 SYSCONFDIR/my.cnf Global options 5 $MYSQL_HOME/my.cnf Server-specific options (server only) 6 defaults-extra-file The file specified with --defaults-extra-file, if any 7 ~/.my.cnf User-specific options 8 ~/.mylogin.cnf User-specific login path options (clients only)
2、选项文件语法
以下对选项文件语法的描述适用于手动编辑的文件。这不包括.mylogin.cnf,使用mysql配置编辑器创建并加密。
运行MySQL程序时,命令行上可能给出的任何长选项也可以在选项文件中给出。要获取程序的可用选项列表,请使用--help选项运行它。(对于mysqld,使用--verbose和--help。)
在选项文件中指定选项的语法与命令行语法类似,但是,在选项文件中,可以省略选项名称的前两个短划线,并且每行只指定一个选项。
例如,在命令行上,--quick和--host=localhost应指定为quick和host=localhost选项文件中的单独行。要在选项文件中指定表单的选项loose-opt_name,请将其写为loose-opt_name。
3、影响选项文件处理的命令行选项
大多数支持选项文件的MySQL程序处理以下选项。因为这些选项会影响选项文件的处理,所以必须在命令行上而不是在选项文件中提供它们。
要正常工作,这些选项必须在其他选项之前给出,但以下情况除外:
•--打印默认值可在--defaults file、--defaults extra file或--login path之后立即使用。
•在Windows上,如果服务器是用--defaults文件和--install选项启动的,-install一定是第一个。
•--defaults-extra-file=file_name
在全局选项文件之后,但在用户选项文件之前(在Unix上)和登录路径文件之前(在所有平台上)读取此选项文件。如果文件不存在或无法访问,则会发生错误。
如果将文件名指定为相对路径名而不是完整路径名,则将其解释为相对于当前目录。
•--defaults-file=file_name
只读给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果将文件名指定为相对路径名而不是完整路径名,则将其解释为相对于当前目录。
•--defaults-group-suffix=str
不仅要读取常用选项组,还要读取具有常用名称和str后缀的组。例如,mysql客户端通常读取[client]和[mysql]组。
如果给定了--defaults group suffix=\u other选项,mysql还会读取[client\u other]和[mysql\u other]组。
•--login-path=name
从.mylogin.cnf登录路径文件中的命名登录路径读取选项。“登录路径”是一个选项组,包含指定要连接到哪个MySQL服务器以及要作为哪个帐户进行身份验证的选项。
要创建或修改登录路径文件,请使用mysql配置编辑器实用程序。
除了程序默认读取的选项组外,客户端程序还会读取与命名登录路径对应的选项组。考虑这个命令:
mysql --login-path=mypath
默认情况下,mysql客户端读取[client]和[mysql]选项组。所以对于显示的命令,mysql从其他选项文件读取[client]和[mysql],从登录路径文件读取[client]、[mysql]和[mypath]。
即使使用--no defaults选项,客户端程序也会读取登录路径文件。
要指定备用登录路径文件名,请设置MYSQL_TEST_login_file环境变量。
See the introduction to this section regarding constraints on the position in which this option may be specified.
请参阅本节的简介,了解指定此选项的位置限制。
•--no-defaults
不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,
-不能使用默认值来防止读取它们。
T唯一的例外是客户端程序读取.MyLogin .CNF登录路径文件,如果存在的话,即使在没有使用默认值的情况下。这允许以比命令行更安全的方式指定密码
•--print-defaults
打印程序名及其从选项文件中获得的所有选项。密码值被屏蔽。
4、程序选项修饰符
有些选项是“布尔型”以及可以打开或关闭的控制行为。例如,mysql客户机支持--column names选项,该选项确定是否在查询结果的开头显示一行列名。
默认情况下,此选项处于启用状态。但是,在某些情况下可能需要禁用它,例如将mysql的输出发送到另一个只希望看到数据而不希望看到初始标题行的程序时。
要禁用列名,可以使用以下任何形式指定选项:
1 --disable-column-names 2 --skip-column-names 3 --column-names=0
当您在同一台计算机上运行来自多个MySQL安装的程序并在选项文件中列出选项时,-loose前缀可能非常有用。
程序的所有版本可能无法识别的选项可以使用--loose前缀(或选项文件中的loose)给出。识别选项的程序版本会正常处理它,而不识别选项的程序版本会发出警告并忽略它。
5、使用选项设置程序变量
这些程序变量中的大多数也可以在服务器启动时使用与指定程序选项相同的语法进行设置。
例如,MySQL有一个控制通信缓冲区最大大小的Max允许数据包变量。要将mysql的max_allowed_packet变量的值设置为16MB,请使用以下命令之一:
1 mysql --max_allowed_packet=16777216 2 mysql --max_allowed_packet=16M
第一个命令以字节为单位指定值。第二个以兆字节为单位指定值。对于接受数值的变量,可以给该值加上后缀K、M或G(大写或小写)来表示1024、10242或10243的乘数。
(例如,当用于设置允许的最大数据包时,后缀表示千字节、兆字节或千兆字节的单位。)
在选项文件中,变量设置不带前导破折号:
1 [mysql] 2 max_allowed_packet=16777216 3 或: 4 [mysql] 5 max_allowed_packet=16M
如果愿意,可以将变量名中的下划线指定为破折号。以下选项组是等效的。两者都将服务器的密钥缓冲区大小设置为512MB:
1 [mysqld] 2 key_buffer_size=512M 3 [mysqld] 4 key-buffer-size=512M
变量可以通过完全写入或作为任何不含糊的前缀来指定。例如,可以将mysql的max_allowed_packet变量设置为--max_a,但不能设置为--max,因为后者不明确:
1 shell> mysql --max=1000000 2 mysql: ambiguous option '--max=1000000' (max_allowed_packet, max_join_size)
请注意,在为程序实现新变量时,使用变量前缀可能会导致问题。现在不含糊的前缀将来可能会变得含糊不清。
在程序调用时设置变量时,可以使用用于指定值乘数的后缀,但不能在运行时使用set设置值。另一方面,使用SET,可以使用表达式分配变量的值,这在服务器启动时设置变量时是不正确的。
例如,以下第一行在程序调用时是合法的,但第二行不合法:
1 shell> mysql --max_allowed_packet=16M 2 shell> mysql --max_allowed_packet=16*1024*1024
相反,以下第二行在运行时是合法的,但第一行不合法:
1 mysql> SET GLOBAL max_allowed_packet=16M; 2 mysql> SET GLOBAL max_allowed_packet=16*1024*1024;
6、选项默认值、需要值的选项和=符号
按照惯例,赋值的选项的长格式是用等号(=)写的,如下所示:
1 mysql --host=tonfisk --user=jon
对于需要值(即没有默认值)的选项,不需要等号,因此以下内容也有效:
1 mysql --host tonfisk --user jon
在这两种情况下,mysql客户机都会尝试连接到在名为“tonfisk”的主机上运行的mysql服务器使用用户名为“jon”的帐户。
由于这种行为,当没有为期望值的选项提供值时,偶尔会出现问题。考虑以下示例,其中用户以用户jon的身份连接到主机tonfisk上运行的MySQL服务器:
1 shell> mysql --host 85.224.35.45 --user jon 2 Welcome to the MySQL monitor. Commands end with ; or \g. 3 Your MySQL connection id is 3 4 Server version: 5.7.30 Source distribution 5 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 6 mysql> SELECT CURRENT_USER(); 7 +----------------+ 8 | CURRENT_USER() | 9 +----------------+ 10 | jon@% | 11 +----------------+ 12 1 row in set (0.00 sec)
忽略其中一个选项所需的值会产生错误,如下面所示:
1 shell> mysql --host 85.224.35.45 --user 2 mysql: option '--user' requires an argument
在本例中,mysql无法在--user选项后面找到值,因为在命令行中没有后面的内容。但是,如果省略了不是最后一个要使用的选项的值,则会得到一个可能不需要的不同错误:
1 shell> mysql --host --user jon 2 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的:
1 shell> mysqld_safe & 2 [1] 11699 3 shell> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 4 080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 5 shell>
关闭服务器后,按如下方式重新启动:
1 shell> mysqld_safe --log-error & 2 [1] 11699 3 shell> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 4 080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 5 shell>
结果是相同的,因为--log error后面没有命令行中的任何内容,它提供了自己的默认值。现在假设您希望将错误记录到一个名为my-errors.err的文件中。
您可以尝试使用--log error my errors启动服务器,但这并没有达到预期的效果,如下所示:
1 shell> mysqld_safe --log-error my-errors & 2 [1] 31357 3 shell> 080111 22:53:31 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'. 4 080111 22:53:32 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 5 080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended 6 [1]+ Done ./mysqld_safe --log-error my-errors
服务器试图开始使用/usr/local/mysql/var/tonfisk.err作为错误日志,但随后关闭。检查此文件的最后几行显示了原因:
1 shell> tail /usr/local/mysql/var/tonfisk.err 2 2013-09-24T15:36:22.278034Z 0 [ERROR] Too many arguments (first extra is 'my-errors'). 3 2013-09-24T15:36:22.278059Z 0 [Note] Use --verbose --help to get a list of available options! 4 2013-09-24T15:36:22.278076Z 0 [ERROR] Aborting 5 2013-09-24T15:36:22.279704Z 0 [Note] InnoDB: Starting shutdown... 6 2013-09-24T15:36:23.777471Z 0 [Note] InnoDB: Shutdown completed; log sequence number 2319086 7 2013-09-24T15:36:23.780134Z 0 [Note] mysqld: Shutdown complete
由于--log error选项提供默认值,因此必须使用等号为其分配不同的值,如下所示:
1 shell> mysqld_safe --log-error=my-errors & 2 [1] 31437 3 shell> 080111 22:54:15 mysqld_safe Logging to '/usr/local/mysql/var/my-errors.err'. 4 080111 22:54:15 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var 5 shell>
现在服务器已经成功启动,并将错误记录到文件/usr/local/mysql/var/my-errors.err中。
在选项文件中指定选项值时可能会出现类似的问题。例如,考虑包含以下内容的my.cnf文件:
1 [mysql] 2 host 3 user
当mysql客户端读取此文件时,这些条目被解析为--host--user或--host=--user,结果如下所示:
1 shell> mysql 2 ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)
但是,在选项文件中,不假定等号。假设my.cnf文件如下所示:
[mysql]
user jon
在这种情况下,尝试启动mysql会导致另一个错误:
1 shell> mysql 2 mysql: unknown option '--user jon'
如果在选项文件中写入主机tonfisk而不是主机=tonfisk。相反,必须使用等号:
[mysql]
user=jon
现在登录尝试成功:
1 shell> mysql 2 Welcome to the MySQL monitor. Commands end with ; or \g. 3 Your MySQL connection id is 5 4 Server version: 5.7.30 Source distribution 5 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 6 mysql> SELECT USER(); 7 +---------------+ 8 | USER() | 9 +---------------+ 10 | jon@localhost | 11 +---------------+ 12 1 row in set (0.00 sec)
这与命令行的行为不同,命令行不需要等号:
1 shell> mysql --user jon --host tonfisk 2 Welcome to the MySQL monitor. Commands end with ; or \g. 3 Your MySQL connection id is 6 4 Server version: 5.7.30 Source distribution 5 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 6 mysql> SELECT USER(); 7 +---------------+ 8 | USER() | 9 +---------------+ 10 | jon@tonfisk | 11 +---------------+ 12 1 row in set (0.00 sec)
指定需要选项文件中没有值的值的选项会导致服务器因错误而中止。