Problems Running mysql_install_db

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.old
shell> 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 Section 1.7, “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 Section 5.3, “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=/some_tmp_dir/
    shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysql.sock
    shell> export 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=mysql
    shell> bin/mysqld_safe --user=mysql &

    If mysql_install_db is located in the bin directory, modify the first command to bin/mysql_install_db.

    See Section B.5.4.5, “How to Protect or Change the MySQL Unix Socket File”, and Section 2.14, “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 Section 13.7.1, “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=mysql
    shell> 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.

Download this Manual
User Comments
  Posted by Nathan Zook on November 17, 2009
If you get a warning about not being able to create test tables, this indicates a permissions problem. First ensure that the user mysql will run as has the ability to write to the data directories. Note also that SELinux and AppArmor can cause permissions problems, even if the file permissions would allow access. This is a particular issue if you are wanting to run a server in a sandbox. Check the documentation for how to configure these security systems to permit mysql to access the directories in question.

  Posted by Larry Irwin on February 8, 2011
When you install a generic binary on a base Debian Lenny install, there is a leftover configuration /etc/mysql/my.cnf file that makes the script mysql_install_db fail.
Removing the folder and it contents solves the problem.
Sign Up Login You must be logged in to post a comment.