1. 程式人生 > >Mysql 遠端訪問控制--10038問題的解決

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。