不知道之前對 mysql 數據庫做過什麼操作,我發現服務器在訪問 mysql 數據庫的時候,
在 hibernate 連接數據庫的配置裏面,只有填寫內網 ip (192.168.1.*)才能正常地連接到數據庫。
今天有空準備把這個問題給解決一下,首先回顧一下已經掌握的東西:
在 OS X 的 Terminal 中鍵入 mysql -uroot -p123456 連接到數據庫。連接成功,沒問題。
然後,show databases 查看所有數據庫,選擇使用名爲 mysql 的系統數據庫(use mysql)
鍵入 show tables 查看當前數據庫中的所有表,其中有一張叫 user 的表吸引了我的注意,
事實上這就是 mysql 管理用戶權限,賬號密碼等數據的表了。
desc user 列出該表的所有字段信息,其中的 Host, User, Password 這三個字段應該引起我們的重視。
當 web 服務器連接數據庫的時候,是與上述的三個字段息息相關的。
之前應該有說過更改 root 密碼的方法,其中的一個方法就通過如下兩條 sql 語句來完成的:
update user set Password=PASSWORD('123456') where User='root';
flush privileges;
上面只是涉及到了用戶名和密碼兩項,其實 Host 也是很重要的!今天我就被上了一課。
前面不是說我只有用內網 ip 才能連接到服務器的事情麼,那個純屬意外,
因爲用戶的密碼在查詢表的結果集中都是以加密的形式呈現的,
所以讓我誤以爲 [email protected] 的密碼就是我設置過的密碼 123456,
但實際上並不是這樣的,密碼並不是 123456,所以我在用 127.0.0.1 連接數據庫的時候會失敗,
其實很簡單,只需要執行如下的 sql 語句把 [email protected] 對應的密碼修改回來就能正常連接了:
update user set Password=PASSWORD('123456') where User='root';
flush privileges;
但問題並沒有這麼簡單,我執行 select Host,User,Password from user 命令以後,得到了如下的結果集:
% root *SDFWEFWF...
kodeloves-Mac-mini.local root *AFEWFG...
127.0.0.1 root*AFEWFG...
...
我的第一直覺就是,第一行和第三行有點兒矛盾,
兩條記錄的用戶名都是 root,但密碼卻是不一樣的,這肯定有問題!
於是我果斷地執行 delete from user where User='root' and Host='%' 將第一條記錄給咔嚓掉了。
然後我用 web 服務器再次嘗試連接 mysql 數據庫(以 127.0.0.1 連接),還是失敗
(其實不是因爲存在 % 這條記錄的原因所致,而是如前文所述我輸錯了密碼所致)
失敗就失敗,沒什麼大不了,繼續試唄。可這時我驚奇地發現用 mysql -uroot -p123456 竟然被拒絕連接了。
坑爹了,以我來看我根本就沒有動過賬號密碼啊,怎麼就被拒絕連接了呢...
思來想去覺得可能是因爲刪除了 % 那條記錄所致(% 可能是匹配除 localhost, 127.0.0.1 以後的其他所有 ip 的)
這樣的話還不算難辦,在網上查了一下,用 mysql -h127.0.0.1 -uroot -p123456 順利地連進了數據庫。
有了前面的教訓,看來 % 這條記錄還是不能省略,還是把它給補上來吧:
手動插入?尼瑪 user 表有幾十個字段,手寫太累了。
怎麼辦呢?想了半天想到一個好辦法,把 mysql.user 這張表導出爲 sql 文件,
再從裏面找出相關的插入語句,稍作修改執行一下就行了。下面是網上找到的相關資料:
/usr/local/mysql/bin/mysqldump -uroot -p123456 mydb mytb < /opt/mytb.sql
解釋:
mysqldump 備份命令
-uroot root用戶
-p123456 密碼爲123456
mydb 表所在的數據庫mydb
mytb 將要導出的表mytb 如果不指定具體表,就導出整個數據庫
> /opt/mytb.sql 備份到mytb.sql中
還原:
/usr/local/mysql/bin/mysql -uroot -p123456 mydb > /opt/mytb.sql
至此,就算是愉快的結束了,我獲得瞭如下的福利:
web 服務器以 192.168.1.*、127.0.0.1、localhost 都能夠連接到數據庫了。
另外,又可以像之前一樣僅用 mysql -uroot -p123456 在控制檯連入數據庫了。
最後,還是挺好奇 mysql 命令默認是以怎樣的 Host 連接服務器的(可以肯定不是 127.0.0.1)