2011年9月20日

無法遠端連接MySQL:message from server: "Host xxx is not allowed to connect to this MySQL server"


 
通常無論我們在寫測試程式或demo,
如果要用到資料庫,我們常會使用MySQL。
為了方便起見,通常就都在本機(也就是localhost安裝一份MySQL),
使用起來倒也相安無事。

然而事情總不是這麼簡單 orz,
平常在 Java 裡再平凡也不過的一行程式碼,
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", username, password);
換作了從非本機的遠端 IP 連接,
conn = DriverManager.getConnection("jdbc:mysql://remoteIP:3306/test", username, password);
竟然死也連不上,還跳出一個訊息是:
message from server: "Host  is not allowed to connect to this MySQL server"
這到底是怎麼一回事呢?

後來查了一些資料,發現出現這種狀況都是因為想直接用 root 帳號從遠端連,
會出現錯誤訊息其實是因為 MySQL 為了安全性的因素,
所以將權限最大的 root 帳號限定只能由本機端 localhost 連到資料庫。
那要怎麼解決這種狀況呢?解決方法有兩種:
  1. 把 root 的權限開放,讓他也能從遠端連!
  2. 新建一個帳號,讓他只有所要連接的資料庫的權限,只要是非 root 帳號都可以從遠端連。
接下來針對兩種解決方法做分析,
第一種方法有點自找麻煩,就已經因為安全性的問題要把 root 帳號綁在 localhost 了,
你竟然還要找死把權限開放,如果不是什麼程式已經寫死的問題的話,
真的很不建議這麼做。
就算真的要這麼做,也請把要開放的 remoteIP 範圍設定好,
透過限定適當的 IP 範圍,也可避免直接被外部攻擊。
要開放帳號連接權限的方式如下:
  • shell> mysql --user=root -p  
  • 輸入密碼
  • mysql> use mysql  
  • mysql> GRANT SELECT,INSERT,UPDATE,DELETE ON [db_name].* TO [username]@[remoteIP] identified by '[password]';   
  • mysql> FLUSH PRIVILEGES;
其中幾項參數名稱的說明如下:
  • db_name:想要從遠端連接的資料庫名稱
  • username:就是 username 嘛,若你是遇上這個問題,這個通常就是 root 囉!
  • remoteIP:用戶或程式所在的遠端 IP,這邊可以使用 % 來開放某個網段,如:'192.168.%.%',注意兩個單引號是一定要加的喔!
  • password:就密碼啦,最好也加上兩邊的單引號。
  • 最後的最後記得加上 ; 因為這是SQL語法。
以上的方法是參考自:
第二種方法則是新建一個帳號,
方式可以用 MySQL 的圖形介面或是參考以下的教學:
  • shell> mysql --user=root -p  
  • 輸入密碼
  • mysql> use mysql  
  • mysql> GRANT ALL ON db_name.table_name TO newUserName@remoteIP identified by 'password';
  • mysql> FLUSH PRIVILEGES;
語法和前一個很像,db_name.table_name 可改成 db_name.* 甚至是 *.*,
這樣就能產生一個新的使用者且對 ALL (SELECT, UPDATE, DELETE......) 的操作有權限了。

以上方法參考自:
  1. MySQL 新增使用者與權限設定 (筆記)
  2. [技術文章] MySQL 指令、語法及管理
不管使用了哪種方法,現在應該都可以正常地連上資料庫了,
無論是哪種方法,記得盡量把權限和 IP 的範圍縮小,
以達到最高的安全性喔!

關鍵字:MySQL, Java, 錯誤, 無法連接, 連不上, Host, 遠端, IP
參考資料:


更多精選推薦文章

0 意見 :