Mysql 遠程訪問控制--10038問題的解決

幫朋友維護一個php的網站,用Navicat連接ECS虛擬機的Mysql服務一直失敗,出現

`Can't connect to mysql server on xxx.xxx.xxx.xxx(10038)`

的問題,加上之前對Mysql的配置一直不是很熟悉,碰到過很多的坑,就記一下,免得以後還得各種查。

雖然Mysql也是Oracle的,但是Mysql的權限管理和Oracle還不一樣,之前在創建Mysql的用戶的時候,以爲和Oracle的一樣,用了

Create user XX identified by xxxx 

這樣的語句,然後再Mysql裏各種賦權限,結果連本地mysql客戶端都連不上,很鬱悶。後來,偶然的機會,才知道,原來一般在實際使用中,Mysql的授權和用戶創建時一塊兒進行的,直接一句話就搞定了:

GRANT ALL PRIVILEGES ON *.* TO 'XXX'@'%' IDENTIFIED BY 'xxxx' WITH GRANT OPTION

剛好這句話,還解決了另外一個問題,就是那個“%”。它允許XXX用戶遠程連接Mysql服務,而如果@後邊的那個值是 localhost 的話,那XXX用戶就只能在服務器上連接Mysql服務了。如果用戶不是你建的,那就得去mysql的user表中將該用戶的host改爲%就行了。

好了,用戶算是創建完了,接下來,就是對Mysql服務進行配置了。打開/etc/my.cnf,將選項skip-networking註釋掉(注:有的資料上說還要講bind-address設置成127.0.0.1,我的配置文件中反正沒看到這句話,也就沒有設置。這個選項是用來設置可以進行外部訪問Mysql的IP,有一個過濾的作用,也沒有必要設置)。

mysqldconf

下面,我們就來看看這個選項是幹嘛的。這個選項上方有它的說明,大致的意思是這樣的:不監聽TCP/IP端口;本選項可以作爲一個安全增強以確保,所有到Mysqld即Mysql服務的連接都是通過本機進行的;所有與Mysql進行到通信都必須經過Unix sockets和命名管道。現在明白了吧。

回來我們在my.cnf中往上找,看到在[mysqld]組的配置中,開啓了3306的端口和一個Unix socket文件,分別用於遠程連接和本地連接。如果不將skip-networking註釋掉,我們就只能通過服務器本地進行連接了,而這對於開發和維護都相當的不方便。

至此,問題就算解決一半了,然後,還得去看看防火牆有沒有屏蔽掉3306端口。Centos系統的話,在 /etc/sysconfig/iptables 中,有沒有這樣一句話:

A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

有的話就不用管了,沒有就加上。然後重啓防

service iptables restart

就是重啓Mysql的服務了:

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