• 售前

  • 售后

热门帖子
入门百科

MySQL root密码忘记后更优雅的办理方法

[复制链接]
維健_廣律 显示全部楼层 发表于 2021-10-26 13:38:16 |阅读模式 打印 上一主题 下一主题
前言
不停以来,对于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. # 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版本中,这种方式基本不可行,由于其已移除了
  1. PASSWORD()
复制代码
函数及不再支持
  1. SET PASSWORD ... = PASSWORD ('auth_string')
复制代码
语法。
不难发现,这种方式的可移植性实在太差,三个不同的版本,就先后履历了列名的改变,及下令的不可用。
下面,先容别的一种更通用的做法,还是在skip-grant-tables的基础上。
与上面不同的是,其会先通过
  1. flush privileges
复制代码
操纵触发权限表的加载,再使用
  1. 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. mysql> alter user 'root'@'localhost' identified by '123';
  7. Query OK, 0 rows affected (0.00 sec)
复制代码
免密码登录进来后,直接实行
  1. alter user
复制代码
操纵是不可的,由于此时的权限表还没加载。可先通过
  1. flush privileges
复制代码
操纵触发权限表的加载,再实行
  1. alter user
复制代码
操纵。

需要注意的是,通过
  1. alter user
复制代码
修改密码只实用于MySQL5.7和8.0,如果是MySQL 5.6,此处可写成
  1. update mysql.user set password=password('123456') where host='localhost' and user='root';
复制代码
最后重启实例
  1. mysql> shutdown;
  2. # 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。
更优雅的解法
相对于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。
总结
以上就是这篇文章的全部内容了,希望本文的内容对各人的学习或者工作具有一定的参考学习代价,如果有疑问各人可以留言交换,谢谢各人对脚本之家的支持。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作