1. 程式人生 > >java連線MySQL資料庫時常見故障問題的分析與解決

java連線MySQL資料庫時常見故障問題的分析與解決

初學的mysql經常會碰到mysql無法連線的錯誤。收集的這樣問題的現象和原因。  


歸納如下:

0.更改mysql root賬號密碼

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

1.故障現象 : 無法連線 mysql  

============================================================================= 錯誤資訊1 :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:YES)
錯誤資訊2  :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:NO)  下面,首先分析說明這兩種錯誤資訊分別在什麼情況下會出現: 描述:使用mysql連線命令或連線工具,對遠端資料庫進行連線時,可能會出現以上兩種錯誤資訊,下面以命令的連線方式進行說明。 當使用mysql裡連線命令時,若帶-p引數且指明密碼,或帶-p引數不指明密碼,但在下一步輸入密碼時有字串輸入,則返回的是 “錯誤資訊1”,若不帶-p引數,或帶-p引數但在下一步輸入密碼時,不輸入任何字元,則返回的是“錯誤資訊2”,如下所示:

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -proot    //帶-p引數,並指明密碼
ERROR 1045 (28000): Access denied for user 

'root'@'192.168.8.123' (using password: YES)

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -p    //帶-p引數,在下一步進行密碼輸入
Enter password:     //有字串輸入
ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88    //不帶-p引數
ERROR 1045 (28000): Access denied for user 

'root'@'192.168.8.123' (using password: NO)

C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -p   //帶-p引數,在下一步進行密碼輸入
Enter password:    //無字串輸入
ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO)

上面的對比可總結出一點,使用mysql命令進行登入時,若有密碼輸入行為並輸入了字元,則驗證出錯後,則返回的錯誤提示中,對於 (using password: ?)中?的關鍵字,則返回的是YES,若沒有密碼輸入行為,或無密碼字元輸入,則返回的是NO。

除上面的實驗對比,還進行了如下的登入對比操作,並記錄了他們所返回錯誤提示型別,對上面的總結進行驗證:

1.使用存在的使用者,不輸入密碼

ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO)

2.使用不存在的使用者,不輸入密碼

ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: NO)

3.使用存在的使用者,且輸入密碼正確

ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

4.使用存在的使用者,但輸入密碼不正確

ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

5.使用不存在的使用者,但輸入資料庫中存在的某一個密碼

ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

6.使用不存在的使用者,且輸入資料庫中不存在的一個密碼

ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123' (using password: YES)

總結:對於 ERROR 1045 (28000): Access denied for user 'root'@'192.168.8.123'  此類錯誤返回時, (using password: ?)中?的

關鍵字是YES還是NO,關鍵不在於使用者是否存在,密碼是否正確,它的結果取決於登入時,使用者對於密碼有沒有字串的輸入,如果沒有,MySQL資料庫驗證後,若出錯返回此類資訊,則應是 (using password: NO),若使用者對密碼有字串的輸入,返回的則是

(using password: YES)。

下面分析這類 ERROR 1045 (28000): Access denied for user'usera'@'localhost'  錯誤出現的原因:

原因1 : 客戶端遠端訪問的使用者賬號並未建立


檢查 :

以管理員ROOT登入後,show grants for 'user'@’IP‘; 或者 select user from mysql.user; 確認使用者賬號是否存在。

通過MySQL 5.6 Command Line 的命令列輸入下列命令

mysql> show grants for 'jtsec'@'192.168.8.123';
ERROR 1141 (42000): There is no such grant defined for user 'jtsec' on host '192.168.8.123'
mysql>
返回資訊:ERROR 1141 (42000): There is no such grant defined for user 'jtsec' on host '192.168.8.123' 說明,沒有jtsec使用者,或者沒有對jtsec使用者進行在192.168.8.123遠端訪問的授權。 mysql> select user,host from mysql.user;
+-------+---------------+
| user  | host          |
+-------+---------------+
| root  | localhost     | 
+-------+---------------+
1 rows in set (0.00 sec)

mysql> 

關於user記錄數只有一條,是root,並沒有jtsec相關的記錄,說明沒有資料庫中沒有jtsec這個帳號。

處理 :建立使用者賬號。

mysql>  grant all privileges on *.* to 'jtsec'@'192.168.8.123' identified by 'jtsec' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'jtsec'@'192.168.8.123';
+---------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                                              |
+---------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'jtsec'@'192.168.8.123' IDENTIFIED BY PASSWORD '*0B4AB716B6BE11F89101577836F3016D8EEAA217' WITH GRANT OPTION | 
+---------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select user,host from mysql.user;
+-------+---------------+
| user  | host          |
+-------+---------------+
| jtsec | 192.168.8.157 | 
| root  | localhost     | 
+-------+---------------+
2 rows in set (0.00 sec)

mysql> 

原因2 : 使用者賬號存在,但未對其所在的客戶端的IP進行遠端訪問授權允許

檢查 : 以管理員ROOT登入後 show grants for 'user'@'IP'; mysql> show grants for 'root'@'192.168.8.123';
ERROR 1141 (42000): There is no such grant defined for user 'root' on host '192.168.8.123'
mysql>
返回資訊:ERROR 1141 (42000): There is no such grant defined for user 'root' on host '192.168.8.123' 說明,沒有root使用者(因為是MySQL超級使用者所以排除此種可能),或者沒有對root使用者進行在192.168.8.123遠端訪問的授權。 我們來對比一下看,root使用者本地訪問的許可權,則可查出: mysql> show grants for 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) 或者直接查詢mysql的user使用者表select user,host from mysql.user;,其中記錄了每一個使用者的許可權資訊 mysql> select user,host from mysql.user;
+-------+---------------+
| user  | host          |
+-------+---------------+
| root  | localhost     | 
+-------+---------------+
1 rows in set (0.00 sec)

mysql>

關於user值為root的記錄數只有一條,且host值為localhost,說明root使用者只能在本地訪問資料庫。


處理 :進行root使用者的遠端訪問授權,可以授權到指定的客戶端IP,也可以授權為所有IP都可訪問(host值為%)。

授權為所有IP都使用使用者root,密碼root,來遠端訪問資料庫

mysql> GRANT ALL PRIVILEGES ON *.* TO'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

再次進行授權的查詢

mysql> show grants for 'root'@'%';
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                                              |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec) 再次查詢授權表記錄 mysql> select user,host,password from mysql.user;
+-------+---------------+-------------------------------------------+
| user  | host          | password                                  |
+-------+---------------+-------------------------------------------+
| root  | localhost     | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 
| root  | %             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 
+-------+---------------+-------------------------------------------+
2 rows in set (0.00 sec) mysql> 

原因3 : 使用者賬號授權訪問的密碼不正確

檢查 :以管理員ROOT登入後, select user,host,password  from mysql.user; mysql> select user,host,password from mysql.user;
+-------+---------------+-------------------------------------------+
| user  | host          | password                                  |
+-------+---------------+-------------------------------------------+
| root  | localhost     | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | 
| root  | %             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | jtsec | 192.168.8.123 |                                           |
| jtsec | 192.168.8.123 | *0B4AB716B6BE11F89101577836F3016D8EEAA217 | 
+-------+---------------+-------------------------------------------+
4 rows in set (0.00 sec) mysql> 
根據查詢結果可以看出來,root賬戶的本地訪問和遠端訪問密碼一樣。 而jtse賬戶在192.168.8.123這個IP上,遠端訪問資料庫的密碼有兩個,其中一個為空(第三條記錄)。 也就是說在IP為192.168.8.123的客戶機上,使用jtsec這個賬戶遠端訪問資料庫,合法的密碼有兩個可以選擇: 一個是不輸入密碼(密碼為空),另一個是*0B4AB716B6BE11F89101577836F3016D8EEAA217(經過加密的), 其餘的輸入,都是錯的。
處理 :使用正確的訪問密碼進行訪問即可。 ===================================================================================

2.錯誤資訊 :ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.8.88' (10065)

原因  :MySQL伺服器上防火牆的阻斷 檢查 :在Linux下檢視iptables規則,看是否未對MySQL資料庫預設通訊埠3306進行放行 處理 : 新增相應的放行規則 自己在   /etc/sysconfig/iptables  里加了一下程式碼:
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

或嘗試關掉防火牆

    chkconfig ip6tables off
    chkconfig iptables off

問題描述:  C:\Documents and Settings\Administrator>mysql -uroot -h 192.168.8.88 -proot
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.8.88' (10065) C:\Documents and Settings\Administrator> ===================================================================================

3.錯誤資訊 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (10061)

原因 : mysqld資料庫服務沒有啟動。
檢查 :在windows 的工作管理員,或者 unix/linux 下 ps -aux | grep mysql 看一下。確認服務已經啟動。
處理 :啟動mysqld 服務
===================================================================================

4.錯誤資訊 :ERROR 1130: Host xx.xx.xx.xx is not allowed to connect to this MySQL server 

原因 : mysql伺服器沒有賦予此客戶端遠端連線的許可權。  
檢查 :在mysql伺服器本地查詢mysql庫裡user表對應的host是否包含客戶端機器的IP(%為不限制IP允許遠端連線)。  
處理 :修改mysql庫下的user表:update user set host = '%' where user ='XXX';flush privileges;
===================================================================================

5.錯誤資訊 :ERROR 1045 (28000): Access denied for user 'usera'@'localhost' (using password:NO)

原因 : 使用者賬號並未建立,遠端登入時登入指令未直接包含密碼項 檢查 :以管理員ROOT登入後,show grants for 'usera'@'localhost'; 或者 select user from mysql.user; 確認使用者賬號是否存在。
處理 :建立使用者賬號。
===================================================================================

6.錯誤資訊 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (10061)  

原因 : mysqld 客戶端與服務端埠不一致。  
檢查 :在my.ini 設定下服務埠 這種情況特別是客戶都與遠端伺服器埠不一致 很容易出現的問題
處理 :啟動mysqld 服務  
===================================================================================

7.錯誤資訊 :ERROR 2002 (HY000): Can't connect to local MySQL server server through socket '/var/lib/mysql/mysql.sock'(111) 

原因 : mysqld的mysql.sock沒在相應的位置。
處理 :   1.先檢視/etc/rc.d/init.d/mysql status 看看是否啟動
  2.改許可權 chown -R mysql:msyql /var/lib/mysql
  3.修改/etc/my.cnf (注意:先停資料庫)
  [mysqld]
  datadir=/usr/local/mysql/data
  socket=/var/lib/mysql/mysql.sock
  [mysql.server]
  user=mysql
  basedir=/usr/local/mysql
  [client]
  socker=/var/lib/mysql/mysql.sock
  4.啟動資料庫
===================================================================================


常用檢查步驟。

1. PING hostname 或 PING 189.xx.xx.xx 確認伺服器IP層通訊沒有問題。如果PING通則繼續(2),PING不通則找網路方面專家協助。
2. TELNET hostname 3306 確認伺服器TCP層通訊沒有問題。(你的埠號可能不是3306),如通則繼續,如不通,請檢查mysqld 是否已經在執行,防火牆遮蔽了埠。
3. 檢查使用者許可權, show grants ... 或 select user,host,password from mysql.user;
===================================================================================

8.故障現象 : 本地無法 mysql -u root -p 用原來的密碼登入,但可以用無密碼,遠端必須用原密碼登入   

錯誤資訊 :ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
原因 : 未知,不知道是否mysql的新密碼控制策略
檢查 :mysql -u root 密碼空登入無問,遠端用navica mysql無密碼有問題,有密碼無問題
處理 :暫時先把本地登入的密碼去掉
版本環境:mysql Ver 14.14 Distrib 5.1.56, for debian-linux-gnu (i486) using readline 6.2 問題分析(lioncode):Start --> MySQL資料庫的使用者資訊均儲存在mysql.user表中,其中包括使用者的使用者名稱,密碼,授權的範圍(可授權登入的IP、可進行的資料庫操作的型別)等資訊, 有必要檢視一下該表中對於root使用者的相關記錄項,對於上述現象對應的查詢結果可能是這樣的: 出問題前該表中的資料如果是這樣的: mysql> select user,host,password from mysql.user;
+-------+---------------+-------------------------------------------+
| user  | host          | password                                  |
+-------+---------------+-------------------------------------------+
| root  | localhost     | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | | root  | %             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-------+---------------+-------------------------------------------+
2 rows in set (0.00 sec) mysql> 
出問題後該表中的資料可能是這樣的: mysql> select user,host,password from mysql.user;
+-------+---------------+-------------------------------------------+
| user  | host          | password                                  |
+-------+---------------+-------------------------------------------+
| root  | localhost     |                                           |
| root  | %             | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-------+---------------+-------------------------------------------+
2 rows in set (0.00 sec) mysql> 
第一條資料,解釋了,為什麼在本地無法用原來的密碼登入,但卻可以用無密碼登入成功。 原本,本地登入的密碼和遠端登入的密碼是一樣的,都為*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B (加密後的), 但是,由於某種原因,本地登入的密碼被清空了,所以用原來的密碼就不能登入了。 第二條資料,解釋了,為什麼遠端必須用原密碼登入。 root使用者本地登入密碼的設定和root使用者遠端登入密碼的設定,分別是兩條不同的資料,所以本地登入的密碼被改,並不影響遠端登入的密碼。 <-- End
==================================================================================
故障現象 : 無法連線 mysql windows
錯誤資訊 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (10061)  
原因 : 同時開啟大量的tcp埠和而僅有一小部分短命埠時,當他們處於time_wait時期,mysql可能會跑錯埠
檢查 :在windows 預設會開啟5000個臨時埠供呼叫,而他們的生命僅僅是120s,意思是在關閉埠的時候會有120秒的延時
處理 :減少不不必要的tcp埠。
修改登錄檔
==================================================================================

 
求助,不知道大家有一樣的情況沒有?

Lost connectiion to MySQL server during query.
按照網上說的方法仍沒解決,樓主是否碰見過?

 ==================================================================================

Lost connection to MySQL server at 'reading initial communication packet', system error: 0

什麼問題??

相關推薦

java連線MySQL資料庫常見故障問題的分析解決

初學的mysql經常會碰到mysql無法連線的錯誤。收集的這樣問題的現象和原因。   歸納如下: 0.更改mysql root賬號密碼 mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpas

連線MySQL資料庫常見故障問題的分析解決

===================================================================================錯誤資訊 :ERROR 2003 (HY000): Can't connect to MySQL server on 'hostxxxxx' (

連線mysql資料庫出現1045錯誤的解決方法。

錯誤程式碼 1045 Access denied for user 'root'@'localhost' (using password:YES) 解決辦法是重新設定root使用者密碼,在Windows平臺下操作步驟如下: 1、以系統管理員身份登入到系統; 2、如果My

Java使用jdbc連線MySQL資料庫設有設定編碼

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Erreur de syntaxe près de '????' à la ligne 1     at java.base/jdk.internal.

ERROR:java連線mysql資料庫8.0以上版本

先上解決辦法: 1、修改jdbc.properties    原來是: jdbc.url=jdbc:mysql://localhost:3306/language_protection?useUnicode=true&characterEncoding=UTF

Java連線Mysql資料庫警告 Establishing SSL connection without server'

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

關於Java連線mysql資料庫驅動載入

第一步準備工作: 在官網https://dev.mysql.com/downloads/connector/j/下載mysql驅動   下載完後開啟資料夾   複製mysql-connector-java-8.0.13.jar檔案 第二步開啟e

JAVA連線MySQL資料庫

package com.coding.test; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import com.mysql.jdbc.C

Java連線SQL資料庫碰到com.microsoft.sqlserver.jdbc.SQLServerException: ')' 附近有語法錯誤。

在寫一個小東西的時候遇到了這個問題,不知道怎麼解決。 希望大神們能幫忙解決下。 com.microsoft.sqlserver.jdbc.SQLServerException: ')' 附近有語法錯誤。     at com.microsoft.sqlserv

Java 連線 MySQL 資料庫方法

Java 連線 MySQL 資料庫方法 1、傳統的連線方式 # 動態載入mysql驅動 Class.forName("com.mysql.jdbc.Driver"); 獲取連線

Android通過jdbc連線mySQL資料庫資料庫拒絕連線

原因: mysql伺服器出於安全考慮,預設只允許本機使用者通過命令列登入。 解決方案: 先通過localhost登入mysql伺服器 將mysql伺服器的mysql資料庫的user表中root使用者的Host欄位改為"%"。 操作如下: window+r 輸

【JDBC程式設計】Java 連線 MySQL資料庫基礎、入門和進階

Content: 常用的JDBC API 資料庫環境的搭建 建立資料庫連線 資料庫訪問優化 一. 常用的JDBC API 1. DriverManager類 : 資料庫管理類,用於管理一組JDBC驅動程式的基本服務。應用程式和資料

Java連線MySQL資料庫8.0以上版本遇到的坑(The new driver class is `com.mysql.cj.jdbc.Driver)

我遇到了java無法連線mysql資料庫8.0.1的問題。         報錯:Loading class `com.mysql.jdbc.Driver'. This is deprecated.

java連線Mysql資料庫失敗

問題 無法連線到資料庫:可能是因為匯入的mysql-connector-java-x.x.xx.jar版本過低,無資料庫版本不匹配。解決辦法:下載最新的包匯入,同時更改jdbc.driverClass = com.mysql.dbc.Driver為jdbc.driverClass = co

IDEA java連線mysql資料庫,實現對資料庫的增刪改查

先上程式碼: package Database_Demo; import java.sql.*; public class DataBase { public static void main(String[] args) { Connect

JAVAJAVA連線MySql資料庫

步驟:1.eclipse工具連線工具:eclipse   MySQL5.6   MySQL連線驅動:mysql-connector-java-5.1.27.jar   http://cdn.mysql.com//Downloads/Connector-J/mysql-conn

Java連線mysql資料庫攻略

  2. 連線mysql  輸入:mysql –h localhost –u root –p  輸入在安裝時已設好的密碼,就近入了mysql的命令編輯介面了。  3. 使用mysql的基本命令(在mysql命令列編輯每輸入完命令後最後一定要有分號,不然會報錯)  顯示資料庫:show databases;  

java連線MySQL資料庫 json資料前後端互動

先在下圖資料夾中匯入相應的jar包,其中第一個紅框中的是使用json資料需匯入的7個包,第二個紅框是用JDBC連線MySQL資料庫必須的包。 連線MySQL的工具類: package com.XXXXXX.util; import java.sql

java連線MySql資料庫 實現使用者登入功能

一: 準備工作        1.首先將MySql的jar包匯入專案檔案中,在進行連線。(Build path--> Add)        2.寫好配置檔案(dbinfo.properties)        3.               4.建立相應的類進行。二

java連線MySQL資料庫DB類底層框架程式碼實現

前言:用java連線MySQL資料庫程式碼都是十分固定的,所以直接將一些固定的程式碼寫在一個DBmanager類中可以省去許多重複的工作,連線不同MySQL資料庫只需改變user和password即可。為了方便大家,我已經將程式碼總結出來。 程式碼塊 i