选项默认值、期望值的选项和等号
按照惯例,赋值的长格式选项使用等号(=)符号,如下所示:
mysql --host=tonfisk --user=jon
对于需要值的选项(即没有默认值的选项),等号是可选的,因此以下写法也是有效的:
mysql --host tonfisk --user jon
在这两种情况下,mysql客户端尝试连接到名为“tonfisk”的主机上运行的MySQL服务器,并使用用户名“jon”的账户。
由于这种行为,有时在期望有值的选项中没有提供值可能会导致问题。考虑以下示例,其中用户作为用户jon连接到在主机tonfisk上运行的MySQL服务器:
$> mysql --host 85.224.35.45 --user jon 欢迎使用MySQL监视器。命令以;或\g结尾。 您的MySQL连接ID为3 服务器版本:8.0.33 源码发行版 键入'help;'或'\h'获取帮助。键入'\c'清除缓冲区。 mysql> SELECT CURRENT_USER(); +----------------+ | CURRENT_USER() | +----------------+ | jon@% | +----------------+ 1行记录(0.00秒)
省略这些选项所需的值将导致错误,如下所示:
$> mysql --host 85.224.35.45 --user mysql: 选项'--user'需要一个参数
在这种情况下,mysql无法找到--user选项后面的值,因为命令行上没有跟随它。然而,如果您省略不是最后一个要使用的选项的值,您将获得一个不同的错误,这可能不是您所期望的:
$> mysql --host --user jon ERROR 2005 (HY000): 未知的MySQL服务器主机'--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
由于--log-error选项提供了默认值,您必须使用等号来为其分配不同的值,如下所示:
> 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文件:
[mysql] host user
当mysql客户端读取此文件时,这些条目被解析为--host --user或--host=--user,结果如下所示:
$> mysql ERROR 2005 (HY000): 未知的MySQL服务器主机'--user'(1)
然而,在选项文件中,不假设等号。假设my.cnf文件如下所示:
[mysql] user jon
在这种情况下,尝试启动mysql会导致不同的错误:
$> mysql mysql: 未知的选项'--user jon'
如果在选项文件中写入host tonfisk而不是host=tonfisk,将出现类似的错误。而是,您必须使用等号:
[mysql] user=jon
现在登录尝试成功:
$> mysql 欢迎使用MySQL监视器。命令以;或\g结尾。 您的MySQL连接ID为5 服务器版本:8.0.33 源码发行版 键入'help;'或'\h'获取帮助。键入'\c'清除缓冲区。 mysql> SELECT USER(); +---------------+ | USER() | +---------------+ | jon@localhost | +---------------+ 1行记录(0.00秒)
这与命令行的行为不同,在命令行中,等号是可选的:
$> mysql --user jon --host tonfisk 欢迎使用MySQL监视器。命令以;或\g结尾。 您的MySQL连接ID为6 服务器版本:8.0.33 源码发行版 键入'help;'或'\h'获取帮助。键入'\c'清除缓冲区。 mysql> SELECT USER(); +---------------+ | USER() | +---------------+ | jon@tonfisk | +---------------+ 1行记录(0.00秒)
在选项文件中指定需要值的选项而没有值会导致服务器中止并显示错误。