mysql_install_db initializes the MySQL data
directory and creates the system tables that it contains, if
they do not exist. It also initializes the
system tablespace
and related data structures needed to manage
InnoDB tables. As of MySQL 5.6.8,
mysql_install_db is a Perl script and can be
used on any system with Perl installed. Before 5.6.8, it is a
shell script and is available only on Unix platforms.
As of MySQL 5.6.8, on Unix platforms,
mysql_install_db creates a default option
file named my.cnf in the base installation
directory. This file is created from a template included in the
distribution package named my-default.cnf.
You can find the template in or under the base installation
directory. When started using mysqld_safe,
the server uses my.cnf file by default. If
my.cnf already exists,
mysql_install_db assumes it to be in use and
writes a new file named my-new.cnf instead.
With one exception, the settings in the default option file are
commented and have no effect. The exception is that the file
changes the sql_mode system
variable from its default of
NO_ENGINE_SUBSTITUTION to also
include STRICT_TRANS_TABLES.
This setting produces a server configuration that results in
errors rather than warnings for bad data in operations that
modify transactional tables. See
Section 5.1.7, “Server SQL Modes”.
To invoke mysql_install_db, use the following syntax:
shell> mysql_install_db [options]
Because the MySQL server, mysqld, needs to
access the data directory when it runs later, you should either
run mysql_install_db from the same system
account that will be used for running mysqld
or run it as root and use the
--user option to
indicate the user name that mysqld will run
as. It might be necessary to specify other options such as
--basedir or
--datadir if
mysql_install_db does not use 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
mysql_install_db needs to invoke
mysqld with the
--bootstrap and
--skip-grant-tables options.
If you have set a custom TMPDIR environment
variable when performing the installation, and the specified
directory is not accessible,
mysql_install_db may fail. If so, unset
TMPDIR or set TMPDIR to
point to the system temporary directory (usually
/tmp).
After mysql_install_db sets up the
InnoDB
system
tablespace, changes to some of tablespace
characteristics require setting up a whole new
instance. This includes
the file name of the first file in the system tablespace and
the number of undo logs. If you do not want to use the default
values, make sure that the settings for the
innodb_data_file_path and
innodb_log_file_size
configuration options are in place in the MySQL
configuration
file before running
mysql_install_db.
mysql_install_db supports the following
options, which can be specified on the command line or in the
[mysql_install_db] group of an option file.
(Options that are common to mysqld can also
be specified in the [mysqld] group.) Other
options are passed to mysqld. For information
about option files, see Section 4.2.3.3, “Using Option Files”.
mysql_install_db also supports the options
for processing option files described at
Section 4.2.3.4, “Command-Line Options that Affect Option-File Handling”.
The path to the MySQL installation directory.
The path to the MySQL data directory. Beginning with MySQL 5.6.8, mysql_install_db is more strict about the option value. Only the last component of the path name is created if it does not exist; the parent directory must already exist or an error occurs.
Cause mysql_install_db to run even if DNS does not work. Grant table entries that normally use host names will use IP addresses.
On Unix platforms, this option provides for more secure
MySQL installation. Invoking
mysql_install_db with
--random-passwords
causes it to perform the following actions in addition to
its normal operation:
Create a random password, assign it to the initial MySQL
root accounts, and set the
“password expired” flag for those accounts.
Write the initial password file to the
.mysql_secret file in the directory
named by the HOME environment
variable. Depending on operating system, using a command
such as sudo may cause the value of
HOME to refer to the home directory
of the root system user.
If .mysql_secret already exists,
the new password information is appended to it. Each
password entry includes a timestamp so that in the event
of multiple install operations it is possible to
determine the password associated with each one.
.mysql_secret is created with mode
600 to be accessible only to the system user for whom it
is created.
Remove the anonymous-user MySQL accounts.
As a result of these actions, it is necessary after
installation to start the server, connect as
root using the password written to the
.mysql_secret file, and to assign a new
root password. Until this is done,
root cannot do anything else. This must
be done for each root account you intend
to use. To change the password, you can use the
SET PASSWORD statement (for
example, with the mysql client). You can
also use mysqladmin or
mysql_secure_installation.
New RPM install operations (not upgrades) invoke
mysql_install_db with the
--random-passwords option. (Install
operations using RPMs for Unbreakable Linux Network are
unaffected because they do not use
mysql_install_db.)
As of MySQL 5.6.9, new Solaris PKG install operations (not
upgrades) invoke mysql_install_db with
the --random-passwords option.
For install operations using a binary
.tar.gz distribution or a source
distribution, you can invoke
mysql_install_db with the
--random-passwords option manually to make
your MySQL installation more secure. This is recommended,
particularly for sites with sensitive data.
This option was added in MySQL 5.6.8.
For internal use. This option is used during the MySQL installation process for install operations performed using RPM packages.
Use IP addresses rather than host names when creating grant table entries. This option can be useful if your DNS does not work.
For internal use. This option specifies the directory under which mysql_install_db looks for support files such as the error message file and the file for populating the help tables.
The system (login) user name to use for running
mysqld. Files and directories created by
mysqld will be owned by this user. You
must be root to use this option. By
default, mysqld runs using your current
login name and files and directories that it creates will be
owned by you.
Verbose mode. Print more information about what the program does.
For internal use. This option is used for creating Windows distributions.

User Comments
While instalingl mysql-4.0.20 from source on a Redhat 9 box which had mysql-3.23.xx preinstalled. I also needed to move the /etc/my.cnf to another location while I installed the privilege tables using bin/msyql_install_db
For all the linux Newbies out there--
I ran into an error 13- not allowing access to the /root/tmp folder. This essentially what is listed earlier on the page as you do not have write access to /tmp.
In my case this was due to the TMPDIR environtmental variable being set to /root/tmp. To view the environtmental variables, type 'env'.
By running the commands suggested, you temporarily change the TMPDIR environmental variable to /some_tmp_dir. If you have defined your MYSQL_UNIX_PORT in your build, it should probably be that directory.
shell> TMPDIR=/some_tmp_dir/
shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysql.sock
shell> export TMPDIR MYSQL_UNIX_PORT
hope this helps someone
If you suspect permission problems and but find all file and
directory permissions in place and ok then selinux must be
giving the problem. I know because I ran into it.
Try disabling selinux (by running system-config-securitylevel
on fedora core 3 which i have) and retry. It things work out
then fine tune selinux for your system
After installing the distribution package mysql-standard-5.0.27-solaris8-sparc-64bit.pkg in its default location (/opt/mysql/mysql) I had to explicitely set the datadir when running "mysql_install_db":
mysql_install_db --user=mysql --datadir=/opt/mysql/mysql/data
otherwise, mysqld_safe failed with "Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist". I found the error by specifying --log-error:
mysqld_safe --user=mysql --verbose --log-error=/tmp/mysql.error.log
mysql_install_db by default reads /etc/my.cnf
If you want it to read configuration data from somewhere else:
bin/mysql_install_db -defaults-file=somewhere-else
Ubuntu 9.10
Moving the database from /var/lib/mysql to /data/databases/mysql
You'll get errors when running mysql_install_db until you go into /etc/apparmor.d, update the usr.sbin.mysql file, and run /etc/init.d/apparmor restart
You may also get an error when running /etc/init.d/mysql start:
Access denied for user debian-sys-maint at localhost
Check /etc/mysql/debian.cnf for the account information.
You'll need to run mysql, add the grant tables, and then restart mysql.
Add your own comment.