今天尝试在自己的电脑上用Java连接数据库,但无奈以前设置的root的密码忘记了。尝试去找也没找到(找到了也是加密的我也看不懂)。用navicat可以看一下是几位数,或许可以用来猜一下,不过等我发现的时候已经是我把root密码改了,正要连接navicat的时候。结果连不上,哎,连不上,就是玩。我去搜了一下原来是我的加密格式和navicat需要的不一样。现在我就还原一下我修改的过程。
第一步:以管理员身份运行控制台,关闭mysql服务。
1 | C:\WINDOWS\system32>net stop mysql |
第二步:跳过授权表,进行免密登录。
1 | system32>mysqld --console --skip-grant-tables --shared-memory |
第三步:用管理员身份新打开一个cmd,然后登录mysql
1 | C:\WINDOWS\system32>mysql -u root |
第四步:这时你已经从控制台进入mysql了,接下来你要进行的都是sql操作,在这一步我们就要修改密码了。
走到这一步就有学问了,因为网上可能给的修改方法是下面这种。
1 | update mysql.user set password=password('123456') where user='root'; |
这种修改方式以及非常之out了,为什么呢,因为这里面有两个字段以及用不了了,就是password和password(),password这个字段以及被废弃了变成了authentication_string,而password()这个方法mysql8也已经不使用了。
于是我尝试使用
1 | update mysql.user set authentication_string='123456' where user='root'; |
这样可以成功修改密码,但如果使用
1 | select host,user,authentication_string from mysql.user; |
查看你修改的密码,你会发现你这一条密码是明文的。这合理吗?这不合理,就算你觉得合理,navicat也觉得不合理,你在navicat输入对应的密码人家根本不认,说密码匹配失败。
稍微新一点的博文会给出以下这条命令:
1 | ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; |
但你照这个敲了,你的密码变成密文了,但navicat还是连不上mysql,为什么呢?因为在mysql8.0.以上版本中,caching_sha2_password是默认的身份验证插件,而不是以往的mysql_native_password。但是navicat使用的加密方式依然是mysql_native_password。所以你只好使用这条命令:
1 | alter user '用户名'@localhost IDENTIFIED WITH mysql_native_password by '你的密码'; |
修改成功,皆大欢喜,可以回去继续捯饬java了。
PS:为什么以前用的时候没遇到这个问题?