java.sql.SQLException: Access denied for user 'app '@'xxx.xxx.xxx.xxx' (using password: YES)

前言:

在接手同事搭建了一半的項目時,準備在測試環境新建一個數據庫,但是發現沒法建庫,原因是因爲用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位小夥伴在等你們啦,感興趣的就趕緊來點擊關注我把,哪裏不明白或有不同觀點的地方歡迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章