天天看點

MySQL通路受限的問題分析

今天幫同僚看了一個MySQL的連接配接問題,蠻有意思,有兩個使用者,一個使用者連接配接正常,另外一個連接配接抛錯。

開發同學提供的錯誤日志如下:

{resin-33} java.net.SocketException

 {resin-33} MESSAGE: java.net.ConnectException: Connection timed out

。。。

 {resin-33} java.net.SocketException: java.net.ConnectException: Connection timed out

 {resin-33}    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)

 {resin-33}    at com.mysql.jdbc.MysqlIO.(MysqlIO.java:284)

 {resin-33}    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2706)

 {resin-33}    at com.mysql.jdbc.Connection.(Connection.java:1485)

可以看到連接配接資料庫的時候抛出了逾時異常,但是他們使用telnet xxxx 3306端口是沒問題的,顯然問題的方向看起來在權限了。

當然從error.log裡面也看到了不少的警告資訊,看起來他是在解析這個IP資訊的時候出了問題。

[Warning] IP address '10.127.xxxx' could not be resolved: Temporary failure in name resolution

[Warning] IP address '10.127.xxxx' could not be resolved: Temporary failure in name resolutio

那麼當時的操作大體是怎麼樣呢,因為這個操作已經很長時間了,我們就簡單複現下這個問題,首先使用grants的方式建立使用者,當然還是推薦create user的方式。

> grant usage on *.* to webadmin@'10.127.xxx.xxx' identified by 'testmysql.com';      

Query OK, 0 rows affected, 1 warning (0.00 sec)

這個時候檢視show  grants的結果,是有usage的權限的,就跟oracle裡面的connect角色差不多,也就是最起碼你能連接配接到資料庫。

> show grants for webadmin@'10.127.xxx.xxx';

+---------------------------------------------------+

| Grants for [email protected]|

| GRANT USAGE ON *.* TO 'webadmin'@'10.127.xxx.xxx' |

1 row in set (0.00 sec)而後面的就是通路權限了,比如開發同學不知道哪個權限合适,說你給我所有的權限吧,于是DBA說好,就寫下了*.*,然後問題就來了。

> GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'10.127.xxx.xxx';使用show grants檢視權限,發現原來的usage權限竟然沒了。

+------------------------------------------------------------+

| GRANT ALL PRIVILEGES ON *.* TO 'webadmin'@'10.127.xxx.xxx' |

1 row in set (0.00 sec)這權限去哪裡了呢,我在MySQL 5.5, 5.7版本中都進行了同樣的測試,發現如果使用*.*的權限方式,usage的權限都會消失,這個問題還是和一些配置有關,暫時在bug清單中沒有找到比對的描述。

其實一種修複就是賦予權限的時候,要制定資料庫名,比如資料庫test,那麼就使用grants xxxxx on test.* to webadmin@'xxxx';

當然能夠模拟出這個問題來,解決就容易的多了,開發同學給我提供了這個使用者的密碼,我做了簡單備份,開始重新配置權限,

create user ,grant [privilege] to test.* to webadmin@'xxxx';

但是很快又收到了開發同學的資訊說,程式的錯誤變了,現在是這個錯誤。

{main} Attempted reconnect 3 times. Giving up.

 {main} at com.mysql.jdbc.Connection.createNewIO(Connection.java:2781)

 {main} at com.mysql.jdbc.Connection.(Connection.java:1485)

 {main} at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)

 {main} at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)

 這個錯誤讓我看起來有些迷茫,我說實在不行就重新開機大法吧,但是重新開機之後依然不行,最後又開始定位,發現可能和密碼有關,于是我按照備份的加密串重新配置權限,就沒問題了,說明開發同學提供給我的密碼是有問題的,而幸好有了備份,這個問題才能在這種摸着石頭過河的情況繼續前進。

個人微信公衆号,歡迎掃碼關注

MySQL通路受限的問題分析