Search code examples
mysqlcentos

How to change the MySQL root account password on CentOS 7?


I have installed mySQL on a CentOS 7 VM but I have problems logging in with root.

I tried logging in without password or tried any default ones (like mysql, admin etc) I looked in the my.cnf file and there's no password. I tried changing the password by stopping the service and restarting it with:

mysqld_safe --skip-grant-tables &

But I get this message:

mysqld_safe:command not found

I have no idea what else to do.


Solution

  • What version of mySQL are you using? I''m using 5.7.10 and had the same problem with logging on as root

    There is 2 issues - why can't I log in as root to start with, and why can I not use 'mysqld_safe` to start mySQL to reset the root password.

    I have no answer to setting up the root password during installation, but here's what you do to reset the root password

    Edit: the initial root password on install can be found by running

    grep 'temporary password' /var/log/mysqld.log
    

    http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html


    1. systemd is now used to look after mySQL instead of mysqld_safe (which is why you get the -bash: mysqld_safe: command not found error - it's not installed)

    2. The user table structure has changed.

    So to reset the root password, you still start mySQL with --skip-grant-tables options and update the user table, but how you do it has changed.

    1. Stop MySQL:

      sudo systemctl stop mysqld
      
    2. Set the MySQL environment option:

      sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
      
    3. Start MySQL using the options you just set:

      sudo systemctl start mysqld
      
    4. Login as root

      mysql -u root
      
    5. Update the root user password with these mysql commands:

      mysql> UPDATE mysql.user SET authentication_string = PASSWORD('MyNewPassword')
          -> WHERE User = 'root' AND Host = 'localhost';
      mysql> FLUSH PRIVILEGES;
      mysql> quit
      

      Edit: As mentioned my shokulei in the comments, for 5.7.6 and later, you should use:

      mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
      

      Or you'll get a warning

    6. Stop MySQL

      sudo systemctl stop mysqld
      
    7. Unset the MySQL environment option so it starts normally next time:

      sudo systemctl unset-environment MYSQLD_OPTS
      
    8. Start MySQL normally:

      sudo systemctl start mysqld
      
    9. Try to login using your new password:

      mysql -u root -p
      

    Reference

    As it says at http://dev.mysql.com/doc/refman/5.7/en/mysqld-safe.html,

    Note

    As of MySQL 5.7.6, for MySQL installation using an RPM distribution, server startup and shutdown is managed by systemd on several Linux platforms. On these platforms, mysqld_safe is no longer installed because it is unnecessary. For more information, see Section 2.5.10, “Managing MySQL Server with systemd”.

    Which takes you to http://dev.mysql.com/doc/refman/5.7/en/server-management-using-systemd.html where it mentions the systemctl set-environment MYSQLD_OPTS= towards the bottom of the page.

    The password reset commands are at the bottom of http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html