Spec-Zone .ru
спецификации, руководства, описания, API
|
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 jon
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 3Server version: 5.6.13 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
--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:
shell> 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 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
, 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:
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.err
080111 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> mysql
ERROR 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> 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 equals sign:
[mysql]user=jon
Now the login attempt succeeds:
shell>mysql
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 5Server version: 5.6.13 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 tonfisk
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 6Server version: 5.6.13 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.6, 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.err
090514 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)