今天在虛擬機(jī)ubuntu上折騰了一晚上mysql,然后試著用java連接,搞了很久都沒成功,但是同學(xué)配好的debian上卻連接成功了,也就是說我的配置有問題。折騰了很久,最后還是通過理解異常信息來大致猜測(cè)。
遠(yuǎn)程連接是輸入mysql所在主機(jī)的ip和端口來確定主機(jī)的邏輯地址,再通過用戶和密碼來確定登錄哪個(gè)用戶。比如:
string url = jdbc:mysql://192.168.183.134:3306/mysql;
就是先在網(wǎng)絡(luò)層連上ip為192.168.183.134的主機(jī),再去連接這臺(tái)主機(jī)的具體端口3306(傳輸層),然后傳輸層達(dá)成連接后,在應(yīng)用層用賬號(hào)密碼登陸,訪問mysql數(shù)據(jù)庫(kù):
connection conn = drivermanager.getconnection(url, user, password);
一開始我懷疑是否端口設(shè)置問題,然后在/etc/mysql/my.cnf上加上了port=3306,結(jié)果還是連不上,顯示端口拒絕訪問。
然后用命令$netstat -apn 找到端口3306的一條信息:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* listen
仔細(xì)一看,這里提供的ip是127.0.0.1,結(jié)合socket編程的經(jīng)驗(yàn),一般要接收任意主機(jī)發(fā)送的消息時(shí),ip會(huì)設(shè)置為0.0.0.0,而127.0.0.1(回送地址)是否意味著只能本地訪問?然后打開同學(xué)的debian查看他的mysql占用端口時(shí),果然如我所想:
tcp 0 0 0.0.0.0:21 0.0.0.0:* listen
經(jīng)過一番搜索后,得出結(jié)論是mysql默認(rèn)只提供給本地訪問,而要開啟遠(yuǎn)程訪問功能需要額外設(shè)置。從安全的角度看這也是合理的。
設(shè)置方法還是修改配置文件/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.0utf8相關(guān)的是之前本地錄入漢字?jǐn)?shù)據(jù)時(shí)發(fā)現(xiàn)插入失敗,漢子和varchar不兼容,在mysql模式下輸入status查看的狀態(tài)時(shí):
server characterset: latin1
db characterset: latin1
client characterset: utf8
conn. characterset: utf8經(jīng)過這個(gè)修改后,前2個(gè)字符集就全變成了utf8,支持中文。其他的修改就如同我所說的,綁定ip為0.0.0.0,即接收任意地址的主機(jī)的連接,端口綁定3306。
但是依然不能訪問,只不過錯(cuò)誤信息發(fā)生了改變,這次很明確了,是顯示用戶沒有連接權(quán)限,也就是說用戶只能本地連接,依然搜索資料后得出解決方案如下:
1.新建用戶遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)
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用戶允許遠(yuǎn)程連接mysql數(shù)據(jù)庫(kù)
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允許遠(yuǎn)程連接的方法