最近在部署項目,由于之前是在windows做的開發,部署卻是在linux下,吃了不少跨平臺的虧,比如今天才發現linux下mysql的表名是嚴區分大小寫的。這次是另一個坑,在tomcat連接mysql的時候,報錯Access denied for user 'xxx'@'localhost.localdomain' (using
最近在部署項目,由于之前是在windows做的開發,部署卻是在linux下,吃了不少跨平臺的虧,比如今天才發現linux下mysql的表名是嚴格區分大小寫的。這次是另一個坑,在tomcat連接mysql的時候,報錯Access denied for user 'xxx'@'localhost.localdomain' (using password: YES))。
之前也遇到過類似的問題,不過是在windows下,而且錯誤信息有點區別,是Access denied for user 'xxx'@'localhost' (using password: YES)),排查結果就是緩存沒清,實際用來連接數據庫的用戶名和密碼與配置文件中的不一致,這種原因的排查只需要把用來連接數據庫的用戶名和密碼打印一次就可以了,此處不表。但是,這次并不是這個原因造成的,用戶名和密碼沒有錯誤。
排查過程:
先用root用戶登錄mysql,然后執行下列語句查詢mysql的全部用戶,觀察結果,這有助于你對后續內容的理解:
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
你會看到,即便是相同的用戶名,也會有不同的@host后綴,這里指的是同一個用戶在不同的主機上的登錄,@host指的是主機
這里注意報錯的是Access denied for user 'xxx'@'localhost.localdomain' (using password: YES))而不是Access denied for user 'xxx'@'localhost' (using password: YES)),差了一個localdomain還是有很大區別的。這就牽扯到了localhost和127.0.0.1(localhost.localdomain)的區別。
我們直接在命令行以“mysql -u用戶名 -p密碼”的形式登錄mysql數據的時候,并沒有使用tcp/ip連接,mysql會認為連接來自localhost,因此實際登錄的是xxx@localhost。但是,在linux中,用tomcat連接數據庫的時候(我在windows下不會這樣,不知道為何),使用了tcp/ip,主機被判定為來自127.0.0.1,那么實際登錄的就是 xxx@localhost.localdomain,那么你用xxx@localhost的密碼去驗證xxx@localhost.localdomain當然只能被判定為拒絕連接。
解決方法:
1.創建一個新的用戶并授權其訪問指定數據庫的權限。這里我指定了主機為localhost.localdomain,意味允許用戶名為snow的用戶,以密碼123在localhost.localdomain的主機上連接數據庫;注意這個指定主機localhost.localdomain很關鍵。
GRANT USAGE ON *.* TO 'snow'@'localhost.localdomain' IDENTIFIED BY '123' WITH GRANT OPTION;
grant all privileges on exampleDB.* to snow@localhost.localdomain identified by '123';
flush privileges;
然后把代碼中連接的用戶名改為snow,密碼改為123。,問題解決,成功連接上mysql了。
當然你也可以不改代碼中的用戶名和密碼,只需將上述第1,2步驟的用戶名和密碼替換為你的用戶名和密碼即可。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com