MySQL 複習筆記III

不知道之前對 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 文件,

再從裏面找出相關的插入語句,稍作修改執行一下就行了。下面是網上找到的相關資料:

mysql導出(備份)單張表,mysql備份指定表

/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)


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