Bootstrap

MySQL程序之:选项默认值、选项期望值和=符号

按照惯例,赋值的长形式选项是用等号(=)编写的,如下所示:

mysql --host=tonfisk --user=jon

对于需要值(即没有默认值)的选项,不需要等号,因此以下内容也有效:

mysql --host tonfisk --user jon

在这两种情况下,mysql客户端都会尝试使用用户名为“jon”的帐户连接到主机上运行的名为“tonfisk”的MySQL服务器。

由于这种行为,当没有为需要值的选项提供值时,有时会出现问题。考虑以下示例,其中用户以用户jon连接到主机tonfisk上运行的MySQL服务器:

$> 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.4.3 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-error. err的文件中。您可以尝试使用--log-error my-error启动服务器,但这并没有达到预期的效果,如下所示:

$> 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): Unknown MySQL server host '--user' (1)

但是,在选项文件中,不假定等号。假设my.cnf文件如下所示:

[mysql]

user jon

在这种情况下尝试启动mysql会导致不同的错误:

$> mysql
mysql: unknown option '--user jon'

现在登录尝试成功:

$> mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.4.3 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)

这与不需要等号的命令行的行为不同:

$> mysql --user jon --host tonfisk
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 8.4.3 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)

在选项文件中指定需要值而没有值的选项会导致服务器中止并出现错误。

;