重置MySQL密码

虽然不是经常遇到,但是遇到了却比较麻烦的事情:MySQL root用户密码遗忘。初始安装的MySQL数据库时没有root密码的,需要手工设置。但是如果设置了root密码却忘记了,就需要设置一个新密码。

备注

本文实践是重置MySQL 'root'@'localhost' 密码的方法,其他服务器登陆,则需要重置对应主机名对应账号密码,例如 example.com 主机访问MySQL的账号就是 'root'@'example.com'

重置步骤

  • 登陆运行MySQL数据库的系统

  • 停止MySQL服务 - 根据发行版不同,MySQL服务进程的pid位置不同,可以通过 kill 命令( 但是不要使用 kill -9 )来关闭 mysqld 进程。注意,以下命令行 .pid 文件替换成实际路径。

HOSTNAME=`hostname`
sudo kill `sudo cat /var/lib/mysql/${HOSTNAME}.pid`
  • 使用 --skip-grant-tables 参数启动MySQL服务,这样任何人就可以无需密码访问所有权限

警告

由于这是一个不安全的设置,所以最好结合 --skip-grant-tables--skip-networking 参数同时使用,避免恢复密码的时候有外部远程客户端连接。

sudo -u mysql /usr/sbin/mysqld --skip-grant-tables --skip-networking

备注

这里采用 sudo -u mysql 是因为 mysql 账号默认shell是 /sbin/nologin 不能登陆,所以通过 sudo 方式切换到mysql用户运行。

  • 在另外一个本地终端上输入 mysql 命令,此时无需密码连接到数据库

  • 在mysql客户端,告诉服务器重新加载授权表,这样就可以进行账号管理:

    flush privileges;
    
  • 重置密码

MySQL 5.7.6及以后版本:

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

MySQL 5.7.5及以前版本:

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
  • 完成账号密码重置之后,就可以停止MySQL服务,然后再次正常启动MySQL服务:

    flush privileges;
    shutdown;
    
  • 然后再次启动MySQL:

    /usr/bin/mysqld_safe
    

参考