MySQL 客戶端連不上(1045 錯誤)原因全解析-愛可生

MySQL 客戶端連不上(1045 錯誤)原因全解析-愛可生

在我們學習 MySQL 或從事 MySQL DBA 工作期間,時常會遇到:“我嘗試連接到 MySQL 並且收到1045 錯誤,但我確定我的用戶和密碼都沒問題”。

不管你現在是否是高手還是高高手,都不可避免曾經在初學的時候犯過一些很初級的錯誤,例如:用戶名密碼都填錯了。而且工作一段時間後也偶爾會遇到一些不常見錯誤原因。


一、連接錯誤的主機

<code>[

root@

localhost ~]# mysql -u root -p123456mysql: [Warning] Using a password on the command line

interface

can

be

insecure

.

ERROR

1045

(

28000

): Access denied

for

user

'root'

@

'localhost'

(using password: YES)/<code>

如果未指定要連接的主機(使用 -h 標誌),則 MySQL 客戶端將嘗試連接到 localhost 實例,同時您可能嘗試連接到另一個主機端口實例。

修復:仔細檢查您是否嘗試連接到 localhost,或者確保指定主機和端口(如果它不是 localhost):

<code>[root@localhost ~]/<code>


二、用戶不存在

<code>[

root@

localhost ~]# mysql -u nonexistant -p123456 -h localhostmysql: [Warning] Using a password on the command line

interface

can

be

insecure

.

ERROR

1045

(

28000

): Access denied

for

user

'nonexistant'

@

'localhost'

(using password: YES)/<code>

修復

:仔細檢查用戶是否存在:

<code>

SELECT User FROM mysql.user WHERE User=

'nonexistant'

;Empty

set

(0.00 sec)

/<code>

如果用戶不存在,請創建一個新用戶:

<code>mysql> CREATE USER 

'nonexistant'

@

'localhost'

IDENTIFIED BY

'sekret'

;Query OK,

0

rows

affected

(

0.00

sec

)mysql> FLUSH PRIVILEGES

;Query OK,

0

rows

affected

(

0.01

sec

)

/<code>


三、用戶存在但客戶端主機無權連接

<code>[

root@

localhost ~]# mysql -u nonexistant -p123456mysql: [Warning] Using a password on the command line

interface

can

be

insecure

.

ERROR

1045

(

28000

): Access denied

for

user

'nonexistant'

@

'localhost'

(using password: YES)/<code>

修復:您可以通過以下查詢檢查 MySQL 允許連接的主機用戶/主機:

<code>mysql> SELECT Host, User FROM mysql.user WHERE User=

'nonexistant'

;+-------------+-------------+

| Host |

User

|+-------------+-------------+|

192.168

.

0

.

1

| nonexistant |

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

1

row

in

set (

0

.

00

sec)/<code>

如果需要檢查客戶端連接的 IP,可以使用以下 Linux 命令來獲取服務器 IP:

<code>

[root@localhost

~]#

ip

address

|

grep

inet

|

grep

-v

inet6

inet

127.0

.0

.1

/8

scope

host

lo

inet

192.168

.0

.20

/24

brd

192.168

.0

.255

scope

global

dynamic

wlp58s0

/<code>

或公共IP:

<code>

[root@localhost ~]

#

dig

+

short

myip

.opendns

.com

@resolver1

.opendns.com177.128.214.181/<code>

然後,您可以創建具有正確主機(客戶端 IP)的用戶,或使用'%'(通配符)來匹配任何可能的 IP:

<code> 

CREATE USER

'nonexistant'

@

'%'

IDENTIFIED BY

'123456'

;Query OK, 0 rows affected (0.00 sec)

/<code>


四、密碼錯誤,或者用戶忘記密碼

<code>

CREATE USER

'nonexistant'

@

'%'

IDENTIFIED BY

'123456'

;Query OK, 0 rows affected (0.00 sec)

/<code>

修復:檢查和/或重置密碼:

您無法從 MySQL 以純文本格式讀取用戶密碼,因為密碼哈希用於身份驗證,但您可以將哈希字符串與“PASSWORD”函數進行比較:

<code>mysql> SELECT Host, User, authentication_string, PASSWORD(

'forgotten'

) FROM mysql.user WHERE User=

'nonexistant'

;+-------------+-------------+-------------------------------------------+-------------------------------------------+

| Host |

User

| authentication_string |

PASSWORD(

'forgotten'

)

|+-------------+-------------+-------------------------------------------+-------------------------------------------+|

192.168

.

0

.

1

| nonexistant |

*AF9E01EA8519CE58E3739F4034EFD3D6B4CA6324

| *70F9DD10B4688C7F12E8ED6C26C6ABBD9D9C7A41 |

| % |

nonexistant

| *AF9E01EA8519CE58E3739F4034EFD3D6B4CA6324 |

*

70

F9DD10B4688C7F12E8ED6C26C6ABBD9D9C7A41

|+-------------+-------------+-------------------------------------------+-------------------------------------------+2 rows

in

set, 1 warning (0.00 sec)

/<code>

我們可以看到 PASSWORD('forgotten')哈希與 authentication_string 列不匹配,這意味著 password string ='forgotten' 不是正確的登錄密碼。

如果您需要覆蓋密碼,可以執行以下查詢:

<code>

set

password

for

'nonexistant'

@

'%'

=

'hello$!world'

;Empty

set

(0.00 sec)

/<code>



五、Bash 轉換密碼中的特殊字符

<code>[

root@

localhost ~]# mysql -u nonexistant -phello$!worldmysql: [Warning] Using a password on the command line

interface

can

be

insecure

.

ERROR

1045

(

28000

): Access denied

for

user

'nonexistant'

@

'localhost'

(using password: YES)/<code>

修復:通過在單引號中包裝密碼來防止 bash 解釋特殊字符:

<code>[root@localhost ~]/<code>


六、SSL 是必須的,但客戶沒有使用

<code>mysql> create user  

'ssluser'

@

'%'

identified

by

'123456'

;Query OK,

0

rows affected (

0.00

sec)mysql> alter user

'ssluser'

@

'%'

require

ssl;Query OK,

0

rows affected (

0.00

sec)...[root@localhost ~]/<code>

修復:添加 -ssl-mode 標誌(-ssl 標誌已棄用但也可以使用)

[https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-11.html]

<code>[root@localhost ~]/<code>

最後,如果您真的被鎖定並需要繞過身份驗證機制以重新獲得對數據庫的訪問權限,請執行以下幾個簡單步驟:

  1. 停止實例
  2. 編輯 my.cnf 並在 [mysqld] 下添加 skip-grant-tables(這樣可以在不提示輸入密碼的情況下訪問 MySQL)。在 MySQL 8.0 上,跳過網絡是自動啟用的(只允許從 localhost 訪問 MySQL),但對於以前的 MySQL 版本,建議在 [mysqld] 下添加 -skip-networking
  3. 啟動實例
  4. 使用 root 用戶訪問(mysql -uroot -hlocalhost);
  5. 發出必要的 GRANT / CREATE USER / SET PASSWORD 以糾正問題(可能設置一個已知的 root 密碼將是正確的事情:SET PASSWORD FOR 'root'@'localhost'='S0vrySekr3t'
  6. 停止實例
  7. 編輯 my.cnf 並刪除 skip-grant-tables 和 skip-networking
  8. 再次啟動 MySQL
  9. 您應該能夠使用 roothost 從 root 用戶登錄,並對 root 用戶執行任何其他必要的糾正操作。

本文按常見到複雜的順序將可能報 1045 的錯誤原因全部列舉出來,看完了還不趕快收藏!

MySQL 客戶端連不上(1045 錯誤)原因全解析-愛可生


分享到:


相關文章: