Spec-Zone .ru
спецификации, руководства, описания, API

4.2.3.6. Option Defaults, Options Expecting Values, and the =Sign

By convention, long forms of options that assign a value are written with an equals (=) sign, like this:

shell> mysql --host=tonfisk
        --user=jon

For options that require a value (that is, not having a default value), the equals sign is not required, and so the following is also valid:

shell> mysql --host tonfisk --user
        jon

In both cases, the mysql client attempts to connect to a MySQL server running on the host named "tonfisk" using an account with the user name "jon".

Due to this behavior, problems can occasionally arise when no value is provided for an option that expects one. Consider the following example, where a user connects to a MySQL server running on host tonfisk as user jon:

shell> mysql --host 85.224.35.45 --user
        jonWelcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 3Server version: 5.7.2 Source distributionType '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)

Omitting the required value for one of these option yields an error, such as the one shown here:

shell> mysql --host 85.224.35.45
        --usermysql: option '--user' requires an argument

In this case, mysql was unable to find a value following the --user option because nothing came after it on the command line. However, if you omit the value for an option that is not the last option to be used, you obtain a different error that you may not be expecting:

shell> mysql --host --user jonERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

Because mysql assumes that any string following --host on the command line is a host name, --host --user is interpreted as --host=--user, and the client attempts to connect to a MySQL server running on a host named "--user".

Options having default values always require an equals sign when assigning a value; failing to do so causes an error. For example, the MySQL server --log-error option has the default value host_name.err, where host_name is the name of the host on which MySQL is running. Assume that you are running MySQL on a computer whose host name is "tonfisk", and consider the following invocation of mysqld_safe:

shell> mysqld_safe &[1] 11699shell> 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/varshell>

After shutting down the server, restart it as follows:

shell> mysqld_safe --log-error &[1] 11699shell> 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/varshell>

The result is the same, since --log-error is not followed by anything else on the command line, and it supplies its own default value. (The & character tells the operating system to run MySQL in the background; it is ignored by MySQL itself.) Now suppose that you wish to log errors to a file named my-errors.err. You might try starting the server with --log-error my-errors, but this does not have the intended effect, as shown here:

shell> mysqld_safe --log-error my-errors &[1] 31357shell> 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/var080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended[1]+  Done                    ./mysqld_safe --log-error my-errors

The server attempted to start using /usr/local/mysql/var/tonfisk.err as the error log, but then shut down. Examining the last few lines of this file shows the reason:

shell> tail
        /usr/local/mysql/var/tonfisk.err080111 22:53:32  InnoDB: Started; log sequence number 0 46409/usr/local/mysql/libexec/mysqld: Too many arguments (first extra is 'my-errors').Use --verbose --help to get a list of available options080111 22:53:32 [ERROR] Aborting080111 22:53:32  InnoDB: Starting shutdown...080111 22:53:34  InnoDB: Shutdown completed; log sequence number 0 46409080111 22:53:34 [Note] /usr/local/mysql/libexec/mysqld: Shutdown complete080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended

Because the --log-error option supplies a default value, you must use an equals sign to assign a different value to it, as shown here:

shell> mysqld_safe --log-error=my-errors &[1] 31437shell> 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/varshell>

Now the server has been started successfully, and is logging errors to the file /usr/local/mysql/var/my-errors.err.

Similar issues can arise when specifying option values in option files. For example, consider a my.cnf file that contains the following:

[mysql]hostuser

When the mysql client reads this file, these entries are parsed as --host --user or --host=--user, with the result shown here:

shell> mysqlERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

However, in option files, an equals sign is not assumed. Suppose the my.cnf file is as shown here:

[mysql]user jon

Trying to start mysql in this case causes a different error:

shell> mysqlmysql: unknown option '--user jon'

A similar error would occur if you were to write host tonfisk in the option file rather than host=tonfisk. Instead, you must use the equals sign:

[mysql]user=jon

Now the login attempt succeeds:

shell> mysqlWelcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 5Server version: 5.7.2 Source distributionType 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> SELECT USER();+---------------+| USER()        |+---------------+| jon@localhost |+---------------+1 row in set (0.00 sec)

This is not the same behavior as with the command line, where the equals sign is not required:

shell> mysql --user jon --host
        tonfiskWelcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 6Server version: 5.7.2 Source distributionType 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> SELECT USER();+---------------+| USER()        |+---------------+| jon@tonfisk   |+---------------+1 row in set (0.00 sec)

In MySQL 5.7, specifying an option requiring a value without a value in an option file causes the server to abort with an error. Suppose that my.cnf contains the following:

[mysqld]log_errorrelay_logrelay_log_index

This causes the server to fail on startup, as shown here:

shell> mysqld_safe &090514 09:48:39 mysqld_safe Logging to '/home/jon/bin/mysql-5.5/var/tonfisk.err'.090514 09:48:39 mysqld_safe Starting mysqld daemon with databases from /home/jon/bin/mysql-5.5/var090514 09:48:39 mysqld_safe mysqld from pid file /home/jon/bin/mysql-5.5/var/tonfisk.pid ended

The --log-error option does not require an argument; however, the --relay-log option requires one, as shown in the error log (which in the absence of a specified value, defaults to datadir/hostname.err):

shell> tail -n 3 ../var/tonfisk.err090514 09:48:39 mysqld_safe Starting mysqld daemon with databases from /home/jon/bin/mysql-5.5/var090514  9:48:39 [ERROR] /home/jon/bin/mysql-5.5/libexec/mysqld: option '--relay-log' requires an argument090514  9:48:39 [ERROR] Aborting

This is a change from previous behavior, where the server would have interpreted the last two lines in the example my.cnf file as --relay-log=relay_log_index and created a relay log file using "relay_log_index" as the basename. (Bug #25192)