在我們學習 MySQL 或從事 MySQL DBA 工作期間,時常會遇到:“我嘗試連接到 MySQL 並且收到1045 錯誤,但我確定我的用戶和密碼都沒問題”。
不管你現在是否是高手還是高高手,都不可避免曾經在初學的時候犯過一些很初級的錯誤,例如:用戶名密碼都填錯了。而且工作一段時間後也偶爾會遇到一些不常見錯誤原因。
一、連接錯誤的主機
<code>[
root@
localhost ~]# mysql -u root -p123456mysql: [Warning] Using a password on the command lineinterface
can
be
insecure
.ERROR
1045 (28000
): Access deniedfor
user'root'
@'localhost'
(using password: YES)/<code>如果未指定要連接的主機(使用 -h 標誌),則 MySQL 客戶端將嘗試連接到 localhost 實例,同時您可能嘗試連接到另一個主機端口實例。
修復
<code>[root@localhost ~]/<code>
二、用戶不存在
<code>[
root@
localhost ~]# mysql -u nonexistant -p123456 -h localhostmysql: [Warning] Using a password on the command lineinterface
can
be
insecure
.ERROR
1045 (28000
): Access deniedfor
user'nonexistant'
@'localhost'
(using password: YES)/<code>修復:仔細檢查用戶是否存在:
<code>
SELECT User FROM mysql.user WHERE User=
'nonexistant'
;Emptyset
(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 lineinterface
can
be
insecure
.ERROR
104528000
): Access deniedfor
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
rowin
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
我們可以看到 PASSWORD('forgotten')哈希與 authentication_string 列不匹配,這意味著 password string ='forgotten' 不是正確的登錄密碼。
如果您需要覆蓋密碼,可以執行以下查詢:
<code>
set
passwordfor
'nonexistant'
@'%'
='hello$!world'
;Emptyset
(0.00 sec)/<code>五、Bash 轉換密碼中的特殊字符
<code>[
root@
localhost ~]# mysql -u nonexistant -phello$!worldmysql: [Warning] Using a password on the command lineinterface
can
be
insecure
.ERROR
28000
): Access deniedfor
user'nonexistant'
@'localhost'
(using password: YES)/<code>修復:通過在單引號中包裝密碼來防止 bash 解釋特殊字符:
<code>[root@localhost ~]/<code>
六、SSL 是必須的,但客戶沒有使用
<code>mysql> create user
'ssluser'
@'%'
identifiedby
'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>修復
[https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-11.html]
<code>[root@localhost ~]/<code>
最後,如果您真的被鎖定並需要繞過身份驗證機制以重新獲得對數據庫的訪問權限,請執行以下幾個簡單步驟:
停止實例編輯 my.cnf 並在 [mysqld] 下添加 skip-grant-tables(這樣可以在不提示輸入密碼的情況下訪問 MySQL)。在 MySQL 8.0 上,跳過網絡是自動啟用的(只允許從 localhost 訪問 MySQL),但對於以前的 MySQL 版本,建議在 [mysqld] 下添加 -skip-networking啟動實例使用 root 用戶訪問(mysql -uroot -hlocalhost);發出必要的 GRANT / CREATE USER / SET PASSWORD 以糾正問題(可能設置一個已知的 root 密碼將是正確的事情:SET PASSWORD FOR 'root'@'localhost'='S0vrySekr3t'停止實例編輯 my.cnf 並刪除 skip-grant-tables 和 skip-networking再次啟動 MySQL您應該能夠使用 roothost 從 root 用戶登錄,並對 root 用戶執行任何其他必要的糾正操作。本文按常見到複雜的順序將可能報 1045 的錯誤原因全部列舉出來,看完了還不趕快收藏!