《MySQL排错指南》——1.9 许可问题
本節(jié)書(shū)摘來(lái)自異步社區(qū)出版社《MySQL排錯(cuò)指南》一書(shū)中的第1章,第1.9節(jié),作者:【美】Sveta Smirnova(斯維特 斯米爾諾娃),更多章節(jié)內(nèi)容可以訪(fǎng)問(wèn)云棲社區(qū)“異步社區(qū)”公眾號(hào)查看。
1.9 許可問(wèn)題
MySQL有復(fù)雜的權(quán)限方案,這使得你可以精確地設(shè)置哪些用戶(hù)和主機(jī)可以或不可以執(zhí)行這個(gè)或那個(gè)操作。從5.5版本開(kāi)始,MySQL也有了可插拔式的身份驗(yàn)證模式。
盡管它有很多優(yōu)勢(shì),但是這個(gè)方案很復(fù)雜。例如,讓user1@hostA、user2@hostA和user1@hostB不同會(huì)很容易混淆它們的權(quán)限。當(dāng)用戶(hù)名相同而主機(jī)名變化的時(shí)候更是如此。
MySQL允許在對(duì)象和連接層面設(shè)置訪(fǎng)問(wèn)規(guī)則。可以限制某個(gè)用戶(hù)對(duì)于特定的表、列等的訪(fǎng)問(wèn)權(quán)限。
用戶(hù)通常會(huì)遇到兩類(lèi)權(quán)限問(wèn)題:
應(yīng)該有權(quán)限連接到服務(wù)器的用戶(hù)無(wú)法連接,或者沒(méi)有權(quán)限的用戶(hù)可以連接;
用戶(hù)可以連接到服務(wù)器,但是無(wú)法使用他們本應(yīng)該可以訪(fǎng)問(wèn)的對(duì)象,或者可以訪(fǎng)問(wèn)他們無(wú)權(quán)訪(fǎng)問(wèn)的對(duì)象。
在解決這些問(wèn)題之前,應(yīng)該確認(rèn)你是否可以連接到服務(wù)器。
當(dāng)你作為解決問(wèn)題的用戶(hù)成功連接到服務(wù)器之后(后面的章節(jié)將討論無(wú)法連接的情況),執(zhí)行以下查詢(xún):
USER()函數(shù)會(huì)返回當(dāng)用戶(hù)連接到服務(wù)器時(shí)使用的連接參數(shù)。這些參數(shù)通常為指定的用戶(hù)名和運(yùn)行客戶(hù)端的主機(jī)名。CURRENT_USER()函數(shù)會(huì)返回從權(quán)限表中選擇的與訪(fǎng)問(wèn)權(quán)限相關(guān)的用戶(hù)名和主機(jī)名對(duì)。mysqld用這些用戶(hù)名和主機(jī)名對(duì)來(lái)檢查數(shù)據(jù)庫(kù)對(duì)象訪(fǎng)問(wèn)權(quán)限。通過(guò)比較這些函數(shù)的結(jié)果,可以找到mysqld使用的權(quán)限和預(yù)期不同的原因。一個(gè)典型的問(wèn)題是對(duì)主機(jī)名使用通配符%:
如果此時(shí)我以sveta身份連接并嘗試創(chuàng)建一個(gè)表,我就會(huì)獲得下面的錯(cuò)誤:
該問(wèn)題在于,MySQL服務(wù)器認(rèn)為sveta是sveta@localhost,而不是通配符:
如果你不理解為什么選擇一臺(tái)或另一臺(tái)主機(jī),可以進(jìn)行如下查詢(xún):
MySQL在表中按照從訪(fǎng)問(wèn)最多的主機(jī)到訪(fǎng)問(wèn)最少的主機(jī)的順序?qū)π羞M(jìn)行排序,然后使用第一個(gè)找到的值。因此,它把我當(dāng)作sveta@localhost用戶(hù)進(jìn)行連接,此時(shí)該用戶(hù)沒(méi)有CREATE權(quán)限。
USER()、CURRENT_USER()函數(shù)和“SELECT user, host FROM mysql.user ORDER BY host DESE”查詢(xún)語(yǔ)句是遇到權(quán)限問(wèn)題時(shí)的首選。
另一種權(quán)限問(wèn)題是你無(wú)法作為指定用戶(hù)進(jìn)行連接。在這種情況下,通常可以從錯(cuò)誤消息中了解問(wèn)題產(chǎn)生的原因,錯(cuò)誤消息一般如下所示:
在看到這條消息以后,你了解了用戶(hù)憑證。作為root超級(jí)用戶(hù)進(jìn)行連接,然后檢查該用戶(hù)是否存在以及是否擁有所需權(quán)限:
在這個(gè)輸出信息中,你可以看到用戶(hù)'sveta'@'localhost'僅僅對(duì)book數(shù)據(jù)庫(kù)有權(quán)限,而對(duì)books數(shù)據(jù)庫(kù)沒(méi)有權(quán)限。現(xiàn)在,可以修復(fù)這個(gè)錯(cuò)誤:賦予sveta@localhost用戶(hù)必要的權(quán)限。
前面的示例討論用戶(hù)缺失必要權(quán)限的情況。對(duì)于用戶(hù)被授予過(guò)多權(quán)限的情況也可以同樣處理;僅需要移除不必要的權(quán)限。
警告 警告
MySQL的權(quán)限與其管控對(duì)象是分離的:這意味著當(dāng)你賦予某用戶(hù)權(quán)限時(shí)mysqld 不會(huì)檢查其是否存在,同時(shí)當(dāng)授權(quán)對(duì)象被刪除時(shí)也不會(huì)移除相應(yīng)權(quán)限。這樣做的好處是允許我們預(yù)先授予必要的權(quán)限,但同時(shí)也有可能在不經(jīng)意的使用中帶來(lái)潛在的問(wèn)題。
作為最佳實(shí)踐,我推薦你仔細(xì)學(xué)習(xí)MySQL的權(quán)限工作機(jī)制。尤其是在你想要在用戶(hù)對(duì)象級(jí)別授予權(quán)限的時(shí)候,因?yàn)槟阈枰斫庠谝粋€(gè)級(jí)別授權(quán)是如何影響其他授權(quán)的。同樣,對(duì)于撤消權(quán)限情形也一樣重要,甚至更重要,因?yàn)槿绻阋詾橐呀?jīng)撤消了某個(gè)權(quán)限但它依然存在,這就會(huì)造成意外的訪(fǎng)問(wèn)。
[1] 版本5.6.3開(kāi)始,也可以在UPDATE和DELETE上使用EXPLAIN方法,不過(guò)把語(yǔ)句轉(zhuǎn)換成SELECT查詢(xún)?nèi)匀挥行?#xff0c;因?yàn)槟憧梢苑奖愕貦z查和操作實(shí)際的結(jié)果集,而不是僅使用EXPLAIN命令。這尤其適用于復(fù)雜的JOIN操作,尤其是當(dāng)EXPLAIN輸出的檢查的行比實(shí)際更新的行還要多的時(shí)候。
[2] 你可以在http://dev.mysql.com/doc/refman/5.5/en/c.html找到關(guān)于C API的詳細(xì)描述。
[3] 第5章將詳細(xì)介紹如何解決復(fù)制失敗的問(wèn)題,因此這里不再詳細(xì)解釋。
[4] MySQL企業(yè)級(jí)備份(MEB)以前也稱(chēng)作InnoDB熱備份,是InnoDB表進(jìn)行在線(xiàn)熱備份和其他存儲(chǔ)引擎的表進(jìn)行在線(xiàn)備份的一個(gè)工具。第7章將討論備份的方法。
本文僅用于學(xué)習(xí)和交流目的,不代表異步社區(qū)觀(guān)點(diǎn)。非商業(yè)轉(zhuǎn)載請(qǐng)注明作譯者、出處,并保留本文的原始鏈接。
總結(jié)
以上是生活随笔為你收集整理的《MySQL排错指南》——1.9 许可问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: julia有 pytorch包吗_用 P
- 下一篇: linux cmake编译源码,linu