MySQL 8.0.15、5.7、5.6、5.5忘记密码重置方法

MySQL  8.0.15、5.7、5.6、5.5忘记密码重置方法


官网:

https://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

https://dev.mysql.com/doc/refman/5.6/en/resetting-permissions.html

https://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html




方法一:使用“--init-file”选项
① 登录MySQL数据库所在的服务器,停止MySQL服务。
② 创建一个文本文件mysql-init.sql,文件内容写入密码修改语句。
MySQL 5.5和5.6版本使用以下语句:
set password FOR 'root'@'%' =password('lhr');
set password FOR 'root'@'localhost' =password('lhr');
从MySQL 5.7版本开始使用:
alter user 'root'@'%' identified by 'lhr';
alter user 'root'@'localhost' identified by 'lhr';
③ 使用--init-file参数,启动MySQL实例:
./mysqld_safe --defaults-file=/etc/my.cnf --init-file=/tmp/mysql-init.sql &
若是Windows服务,则可以通过如下命令启动:
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”选项
1、停止服务
2、在参数文件的[mysqld]项下添加skip-grant-tables语句,然后启动MySQL服务
Linux启动MySQL服务:
/var/lib/mysql57/mysql5719/bin/mysqld_safe  --defaults-file=/etc/my.cnf --skip-grant-tables  &
Windows启动MySQL服务可以用命令行也可以用“服务”来启停,cmd命令行如下:
D:\MySQL\mysql-5.5.16-win32\bin\mysqld --defaults-file=D:\MySQL\mysql-5.5.16-win32\mysql553308.ini --skip-grant-tables --console
3、mysql -uroot -p -P3306 #无密码登录,或以任意密码登陆
--5.7开始:
flush privileges;
ALTER USER root@'localhost' IDENTIFIED BY 'lhr';
ALTER USER root@'%' IDENTIFIED BY 'lhr';
--update mysql.user set authentication_string=password('lhr') where user='root';
--5.7以下:
update mysql.user set password=password('lhr') where user='root';
4、刷新权限,必须执行:
flush privileges; 
5、删除参数文件中的skip-grant-tables ,重启服务
--查询密码,5.7以下
select user,host,grant_priv,super_priv,password,authentication_string from mysql.user;
--查询密码,5.7开始
select user,host,grant_priv,super_priv,authentication_string,password_last_changed from mysql.user;




MySQL  8.0.15忘记密码重置方法

1.打开命令窗口cmd,输入命令:net stop mysql,停止MySQL服务,

2.开启跳过密码验证登录的MySQL服务

          输入命令  

        mysqld --console --skip-grant-tables --shared-memory 

3.再打开一个新的cmd,无密码登录MySQL,输入登录命令:mysql -u root -p

 

4. 密码置为空,命令如下:

    use mysql

    update user set authentication_string='' where user='root';

 

5.退出mysql,执行命令:

    quit

 

6. 关闭以-console --skip-grant-tables --shared-memory 启动的MySQL服务,

7. 打开命令框,输入:net start mysql  启动MySQL服务。

8.步骤4密码已经置空,所以无密码状态登录MySQL,输入登录命令:mysql -u root -p

9.利用上一篇博客中更改密码的命令,成功修改密码,如下图:

//ALTER USER  'root' @ 'localhost'  IDENTIFIED BY  '新密码' ;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '111111';

 

10.验证更改后密码正确登录

输入quit,退出当前登录,输入登录命令:mysql -u root -p

输入密码,成功登录,到此,重置密码结束。




使用--skip-grant-tables参数,重启实例

# bin/mysqld_safe --defaults-file=my.cnf --skip-grant-tables  --skip-networking &

设置了该参数,则实例在启动过程中会跳过权限表的加载,这就意味着任何用户都能登录进来,并进行任何操作,相当不安全。

建议同时添加--skip-networking参数。其会让实例关闭监听端口,自然也就无法建立TCP连接,而只能通过本地socket进行连接。

MySQL8.0就是这么做的,在设置了--skip-grant-tables参数的同时会自动开启--skip-networking。

# mysql -S /usr/local/mysql57/data/mysql.sock
mysql> update mysql.user set authentication_string=password('123456') where host='localhost' and user='root';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

注意:
这里的update语句针对的是MySQL 5.7的操作,如果是在5.6版本,修改的应该是password字段,而不是authentication_string。
update mysql.user set password=password('123456') where host='localhost' and user='root';

 

而在MySQL 8.0.11版本中,这种方式基本不可行,因为其已移除了PASSWORD()函数及不再支持SET PASSWORD ... = PASSWORD ('auth_string')语法。

不难发现,这种方式的可移植性实在太差,三个不同的版本,就先后经历了列名的改变,及命令的不可用。

下面,介绍另外一种更通用的做法,还是在skip-grant-tables的基础上。

与上面不同的是,其会先通过flush privileges操作触发权限表的加载,再使用alter user语句修改root用户的密码,如:

# bin/mysql -S /usr/local/mysql57/data/mysql.sock
mysql> alter user 'root'@'localhost' identified by '123';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> alter user 'root'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)
免密码登录进来后,直接执行alter user操作是不行的,因为此时的权限表还没加载。可先通过flush privileges操作触发权限表的加载,再执行alter user操作。

需要注意的是,通过alter user修改密码只适用于MySQL5.7和8.0,如果是MySQL 5.6,此处可写成

update mysql.user set password=password('123456') where host='localhost' and user='root';

 

最后重启实例

mysql> shutdown;
# bin/mysqld_safe --defaults-file=my.cnf &

需要注意的是,如果在启动的过程中没有指定--skip-networking参数,无需重启实例。但在网上看到的绝大多数方案,都是没有指定该参数,但重启了实例,实在没有必要。

下面对这个方案做个总结:

1. 如果只添加了--skip-grant-tables,修改完密码后,其实无需重启,执行flush privileges即可。

2. 从安全角度出发,建议加上--skip-networking。但因其是静态参数,将其剔除掉需要重启实例。

3. 加上--skip-networking,虽然可以屏蔽掉TCP连接,但对于本地其它用户,只要有socket文件的可读权限,都能无密码登录。还是存在安全隐患。

4. 不建议通过update的方式修改密码,更通用的其实是alter user。






MySQL5.7忘记密码解决方案

第一种方法

首先是网上普遍见到的

  1. 关闭服务
  2. windows下在 C:\ProgramData(隐藏文件夹)\MySQL\MySQL Server 5.7\my.ini中的 [mysqld]下添加 skip-grant-tables
  3. 重启服务,再次登陆此时已经不需要密码了
  4. 删除原来的那句 skip-grant-tables,再重启下服务就OK了

但是我按照这种方法在第三步的时候仍然需要密码,如果有同学也是像我这样的话可以尝试下下面这种方法

第二种方法

  1. 关闭服务
  2. windows下在 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini中的 [mysqld]下添加 skip-grant-tables
  3. 在一个cmd窗口中刚输入 mysqld --skip-grant-tables, 再开启第二个窗口直接输入 mysql可以直接进入了

修改密码,如下几条命令

  1. use mysql
  2. update user set authentication_string=password('密码') where user="用户" and host='localhost';
  3. flush privileges;
  4. 删除原来的那句 skip-grant-tables,重启服务



更优雅的解法

相对于skip-grant-tables方案,我们来看看另外一种更优雅的解法,其只会重启一次,且基本上不存在安全隐患。

首先,依旧是关闭实例

其次,创建一个sql文件

写上密码修改语句

# vim init.sql 
alter user 'root'@'localhost' identified by 'lhr';

最后,使用--init-file参数,启动实例

# bin/mysqld_safe --defaults-file=my.cnf --init-file=/usr/local/mysql57/init.sql &

实例启动成功后,密码即修改完毕~

 

如果mysql实例是通过服务脚本来管理的,除了创建sql文件,整个操作可简化为一步。

# service mysqld restart --init-file=/usr/local/mysql57/init.sql

注意:该操作只适用于/etc/init.d/mysqld这种服务管理方式,不适用于RHEL 7新推出的systemd。





About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub( http://blog.itpub.net/26736162)、博客园( http://www.cnblogs.com/lhrbest)和个人weixin公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599(满) 、618766405

● weixin群:可加我weixin,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2019-07-01 06:00 ~ 2019-07-31 24:00 在西安完成

● 最新修改时间:2019-07-01 06:00 ~ 2019-07-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客户端扫描下面的二维码来关注小麦苗的weixin公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗weixin, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



请使用浏览器的分享功能分享到微信等