MySQL distributions on Unix include a script named mysql.server. It can be used on systems such as Linux and Solaris that use System V-style run directories to start and stop system services. It is also used by the Mac OS X Startup Item for MySQL.
mysql.server can be found in the
support-files
directory under your MySQL
installation directory or in a MySQL source distribution.
If you use the Linux server RPM package
(MySQL-server-
),
the mysql.server script will be installed in
the VERSION
.rpm/etc/init.d
directory with the name
mysql
. You need not install it manually.
See Section 2.6.1, “Installing MySQL from RPM Packages on Linux”, for more information on the
Linux RPM packages.
Some vendors provide RPM packages that install a startup script under a different name such as mysqld.
If you install MySQL from a source distribution or using a binary distribution format that does not install mysql.server automatically, you can install it manually. Instructions are provided in Section 2.13.1.2, “Starting and Stopping MySQL Automatically”.
mysql.server reads options from the
[mysql.server]
and
[mysqld]
sections of option files. For
backward compatibility, it also reads
[mysql_server]
sections, although you should
rename such sections to [mysql.server]
when
using MySQL 5.1.
mysql.server supports the following options.
The path to the MySQL installation directory.
The path to the MySQL data directory.
The path name of the file in which the server should write its process ID.
--service-startup-timeout=
file_name
How long in seconds to wait for confirmation of server startup. If the server does not start within this time, mysql.server exits with an error. The default value is 900. A value of 0 means not to wait at all for startup. Negative values mean to wait forever (no timeout). This option was added in MySQL 5.1.17. Before that, a value of 900 is always used.
Use mysqld_safe to start the server. This is the default.
Use Instance Manager to start the server.
The login user name to use for running mysqld.
User Comments
I recommend everybody to change the section that reads
# Set some defaults
datadir=/usr/local/mysql/data
pid_file=
if test -z "$basedir"
then
basedir=/usr/local/mysql
bindir=./bin
else
bindir="$basedir/bin"
fi
in mysql.server to
# Set some defaults
pid_file=
if test -z "$basedir"
then
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
bindir=./bin
else
bindir="$basedir/bin"
datadir="$basedir/data"
fi
in order to have the script look for the data directory under the $basedir, not hard-coded as /usr/local/mysql.
This is particularly important if you are running multiple instances of MySQL on the same server as the datadir is where the script looks for the pid file. Getting this wrong will easily lead to different instances of MySQL sharing the same pid file. The result will be that any mysql stop will stop the last instance startet, not the one intended!
As the main goal of mysql.server is to:
1) Find a program that can read MySQL "my.cnf" argument files (preferably "./bin/my_print_defaults"),
2) Find an applicable "my.cnf" argument file (preferably "$datadir/my.cnf"),
3) Extract attribute-value pairs from sections "[mysqld]", "[server]", "[mysql_server]", "[mysql.server]" from the found "my.cnf" and several default "my.cnf" files,
4) Transform the resulting bunch of pairs into command line arguments to be passed to MySQL server,
...you are probably interested in the resulting command line and the command that generated it.
Replace:
----
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
# Look for the pidfile
parse_manager_arguments `$print_defaults $extra_args manager`
----
by:
----
# Get arguments for server, which may cause reshuffle
COLLECT_COMMAND="$print_defaults $extra_args mysqld server mysql_server mysql.server"
echo "Now running for server: $COLLECT_COMMAND"
COLLECT_RESULT=`$COLLECT_COMMAND`
echo "Collected for server: $COLLECT_RESULT"
parse_server_arguments $COLLECT_RESULT
# Look for the (manager) pidfile
COLLECT_COMMAND="$print_defaults $extra_args manager"
echo "Now running for manager: $COLLECT_COMMAND"
COLLECT_RESULT=`$COLLECT_COMMAND`
echo "Collected for manager: $COLLECT_RESULT"
parse_manager_arguments $COLLECT_RESULT
----
And also add
-----------
echo "Manager PID file is $pid_file, Server PID file is $server_pid_file"
-----------
directly before the line 'case "$mode" in'
for some great debugging justice.
Add your own comment.