1. 程式人生 > >linux上mysql訪問:Access denied for user 'agtipay'@'iZm5ebiyb4f90ga9xiycgsZ' (using password: YES)

linux上mysql訪問:Access denied for user 'agtipay'@'iZm5ebiyb4f90ga9xiycgsZ' (using password: YES)

公司的聚合支付測試環境出了一個問題(agtipay使用者訪問資料的時候出現如題錯誤),快搞死我兩天時間(原諒技術不才),如題。首先明確一下問題:

        1、訪問拒絕,說明資料庫連線這裡有問題,資料庫連線訪問拒絕,要麼是沒有相應的用戶操作許可權,要麼是賬號密碼錯誤

        2、iZm5ebiyb4f90ga9xiycgsZ。這個引數說明。首先這個引數是系統/etc/hosts下面配置的ip的對映引數。

            3、資料庫訪問使用者含:root  以及agtipay。

        4、mysql安裝在本機的linux作業系統上面。

再次明確一下問題的奇怪之處:linux本機上只要用主機IP地址訪問資料庫mysql,就無法連線,只能通過localhost連線。而同樣的IP地址形式的JDBC連線從遠端主機(使用者root以及agtipay)卻能正常連線。JDBC也正常.

後面再次排查了一下,明確錯誤原因:遠端主機能連線,說明mysql的遠端連線已經開啟,訪問是正常的,這肯定沒問題。伺服器本機配置了ip對映在/etc/hosts檔案, 在該檔案中,機器的ip被DNS系統解釋成主機名iZm5ebiyb4f90ga9xiycgsZ。

jboss5資料來源配置如下:

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
  <local-tx-datasource>
    <jndi-name>ibs/db/mysql</jndi-name>
    <connection-url>jdbc:mysql://ip
:埠/pay?useUnicode=true&amp;characterEncoding=gbk&amp;useOldAliasMetadataBehavior=true&amp;autoReconnect=true</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>agtipay</user-name> <password>rklxi4PbXA8UmtrB</password> <exception-sorter-class
-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name> <background-validation>true</background-validation> <background-validation-millis>10000</background-validation-millis> <new-connection-sql>select 1</new-connection-sql> <check-valid-connection-sql>select 1</check-valid-connection-sql> <min-pool-size>10</min-pool-size> <max-pool-size>10</max-pool-size> <blocking-timeout-millis>5000</blocking-timeout-millis> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources>

 

而在mysql的許可權管理中, iZm5ebiyb4f90ga9xiycgsZ被配置成只能用root登入。所以導致應用中的agtipay使用者無法連線。而遠端主機mysql許可權本身沒有配置agtipay主機名, 所以需要通過mysql的進行許可權檢查配置給agtipay。

查詢許可權表SQL如下:

SELECT HOST ,USER FROM mysql.user

 

 解決辦法:

 執行授權語句(授權語句的解釋請自行百度):

GRANT ALL PRIVILEGES ON *.* TO 'agtipay'@'iZm5ebiyb4f90ga9xiycgsZ' IDENTIFIED BY '相應使用者ahtipay的密碼' WITH GRANT OPTION;
 FLUSH PRIVILEGES;

授權語句說明

引數說明: ALL PRIVILEGES表示賦給遠端登入使用者的許可權,ALL PRIVILEGES表示所有的許可權,你也可以單獨或組合賦select,update,insert,delete許可權;*.*:第一個*表示要賦權的資料庫名,*當然表示全部資料庫了,第二個*表示資料庫下的表名,同理,*表示全部表,像我這樣的懶人當然就直接用*.*了,反正都是自己開發用

agtipay表示要賦權的使用者;iZm5ebiyb4f90ga9xiycgsZ表示遠端登入的IP,如果要限制登入IP的話,這裡就添你允許登入的IP,比如192.18.1.99等,%表示不限制IP,相應使用者ahtipay的密碼是使用者遠端登入的密碼。就這麼簡單。這句執行以後再執行FLUSH PRIVILEGES,搞定!

 

授權後,agtipay使用者也能通過IP從本地連線, 應用恢復正常。