Table of Contents
After installing MySQL, you must initialize the data directory,
including the tables in the mysql system
database. For some MySQL installation methods, data directory
initialization may be done automatically, as described in
Postinstallation Setup and Testing. For other installation
methods, including installation from generic binary and source
distributions, you must initialize the data directory yourself.
This section describes how to initialize the data directory on Unix and Unix-like systems. (For Windows, see Windows Postinstallation Procedures.) For some suggested commands that you can use to test whether the server is accessible and working properly, see Testing the Server.
In the examples shown here, the server runs under the user ID of
the mysql login account. This assumes that such
an account exists. Either create the account if it does not exist,
or substitute the name of a different existing login account that
you plan to use for running the server. For information about
creating the account, see
Creating a
mysql System User and Group, in
Chapter 1, Installing MySQL on Unix/Linux Using Generic Binaries.
Change location into the top-level directory of your MySQL
installation, represented here by
BASEDIR:
shell> cd BASEDIR
BASEDIR is likely to be something
like /usr/local/mysql or
/usr/local. The following steps assume
that you have changed location to this directory.
You will find several files and subdirectories in the
BASEDIR directory. The most
important for installation purposes are the
bin and scripts
subdirectories, which contain the server as well as client and
utility programs.
If necessary, ensure that the distribution contents are
accessible to mysql. If you installed the
distribution as mysql, no further action is
required. If you installed the distribution as
root, its contents will be owned by
root. Change its ownership to
mysql by executing the following commands
as root in the installation directory. The
first command changes the owner attribute of the files to the
mysql user. The second changes the group
attribute to the mysql group.
shell>chown -R mysql .shell>chgrp -R mysql .
If necessary, initialize the data directory, including the
mysql database containing the initial MySQL
grant tables that determine how users are permitted to connect
to the server.
Typically, data directory initialization need be done only the first time you install MySQL. If you are upgrading an existing installation, you should run mysql_upgrade instead (see mysql_upgrade — Check and Upgrade MySQL Tables). However, the command that initializes the data directory does not overwrite any existing privilege tables, so it should be safe to run in any circumstances.
shell> scripts/mysql_install_db --user=mysql
It is important to make sure that the database directories and
files are owned by the mysql login account
so that the server has read and write access to them when you
run it later. To ensure this if you run
mysql_install_db as
root, include the
--user option as
shown. Otherwise, you should execute the program while logged
in as mysql, in which case you can omit the
--user option from
the command.
The mysql_install_db command creates the
server's data directory. Under the data directory, it creates
directories for the mysql database that
holds the grant tables and the test
database that you can use to test MySQL. The program also
creates privilege table entries for the initial account or
accounts. test_. For a complete listing and
description of the grant tables, see
The MySQL Access Privilege System.
It might be necessary to specify other options such as
--basedir or
--datadir if
mysql_install_db does not identify the
correct locations for the installation directory or data
directory. For example:
shell>scripts/mysql_install_db --user=mysql \--basedir=/opt/mysql/mysql \--datadir=/opt/mysql/mysql/data
If you do not want to have the test
database, you can remove it after starting the server, using
the instructions in Securing the Initial MySQL Accounts.
If you have trouble with mysql_install_db at this point, see Section 5.1, “Problems Running mysql_install_db”.
After initializing the data directory, you can establish the
final installation ownership settings. To leave the
installation owned by mysql, no action is
required here. Otherwise, most of the MySQL installation can
be owned by root if you like. The exception
is that the data directory must be owned by
mysql. To accomplish this, run the
following commands as root in the
installation directory. For some distribution types, the data
directory might be named var rather than
data; adjust the second command
accordingly.
shell>chown -R root .shell>chown -R mysql data
If the plugin directory (the directory named by the
plugin_dir system variable)
is writable by the server, it may be possible for a user to
write executable code to a file in the directory using
SELECT ... INTO
DUMPFILE. This can be prevented by making the plugin
directory read only to the server or by setting the
secure_file_priv system variable at server
startup to a directory where
SELECT writes can be performed
safely.
If you installed MySQL using a source distribution, you may
want to optionally copy one of the provided configuration
files from the support-files directory
into your /etc directory. There are
different sample configuration files for different use cases,
server types, and CPU and RAM configurations. To use one of
these standard files, copy it to
/etc/my.cnf, or
/etc/mysql/my.cnf and edit and check the
configuration before starting your MySQL server for the first
time.
You can also create my.cnf yourself and
place into it the options the server should use at startup.
See Server Configuration Defaults.
If you do not copy one of the standard configuration files or create your own, the MySQL server starts with its default settings.
If you want MySQL to start automatically when you boot your machine, see Starting and Stopping MySQL Automatically.
Data directory initialization creates time zone tables in the
mysql database but does not populate them. To
do so, use the instructions in
MySQL Server Time Zone Support.
The purpose of the mysql_install_db program
is to initialize the data directory, including the tables in the
mysql system database. It does not overwrite
existing MySQL privilege tables, and it does not affect any
other data.
To re-create your privilege tables, first stop the
mysqld server if it is running. Then rename
the mysql directory under the data
directory to save it, and run
mysql_install_db. Suppose that your current
directory is the MySQL installation directory and that
mysql_install_db is located in the
bin directory and the data directory is
named data. To rename the
mysql database and re-run
mysql_install_db, use these commands.
shell>mv data/mysql data/mysql.oldshell>scripts/mysql_install_db --user=mysql
When you run mysql_install_db, you might encounter the following problems:
mysql_install_db fails to install the grant tables
You may find that mysql_install_db fails to install the grant tables and terminates after displaying the following messages:
Starting mysqld daemon with databases from XXXXXX mysqld ended
In this case, you should examine the error log file very
carefully. The log should be located in the directory
XXXXXX named by the error message and
should indicate why mysqld did not start.
If you do not understand what happened, include the log when
you post a bug report. See How to Report Bugs or Problems.
There is a mysqld process running
This indicates that the server is running, in which case the grant tables have probably been created already. If so, there is no need to run mysql_install_db at all because it needs to be run only once, when you first install MySQL.
Installing a second mysqld server does not work when one server is running
This can happen when you have an existing MySQL installation, but want to put a new installation in a different location. For example, you might have a production installation, but you want to create a second installation for testing purposes. Generally the problem that occurs when you try to run a second server is that it tries to use a network interface that is in use by the first server. In this case, you should see one of the following error messages:
Can't start server: Bind on TCP/IP port: Address already in use Can't start server: Bind on unix socket...
For instructions on setting up multiple servers, see Running Multiple MySQL Instances on One Machine.
You do not have write access to the
/tmp directory
If you do not have write access to create temporary files or
a Unix socket file in the default location (the
/tmp directory) or the
TMPDIR environment variable, if it has
been set, an error occurs when you run
mysql_install_db or the
mysqld server.
You can specify different locations for the temporary
directory and Unix socket file by executing these commands
prior to starting mysql_install_db or
mysqld, where
some_tmp_dir is the full path
name to some directory for which you have write permission:
shell>TMPDIR=/shell>some_tmp_dir/MYSQL_UNIX_PORT=/shell>some_tmp_dir/mysql.sockexport TMPDIR MYSQL_UNIX_PORT
Then you should be able to run mysql_install_db and start the server with these commands:
shell>scripts/mysql_install_db --user=mysqlshell>bin/mysqld_safe --user=mysql &
If mysql_install_db is located in the
scripts directory, modify the first
command to scripts/mysql_install_db.
See How to Protect or Change the MySQL Unix Socket File, and Environment Variables.
There are some alternatives to running the mysql_install_db program provided in the MySQL distribution:
If you want the initial privileges to be different from the
standard defaults, use account-management statements such as
CREATE USER,
GRANT, and
REVOKE to change the
privileges after the grant tables have
been set up. In other words, run
mysql_install_db, and then use
mysql -u root mysql to connect to the
server as the MySQL root user so that you
can issue the necessary statements. (See
Account Management Statements.)
To install MySQL on several machines with the same
privileges, put the CREATE
USER, GRANT, and
REVOKE statements in a file
and execute the file as a script using
mysql after running
mysql_install_db. For example:
shell>scripts/mysql_install_db --user=mysqlshell>bin/mysql -u root < your_script_file
This enables you to avoid issuing the statements manually on each machine.
It is possible to re-create the grant tables completely
after they have previously been created. You might want to
do this if you are just learning how to use
CREATE USER,
GRANT, and
REVOKE and have made so many
modifications after running
mysql_install_db that you want to wipe
out the tables and start over.
To re-create the grant tables, stop the server if it is
running and remove the mysql database
directory. Then run mysql_install_db
again.