在服務器上面我們經常需要去使用mysql,有些童鞋剛剛配置好了服務器,想在本地的一些圖形化軟件去連接mysql得到更直觀的表格顯示,此時很可能不允許連接,為了探究為什么連接失敗,在這里我會對mysql里的mysql數據庫的user表進行分析,相信看完之后,大致的權限以及主機的連接問題,都會迎刃而解
1.問題分析
基本每個mysql都會有名為mysql的數據庫,里面存放的是mysql的核心東西,其中user表里面就有mysql連接的用戶信息,里面的字段有如下
1.Host (允許連接的主機,%代表全部主機可以連接)
2.User (連接的用戶名)
3.password (連接的密碼,密碼用mysql自帶的password函數加密)
4.Select_priv (是否允許查詢,Y表示允許,N表示拒絕)
5.Alter_priv (是否允許插入數據,Y表示允許,N表示拒絕)
剩下都是一堆權限,和Select_priv的設置一樣,其實組合起來就很容易理解了,處在host地址的用戶User可以通過密碼password訪問數據庫對應的權限。
舉個粟子:例如有以下記錄(省略部分權限字段)
+------+-------------------------------------------+--------------+-------------+
| user | password | Host | Select_priv |
+------+-------------------------------------------+--------------+-------------+
| root | *B16BCB720468FF0ED1F0A3A179FFDC66F044CC5C | localhost | Y |
ip地址在localhost的用戶root可以通過password函數加密之后密碼*B16BCB720468FF0ED1..為訪問數據庫,並可以使用Select_priv權限 。
相信看到這里你已經明白了為什么,怎么不能連接mysql呢?其實就是你的條件沒有符合user表里的記錄,只要符合 用戶名(user),密碼(password),主機地址(Host),你就能訪問數據庫,至於權限,那就得看后面對應的字段。
至於多條記錄之間同一個用戶是取交集還是取最新一條,我還沒測試過,我出問題的時候查詢數據庫是有以下記錄。
+------+-------------------------------------------+--------------+-------------+
| user | password | Host | Select_priv |
+------+-------------------------------------------+--------------+-------------+
| root | *B16BCB720468FF0ED1F0A3A179FFDC66F044CC5C | % | Y |
| root | | localhost | N|
那時候遠程訪問需要密碼,但是可以全部權限可以訪問,但是在本地用命令行mysql -uroot -p密碼 連數據庫輸了密碼就錯,一狠心不輸入密碼,居然可以了,但是什么權限都沒有。一查數據庫看到上面的數據頓時知道出什么事了...
最后一條記錄localhost限制了訪問權限,之后我一樣在本地訪問,但是指定了一下ip地址,讓mysql認為我是127.0.0.1,就可以訪問全部權限了...
2.解決問題
相信看到很多人就知道怎么做了,如果要遠程訪問數據庫,只需要把擁有全部權限的root賬號對應的記錄的Host字段改為%就可以了。在我這里數據庫顯示是這樣子(忽略若干權限...一般root賬戶如果后面Select_priv為Y,其他一般都全為Y)。
mysql> select user,Host,password,Select_priv from user;
+------+--------------+-------------------------------------------+-------------+
| user | Host | password | Select_priv |
+------+--------------+-------------------------------------------+-------------+
| root | localhost | *B16BCB720468FF0ED1F0A3A179FFDC66F044CC5C | Y |
| root | iz289q95684z | | Y |
| root | 127.0.0.1 | | Y |
| root | ::1 | | Y |
| | localhost | | N |
| | iz289q95684z | | N |
+------+--------------+-------------------------------------------+-------------+
只要把第一條記錄改為的Host改為%就好了
以下是命令:
update user set Host = '%' where Host = 'localhost' & user = 'root'; flush privileges;
以上第一條命令為修改允許訪問的主機地址
第二條命令為刷新權限
只要執行上面的兩條命令就能遠程訪問服務器。當然啦,具體情況具體分析,可能你本地的數據庫記錄和我的不同,那么你只需要按着上面的介紹去調整就好了,最后別忘了執行flush privileges刷新一下。
3.特殊情況
如果你還是沒有解決問題,遠程連接還是連接不上,那么很有可能是你的mysql配置文件綁定了本地,你可以找到本地的mysql配置文件去進行修改,mysql配置文件叫my.cnf,如果找不到路徑可以用locate my.cnf去查找,在我這里就是/etc/mysql/my.cnf。在里面你會看到一系列的mysql配置信息,找到里面的bind-address,這個就是萬惡之源。把他注釋掉(在前面加#)再重啟mysql就OK了。
萬惡的mysql,終於看到連接成功頁面了。。。