首页 > 数据库 >MySQL root密码忘记解决

MySQL root密码忘记解决

时间:2024-09-26 09:01:08浏览次数:1  
标签:-- skip MySQL 密码 mysqld user mysql root

skip-grant-tables的解法

首先,关闭实例

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

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

# ps -ef |grep mysqld
root      6220  6171  0 08:14 pts/0    00:00:00 /bin/sh bin/mysqld_safe --defaults-file=my.cnf
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
root      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.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。

 

更优雅的解法

相对于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 &

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

 

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

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

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

 

标签:--,skip,MySQL,密码,mysqld,user,mysql,root
From: https://www.cnblogs.com/ataoxz/p/18432728

相关文章

  • Mysql-字符串函数
    UUIDselectmd5(uuid())截取LEFT(str,len)返回字符串str的最左面len个字符。RIGHT(str,len)返回字符串str的最右面len个字符。SUBSTRINGSUBSTR(name,3,5)SUBSTR(name,3)SUBSTRING(strFROMpos)SUBSTRING_INDEX(str,delim,count)返回从字符串str的第count个出现......
  • 零基础密码爆破
      这篇文章适合网络安全零基础新手小白,难度并不高,只要跟着我的步骤,你也能快速学会密码爆破  一、首先密码爆破又叫弱口令爆破,之所以叫弱口令就是用户设置了过于简单,容易猜测的密码                            ......
  • mysql的索引
    InnoDB是mysql的默认引擎,索引原理是B+树。InnoDB的索引方式首先,数据库的目录也是很庞大的,不能放在内存里。而磁盘的读写速度是比内存慢几个数量级。而且顺序读一块比随机I/O划算,也就是局部性原理。所以:InnoDB把数据和目录都放在默认大小16KB的数据页中。每次读都读一个页......
  • 00 md5加密密码
    关于md5加密假设你有一个用户注册程序wupeiqi,123eric,123tony,123加密密码wupeiqi,asdfasfwwereric,asdfasfwwertony,asdfasfwwerpythonmd5加密密码importhashlibobj=hashlib.md5()obj.update('联通'.encode('utf-8'))v1=obj.digest()#字节串b"\......
  • MYSQL的安装与卸载
    1安装1.进入官网下载想要的mysql版本2.双击之后会出现如下图所示界面,询问是否同意,将我同意的选框勾选上,然后点击next,如下:3.选择自定义安装,点击下一步4.根据电脑配置选择要安装的MySql版本,然后点击next5.如果出现当前界面,则可以配置安装目录,如果出现的不是这个界面请......
  • MYSQL-约束
    1-limit语句limit的作用是限制查询记录的条数格式如下select*from表名limitoffset,row_count;举例select*fromtablelimit 1,4;这里的1指的是从第二行数据开始,1就是索引(索引从0开始),4指的是查询记录条数,也就是从第二条(行)开始,一共查询四条记录,到第五条(行)如......
  • MySQL高阶1965-丢失信息的雇员
    目录题目准备数据分析数据实现题目编写解决方案,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:雇员的 姓名 丢失了,或者雇员的 薪水信息 丢失了返回这些雇员的id employee_id , 从小到大排序 。准备数据CreatetableIfNot......
  • windows server 怎么 禁用 SWEET32 密码组
    在WindowsServer上禁用SWEET32密码组可以按照以下步骤进行操作:一、确定使用的加密协议首先,确定你的WindowsServer正在使用的加密协议是SSL/TLS还是其他协议。如果是SSL/TLS,通常是通过InternetInformationServices(IIS)或其他网络服务来实现的。二、使用注册......
  • 信息安全工程师(17)密码体制分类
    前言密码体制,也称为密码系统,是信息安全领域中的一个重要概念,用于解决机密性、数据完整性、认证、身份识别、可控性及不可抵赖性等问题。根据加密和解密所使用的密钥是否相同,密码体制主要可以分为两大类:单钥体制(对称密码体制、秘密密钥密码体制)和双钥体制(非对称密码体制、公开......
  • 信息安全工程师(18)常见密码算法
    前言  常见的密码算法主要分为三大类:对称加密算法、非对称加密算法和摘要算法。一、对称加密算法    对称加密算法,又称为秘密密钥算法或单密钥算法,是指加密和解密使用相同密钥的加密方式。这种算法的特点是加密速度快,适用于大量数据的加密。常见算法:AES(Ad......