By convention, long forms of options that assign a value are
written with an equals (=
) sign, like this:
Press CTRL+C to copymysql --host=tonfisk --user=jon
For options that require a value (that is, not having a default value), the equal sign is not required, and so the following is also valid:
Press CTRL+C to copymysql --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
:
Press CTRL+C to copy$> 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: 9.2.0 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)
Omitting the required value for one of these option yields an error, such as the one shown here:
Press CTRL+C to copy$> mysql --host 85.224.35.45 --user mysql: 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:
Press CTRL+C to copy$> mysql --host --user jon ERROR 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 equal sign when
assigning a value; failing to do so causes an error. For
example, the MySQL server
--log-error
option has the
default value
,
where host_name
.errhost_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:
Press CTRL+C to copy$> 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 $>
After shutting down the server, restart it as follows:
Press CTRL+C to copy$> 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 $>
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:
Press CTRL+C to copy$> 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
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:
Press CTRL+C to copy$> 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
Because the --log-error
option supplies a default value, you must use an equal sign to
assign a different value to it, as shown here:
Press CTRL+C to copy$> 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 $>
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:
Press CTRL+C to copy[mysql] host user
When the mysql client reads this file, these
entries are parsed as --host
--user
or
--host=--user
, with the result
shown here:
Press CTRL+C to copy$> mysql ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)
However, in option files, an equal sign is not assumed. Suppose
the my.cnf
file is as shown here:
Press CTRL+C to copy[mysql] user jon
Trying to start mysql in this case causes a different error:
Press CTRL+C to copy$> mysql mysql: 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 equal
sign:
Press CTRL+C to copy[mysql] user=jon
Now the login attempt succeeds:
Press CTRL+C to copy$> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 9.2.0 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)
This is not the same behavior as with the command line, where the equal sign is not required:
Press CTRL+C to copy$> mysql --user jon --host tonfisk Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 Server version: 9.2.0 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)
Specifying an option requiring a value without a value in an option file causes the server to abort with an error.