關鍵條目:ERROR 1045(28000): Access deniedforuser'root'@'localhost'(using password: YES)
這個錯誤1045(28000)的本質其實就是訪問被拒絕,問題原因也很簡單,就是用戶密碼不適用,也可以理解為用戶或密碼錯誤。
Access deniedforuser'root'@'localhost'是說登錄賬戶‘root’host為'localhost'的這個賬戶,訪問本數據庫被拒絕了。
using password: YES是指你登錄時是否輸入了密碼,如果輸入了,就顯示YES,沒有輸入就顯示NO。在mysql中,提供了一些無密碼或者匿名登錄方法,這條信息是用于區分這些情況的。
1.密碼錯誤
出現這個問題最常見的原因,就是密碼輸入錯了。那么如果你還有管理員賬戶,用管理員賬戶登錄并提取或者修改賬戶密碼就可以。如果管理員賬戶無法登錄,那么就需要繞過數據庫的訪問控制器,直接登入數據庫。
繞過訪問控制器的方法很多,根據所用系統和使用的mysql版本不同,會有不同方法。這里介紹linux下的一種方法。首先關閉mysql服務,直接輸入下述命令:
① mysqld_safe--user=mysql --skip-grant-tables --skip-networking &
然后進入訪問路徑(linux一般是/usr/bin),用②mysql -u root登錄,即無密碼登錄。
這時一般就可以登錄了。需要注意的是,系統不會允許同時運行多個訪問進程,所以之前運行①的時候要求關閉正常的mysql服務,但是很多時候,陰差陽錯的情況下,可能會運行多個mysql訪問進程,這時需要查詢mysql關鍵字的進程列表,然后kill掉,再次進行操作。
言歸正傳,用這種方式登錄mysql后,可以直接訪問用戶表。一般來說,mysql 的用戶表,處于mysql數據庫下(對初學者來說,這句話就是說你需要輸入 use mysql;)。
這時,輸入下述語句進行修改;
③ UPDATE user SET Password=PASSWORD('密碼')where USER='root';
注意,要在語句中的‘密碼’這里輸入你的密碼,而不是直接修改password項,這一點非常重要。
④UPDATE user SET Password=‘密碼’where USER='root';和③的區別在于,④會直接修改用戶表中的password項,而③則是將你輸入的密碼用哈希算法加密為哈希值再輸入密碼。mysql用戶密碼是加密的,這一點非常重要,如果你直接修改了password項,是無法正常登陸的 。
修改完以后,不要忘記用下述命令使設置生效。
⑤FLUSH PRIVILEGES;
然后退出,重新啟動mysql 的服務,就可以正常登陸了。
2.空用戶訪問覆蓋
一種比較少見的情況,是空用戶的訪問覆蓋現象。以本文報錯條目為例,這種情況,就是在用戶表中,存在host值為‘localhost’但是用戶名密碼為空的賬戶(即匿名賬戶),一般情況下這種情況不會影響登錄。但有時候,用戶的登錄的匹配信息會被匹配到空用戶上,導致密碼匹配失敗,報出1045(28000)錯誤。這種情況比較少見,我也不是很明白復現的原理,就不多做贅述。
解決方法也很簡單,如第1中情況一樣,登錄用戶表,然后刪除空用戶記錄即可。
⑥DELETE from usr where HOST='localhost' and USER='';
然后還是別忘記使設置生效以及重啟數據庫服務。
3.用戶權限不足
還有一種比較常見的情況,是用戶權限不足。一般來說,發生在非管理員賬戶,而且很可能發生在賬戶易手之后,也就是說,人為的情況比較多。
這種情況就是用戶的訪問權限被限制了。mysql用戶權限是由很多項目的。
很多項目出現限制都會阻止權限訪問,下面介紹最常見的兩種修改方法。
設置指定用戶名訪問權限為全訪問。(賬戶訪問權限不足)
grant all privileges on *.* to '用戶名'@'%' IDENTIFIED BY '密碼';
設置指定可訪問主機權限。(賬戶訪問地址不適用)
grant all privileges on *.* to 'liuhui'@'10.2.1.11';
其中‘%’是可訪問所有數據庫,‘localhost’是允許本地訪問,‘ip地址’是指允許在該ip地址用該賬戶遠程訪問本數據庫。
很多創建遠程訪問用戶出錯的案例里,都是給予用戶訪問權限不足或者沒有給用戶開放訪問地址造成的拒絕訪問。
需要注意的是,在不啟動訪問控制器訪問數據庫的情況下,是無法查看用戶詳細權限的。所以對于權限的操作,最好還是在管理員賬戶下進行操作。
一點心得,與諸君共勉。