遠端連線 Mysql 失敗的解決方法

roc_guo發表於2023-11-10

今天在虛擬機器Ubuntu上折騰了一晚上mysql,然後試著用java連線,搞了很久都沒成功,但是同學配好的Debian上卻連線成功了,也就是說我的配置有問題。

折騰了很久,最後還是透過理解異常資訊來大致猜測。

遠端連線是輸入mysql所在主機的IP和埠來確定主機的邏輯地址,再透過使用者和密碼來確定登入哪個使用者。比如:

String url = "jdbc:mysql://192.168.183.134:3306/mysql";

就是先在網路層連上IP為192.168.183.134的主機,再去連線這臺主機的具體埠3306(傳輸層),然後傳輸層達成連線後,在應用層用賬號密碼登陸,訪問mysql資料庫:

Connection conn = DriverManager.getConnection(url, user, password);

一開始我懷疑是否埠設定問題,然後在/etc/mysql/my.cnf上加上了port=3306,結果還是連不上,顯示埠拒絕訪問。

然後用 $netstat -apn 找到埠3306的一條資訊:

tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN

仔細一看,這裡提供的IP是127.0.0.1,結合socket程式設計的經驗,一般要接收任意主機傳送的訊息時,IP會設定為0.0.0.0,而127.0.0.1(回送地址)是否意味著只能本地訪問?然後開啟同學的Debian檢視他的mysql佔用埠時,果然如我所想:

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

經過一番搜尋後,得出結論是mysql預設只提供給本地訪問,而要開啟遠端訪問功能需要額外設定。從安全的角度看這也是合理的。

設定方法還是修改配置檔案/etc/mysql/my.cnf

[client]
default-character-set=utf8
[mysqld]
default-storage-engine=INNODB
character-set-server=utf8
collation-server=utf8_general_ci
port=3306
bind-address=0.0.0.0

utf8相關的是之前本地錄入漢字資料時發現插入失敗,漢子和VARCHAR不相容,在mysql模式下輸入STATUS檢視的狀態時:

Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8

經過這個修改後,前2個字符集就全變成了utf8,支援中文。其他的修改就如同我所說的,繫結IP為0.0.0.0,即接收任意地址的主機的連線,埠繫結3306。

但是依然不能訪問,只不過錯誤資訊發生了改變,這次很明確了,是顯示使用者沒有連線許可權,也就是說使用者只能本地連線,依然搜尋資料後得出解決方案如下:

1.新建使用者遠端連線mysql資料庫
mysql> grant all on *.* to team@'%' identified by 'java123' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2.支援root使用者允許遠端連線mysql資料庫
mysql> grant all on *.* to 'root'@'%' identified by 'cplusplus' with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

參考:配置mysql允許遠端連線的方法
遠端連線 Mysql 失敗的解決方法遠端連線 Mysql 失敗的解決方法


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2994614/,如需轉載,請註明出處,否則將追究法律責任。

相關文章