MySQL root密码忘记后更优雅的解决方法_工具资源_青云站长教程网
欢迎来到站长教程网!
  • 秒到短信接口 免费试用
  • 微信支付宝接口 秒结算
  • 中文网站排名|申请加入
  • 搜索引擎全站查询
  • 查询移动网站权重数据
  • 海外主机 台湾公司直销
  • 工具资源

    当前位置:主页 > 网站运营 > 工具资源 >

    MySQL root密码忘记后更优雅的解决方法

    时间:2019-07-10|栏目:工具资源|点击:
  • 前言

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

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

    skip-grant-tables的解法

    首先,关闭实例

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

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

    # ps -ef |grep mysqldroot  6220 6171 0 08:14 pts/0 00:00:00 /bin/sh bin/mysqld_safe --defaults-file=my.cnfmysql  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=3307root  6418 6171 0 08:17 pts/0 00:00:00 grep --color=auto mysqld# kill 6347

    使用--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.sockmysql> 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: 1mysql> 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.sockmysql> 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 statementmysql> 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。

    更优雅的解法

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

    首先,依旧是关闭实例

    其次,创建一个sql文件

    写上密码修改语句

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

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

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

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

    上一篇:MySQL8新特性:降序索引详解

    栏    目:工具资源

    下一篇:升级到MySQL5.7后开发不得不注意的一些坑

    本文标题:MySQL root密码忘记后更优雅的解决方法

    本文地址:http://www.jh-floor.com/wangzhanyunying/gongjuziyuan/2279.html

    广告投放 | 联系我们 | 版权申明

    重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

    如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

    联系QQ:888888 | 邮箱:888888#qq.com(#换成@)

    Copyright © 2002-2017 青云站长教程网 版权所有 琼ICP备xxxxxxxx号