赞
踩
在接手同事搭建了一半的项目时,准备在测试环境新建一个数据库,但是发现没法建库,原因是因为用Navicat连接的mysql数据库不是root账户,所以找到老同事要到root账号就快乐的建库啦,但是中间有很多小的插曲,比如我们这root账号并不是设置的任意ip都可以通过Navicat直接连接,所以我需要先在服务器里用指令建库然后在给某些用户赋予对于这个数据库的权限。但是建好库后,粗心的我还是碰到了标题中的异常:java.sql.SQLException: Access denied for user 'app '@'xxxxxx' (using password: YES),这篇文章主要讲解的是复现异常和如何解决这个异常。
一、复现Navicat连接数据库出现异常的场景:
我用Navciat正准备建数据库时,出现如下图的异常,翻译的意思就是拒绝用户root@%访问数据库‘xxxxx’,这种错误是在远程登录时造成的,如果直接在Linux中的MySQL下,通过sql语句操作则不会出现这样的错误,所以造成这样错误出现的原因是远程登录时,创建数据库,权限不足。
二、解决异常的第一步
出现问题后我是在Linux下用指令新建了一个库,并且给相应的账号进行赋值,具体操作如下
①首先用root账号登入数据库,然后查看下都有哪些用户
登录指令:mysql -u root -p 回车后输入密码
root权限下查看所有用户的指令:SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
②查看你Navicat的连接数据库的账号有哪些操作权限,这里有个小坑,记住'dada'@'%'和'dada'@'localhost'是不一样的,一般我们使用%,因为%包含全部。
查看某用户权限的指令:show grants for 'app'@'%';
③新建一个数据库,相应的指令是
CREATE DATABASE xxxx;
④然后给你的用户这里是app@'%'赋予操作这个数据库的权限,指令是
grant all privileges on main_db.* to app@'%' identified by 'xxxxxx';
如果出现上面的错误,这是因为mysql版本不一样导致密码的加密方式不同,你直接在后面输入密码就会出现上面的错,可以输入以下指令:set old_passwords=0;然后在重新执行授权指令即可。
但是如果出现的是下面这个错误,就说明你指令的格式写的有问题,比如没有写结束号分号(;)仔细检查下看看哪里写的不规范。
然后再执行授权指令即可
最后记得执行刷新指令:flush privileges;
⑤再次查看该用户的权限,看权限是否赋值成功,出现你授权数据库的名称,则表明授权成功。
⑥这时候我用app这个账号连上Navicat,就会出现我用root新建的数据库名称
三、复现控制台出现异常的场景(下面才出现标题中出现的异常)
1.上面都只是数据库连接出现的问题,代码的控制台还没有报错,现在我用测试接口测试下是否可以去这个数据库的某张表里查到一条数据,一运行代码就出现了如下的异常
这个异常,就时上面我们没有给app账号授权造成的,只要去Linux下用root账号给用户授权就可以啦。
2.授完全,我一运行代码又出现了以下的问题
出现这个异常时,就是你的配置文件写的有问题,是不是账号那里多敲了一个空格,或者是ip写的不对,也或者是密码写的不对,一般都会报上图这个错误。
3.经检查,我发现我是ip写的不对
解决问题最繁琐的地方是排查问题出现在什么地方,只要找到问题出现的地方,其实解决问题就变得很容易啦。我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有17位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里不明白或有不同观点的地方欢迎留言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。