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