合 MySQL 8.0、5.7、5.6、5.5忘记密码重置方法
忘记MySQL的root密码后如何登陆数据库?
在MySQL中,若密码输入错误,则会返回以下信息:
1 2 3 | [root@LHRDB ~]# mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) |
在MySQL中,若密码丢失则无法直接找回,只能通过特殊方式来修改密码。
首先,需要确认是“root@localhost”还是“root@%”密码丢失,因为这是2个不同的用户,若其中一个丢失,那么可以使用另一个用户登录,然后修改密码。
若所有用户均不能登录,那么还有2种特殊方式修改密码,下面分别进行说明。
方法一:使用“--init-file”选项
① 登录MySQL数据库所在的服务器,停止MySQL服务。对于Linux服务器,使用“ps -ef|grep mysql”来查找MySQL服务的进程号,然后手工kill掉MySQL进程。对于Windows服务器,在cmd里输入services.msc打开“服务”,使用“服务”来停止MySQL服务,或在cmd里使用“net stop mysql”停止服务。
② 创建一个文本文件mysql-init.sql,文件内容写入密码修改语句。
MySQL 5.5和5.6版本使用以下语句:
1 2 | set password FOR 'root'@'%' =password('lhr'); set password FOR 'root'@'localhost' =password('lhr'); |
从MySQL 5.7版本开始使用:
1 2 | alter user 'root'@'%' identified by 'lhr'; alter user 'root'@'localhost' identified by 'lhr'; |
③ 使用--init-file参数,启动MySQL实例:
1 | ./mysqld_safe --defaults-file=/etc/my.cnf --init-file=/tmp/mysql-init.sql & |
若是Windows服务,则可以通过如下命令启动:
1 | D:\MySQL\mysql-8.0.15-win64\bin\mysqld --defaults-file=D:\MySQL\mysql-8.0.15-win64\data803314\mysql803314.ini --init-file=d:\mysql-init.sql --console |
实例启动成功后,密码即修改完毕,最后再删除mysql-init.sql文件。
④ 重新以正常方式启动MySQL服务并验证新密码。
方法二:使用“--skip-grant-tables”选项
在启动MySQL数据库时使用“--skip-grant-tables”选项,表示启动MySQL服务时跳过权限表认证。通过这种方式启动后,在使用root用户连接到MySQL时将不需要密码。
在使用skip-grant-tables时需要注意以下内容:
1、对于MySQL 8.0以下版本,如果在命令行只添加了--skip-grant-tables,那么在修改完密码后,其实无需重启MySQL服务,只需要执行flush privileges即可。从MySQL 8.0开始,必须去掉--skip-grant-tables才能远程登陆数据库。
2、从安全角度出发,建议加上--skip-networking,但是因为其是静态参数,所以将其剔除掉需要重启实例。
3、加上--skip-networking,虽然可以屏蔽掉TCP连接,但对于本地其它用户,只要有Socket文件的可读权限,都能无密码登录,存在安全隐患。
具体修改密码的步骤如下所示:
① 登录MySQL数据库所在的服务器,停止MySQL服务。
② 在参数文件的[mysqld]项下添加skip-grant-tables语句,或使用--skip-grant-tables选项重启MySQL服务: