MySQL root密码忘记,原来还有更优雅的解法!

数据库 MySQL
一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables。问了下群里的大咖,第一反应也是skip-grant-tables。通过搜索引擎简单搜索了下,无论是百度,抑或Google,只要是用中文搜索,首页都是这种解法。可见这种解法在某种程度上已经占据了使用者的心智。

MySQL root密码忘记,原来还有更优雅的解法!

一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables。

问了下群里的大咖,***反应也是skip-grant-tables。通过搜索引擎简单搜索了下,无论是百度,抑或Google,只要是用中文搜索,首页都是这种解法。可见这种解法在某种程度上已经占据了使用者的心智。下面具体来看看。

skip-grant-tables的解法

首先,关闭实例

这里,只能通过kill mysqld进程的方式。

注意:不是mysqld_safe进程,也切忌使用kill -9。

 

  1. # ps -ef |grep mysqld  
  2. root      6220  6171  0 08:14 pts/0    00:00:00 /bin/sh bin/mysqld_safe --defaults-file=my.cnf  
  3. mysql      6347  6220  0 08:14 pts/0    00:00:01 /usr/local/mysql57/bin/mysqld --defaults-file=my.cnf --basedir=/usr/local/mysql57 --datadir=/usr/local/mysql57/data --plugin-dir=/usr/local/mysql57/lib/plugin --user=mysql --log-error=slowtech.err --pid-file=slowtech.pid --socket=/usr/local/mysql57/data/mysql.sock --port=3307  
  4. root      6418  6171  0 08:17 pts/0    00:00:00 grep --color=auto mysqld  
  5.  
  6. # kill 6347 

 

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

 

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

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

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

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

修改密码

 

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

 

注意:

这里的update语句针对的是MySQL 5.7的操作,如果是在5.6版本,修改的应该是password字段,而不是authentication_string。

 

  1. 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用户的密码,如:

 

  1. # bin/mysql -S /usr/local/mysql57/data/mysql.sock  
  2. mysql> alter user 'root'@'localhost' identified by '123' 
  3. ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement  
  4. mysql> flush privileges 
  5. Query OK, 0 rows affected (0.00 sec)  
  6.  
  7. mysql> alter user 'root'@'localhost' identified by '123' 
  8. Query OK, 0 rows affected (0.00 sec) 

 

免密码登录进来后,直接执行alter user操作是不行的,因为此时的权限表还没加载。可先通过flush privileges操作触发权限表的加载,再执行alter user操作。

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

 

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

***重启实例

 

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

 

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

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

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

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

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

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

更优雅的解法

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

首先,依旧是关闭实例

其次,创建一个sql文件

写上密码修改语句

 

  1. # vim init.sql   
  2. alter user 'root'@'localhost' identified by '123456'

 

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

 

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

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

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

 

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

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

 

原文链接:https://www.cnblogs.com/ivictor/p/9243259.html 

责任编辑:庞桂玉 来源: 精英程序员
相关推荐

2010-05-26 17:21:14

MySQL root密

2010-06-10 15:44:53

2017-04-13 12:20:43

Mysqlroot密码

2010-06-04 16:03:37

MySQL root密

2010-10-14 10:09:33

MySQL root用

2010-05-13 18:18:58

MySQL root

2010-06-01 08:54:36

MySQL忘记root

2011-06-27 09:23:05

Ubuntu密码

2010-09-02 14:04:20

2010-06-04 18:38:23

MySQL root密

2010-06-13 09:25:12

MySQL root用

2022-05-13 08:48:50

React组件TypeScrip

2023-12-21 10:26:30

​​Prettier

2010-06-09 17:26:54

2010-05-25 16:37:47

MySQL忘记密码

2021-12-29 17:24:16

Kubernetes集群事件

2021-06-25 15:53:25

Kubernetes程序技巧

2022-03-11 12:14:43

CSS代码前端

2019-09-09 10:25:54

MySQLMariaDB roo密码

2010-06-04 19:49:22

cnblogs
点赞
收藏

51CTO技术栈公众号