一、權(quán)限
命令標(biāo)識 |
授權(quán)表中對應(yīng)的列 |
說明 |
CREATE |
Create_priv |
創(chuàng)建數(shù)據(jù)庫、表或索引 |
CREATE?TEMPORARY?TABLES |
Create_tmp_table_priv |
創(chuàng)建臨時數(shù)據(jù)表 |
CREATE?ROUTINE |
Create_routine_priv |
創(chuàng)建函數(shù)或存儲 |
CREATE?VIEW |
Create_view_priv |
創(chuàng)建視圖 |
CREATE?USER |
Create_user_priv |
創(chuàng)建用戶 |
EXECUTE |
Execute_priv |
執(zhí)行函數(shù)或存儲過程 |
INDEX |
Index_priv |
建立索引 |
REFERENCES |
References_priv |
建立約束 |
DROP |
Drop_priv |
刪除表 |
SELECT |
Select_priv |
查詢數(shù)據(jù) |
INSERT |
Insert_priv |
插入數(shù)據(jù) |
UPDATE |
Update_priv |
更新數(shù)據(jù) |
DELETE |
Delete_priv |
刪除數(shù)據(jù) |
LOCK?TABLES |
Lock_tables_priv |
鎖定表格 |
SHOW?DATABASES |
Show_db_priv |
列出數(shù)據(jù)庫 |
SHOW?VIEW |
Show_view_priv |
列出視圖 |
USAGE |
? |
只有登錄權(quán)限,其他權(quán)限都沒有 |
ALL |
? |
所有權(quán)限,除了WITH?GRANT?OPTION |
ALTER |
Alter_priv |
更改數(shù)據(jù)表 |
ALTER?ROUTINE |
Alter_routine_priv |
更改函數(shù)或存儲過程 |
PROCESS |
Process_priv |
顯示連接進程和中斷連接進程 |
FILE |
File_priv |
載入文件 |
RELOAD |
Reload_priv |
可以用FLUSH |
REPLICATION?CLIENT |
Repl_client_priv |
可以檢查Masters和Slaves |
REPLICATION?SLAVE |
Repl_slave_priv |
在Slave里的特殊權(quán)限 |
SHUTDOWN |
Shutdown_priv |
關(guān)閉MySQL |
WITH?GRANT?OPTION |
Grant_priv |
可以將自己擁有的權(quán)限賦給其他用戶 |
SUPER |
Super_priv |
執(zhí)行kill線程,change?master、purge?master?logs、set?global等命令的權(quán)限 |
create?tablespace |
Create_tablespace_priv? |
創(chuàng)建表空間 |
Event |
Event_priv? |
確定用戶能否創(chuàng)建、修改和刪除事件 |
Trigger |
Trigger_priv? |
確定用戶能否創(chuàng)建和刪除觸發(fā)器 |
?
二、權(quán)限級別
1、global?level?全局權(quán)限控制,所有的信息都保存在mysql.user表中。
2、database?level?作用域為指定某個數(shù)據(jù)庫中的所有對象,所有權(quán)限信息保存在mysql.db中。當(dāng)執(zhí)行g(shù)rant命令時,通過“database.*”來限定作用域為database整個數(shù)據(jù)庫;也可以通過use命令選定授權(quán)的數(shù)據(jù)庫,然后通過“*”來限定作用域,這樣授權(quán)的作用域?qū)嶋H上就是當(dāng)前選定的整個數(shù)據(jù)庫。
3、table?level?作用范圍是授權(quán)語句中指定數(shù)據(jù)庫的指定表(database.table),權(quán)限信息保存在tables_priv中。
4、column?level?作用域為某個指定的列,權(quán)限信息保存在columns_priv中。column?level級別的權(quán)限僅有insert、select、update這三種。語法格式:grant?select(id,value)?on?test.t2?to?‘a(chǎn)bc’@‘%’。給abc用戶授予?test數(shù)據(jù)庫t2表的id、value列select權(quán)限.
5、routine?level?針對的主要對象時procedure和function。目前暫時只有execute和alter?routine兩種。語法格式:grant?execute?on?test.p1?to?'abc'?@'%';
6、with?grant?option。在授權(quán)時加上此命令,被授權(quán)用戶有傳遞權(quán)限的權(quán)限。
三、權(quán)限查看和更改
1、新加權(quán)限或者用戶。?
??GRANT?權(quán)限?ON?庫名.表名?TO?新用戶名@主機名?IDENTIFIED?BY?‘密碼‘;
??例:grant?select,insert,update,delete?on?*.*?to?test1@"%"?Identified?by?"abc";新加的用戶名為test1?,密碼為abc,對所有表有增刪查改的權(quán)限,在任何主機上可以登錄。
?
2、查看權(quán)限。
???使用show?grants?語句查看指定賬戶的權(quán)限;例如,要檢查Host和User值分別為pc84.example.com和bob的賬戶所授予的權(quán)限,應(yīng)通過語句:
mysql>?SHOW?GRANTS?FOR?'bob'@'pc84.example.com';
?
3、更改權(quán)限。
???若通過直接修改權(quán)限表來更改權(quán)限,則修改完后都必須要執(zhí)行“flush?privileges”,通知mysql重新加載MySQL的權(quán)限信息;如果通過grant、revoke或drop?user命令來修改權(quán)限,則不需要執(zhí)行“flush?privileges”命令。
?
4、權(quán)限更改何時生效
當(dāng)mysqld啟動時,所有授權(quán)表的內(nèi)容被讀進內(nèi)存并且從此時生效。
當(dāng)服務(wù)器注意到授權(quán)表被改變了時,現(xiàn)存的客戶端連接有如下影響:
·?表和列權(quán)限在客戶端的下一次請求時生效。
·?數(shù)據(jù)庫權(quán)限改變在下一個USE?db_name命令生效。
·?全局權(quán)限的改變和密碼改變在下一次客戶端連接時生效。
如果用GRANT、REVOKE或SET?PASSWORD對授權(quán)表進行修改,服務(wù)器會注意到并立即重新將授權(quán)表載入內(nèi)存。
如果你手動地修改授權(quán)表(使用INSERT、UPDATE或DELETE等等),你應(yīng)該執(zhí)行mysqladmin?flush-privileges或mysqladmin?reload告訴服務(wù)器再裝載授權(quán)表,否則你的更改將不會生效,除非你重啟服務(wù)器。
如果你直接更改了授權(quán)表但忘記重載,重啟服務(wù)器后你的更改方生效。這樣可能讓你迷惑為什么你的更改沒有什么變化!
?
?
5、修改密碼
當(dāng)使用setpassword、insert、update更改密碼時,必須使用PASSWORD()函數(shù)加密密碼。若果不使用PASSWORD()函數(shù),密碼將不工作。
例如,下面的語句設(shè)置密碼,但沒能加密,因此用戶后面不能連接:
????mysql>?SET?PASSWORD?FOR?'abe'@'host_name'?=?'eagle';
相反,應(yīng)這樣設(shè)置密碼:
mysql>?SET?PASSWORD?FOR?'abe'@'host_name'?=?PASSWORD('eagle');
當(dāng)使用GRANT或CREATE?USER語句或mysqladmin?password命令指定密碼時,不需要PASSWORD()函數(shù),它們會自動使用PASSWORD()來加密密碼。
四、權(quán)限表列值的規(guī)則
1、user?、host?、db表中值的規(guī)則
·?通配符字符“%”和“_”可用于表的Host和Db列。它們與用LIKE操作符執(zhí)行的模式匹配操作具有相同的含義。如果授權(quán)時你想使用某個字符,必須使用反斜現(xiàn)引用。例如,要想在數(shù)據(jù)庫名中包括下劃線(‘_’),在GRANT語句中用‘\_’來指定。
·在db表的'%'Host值意味著“任何主機”,在db表中空Host值意味著“對進一步的信息咨詢host表”。
·在host表的'%'或空Host值意味著“任何主機”。
·在三個表中的'%'或空Db值意味著“任何數(shù)據(jù)庫”。
·在user、db表中的空User值匹配匿名用戶
?
2、tables_priv和columns_priv表中值得規(guī)則
·通配符“%”并“_”可用在使用在兩個表的Host列。
·在兩個表中的'%'或空Host意味著“任何主機”。
·在兩個表中的Db、Table_name和Column_name列不能包含通配符或空。
3、mysql.host表的特殊點
mysql.host不是通過grant或revoke權(quán)限來授予或去除的,必須手工通過insert、update和delete命令來修改其中的數(shù)據(jù)。其中的權(quán)限無法單獨生效,必須與mysql.db權(quán)限表一起才能生效。當(dāng)mysql.db中的信息不完整時,采取訪問mysql.host。
當(dāng)想在db表的范圍之內(nèi)擴展一個條目時,就會用到host表。舉例來說,如果某個db允許通過多個主機訪問的話,那么超級用戶就可以讓db表內(nèi)將host列為空,然后用必要的主機名填充host表。
五、訪問控制
階段1:連接核實
當(dāng)你試圖連接MySQL服務(wù)器時,服務(wù)器基于你的身份以及你是否能通過供應(yīng)正確的密碼驗證身份來接受或拒絕連接。如果不是,服務(wù)器完全拒絕你的訪問,否則,服務(wù)器接受連接,然后進入階段2并且等待請求。
你的身份基于2個信息:
·你從那個主機連接
·你的MySQL用戶名
身份檢查使用3個user表(Host,?User和Password)范圍列執(zhí)行。服務(wù)器只有在user表記錄的Host和User列匹配客戶端主機名和用戶名并且提供了正確的密碼時才接受連接。
?
階段2:請求核實
一旦你建立了連接,服務(wù)器進入訪問控制的階段2。對在此連接上進來的每個請求,服務(wù)器檢查你想執(zhí)行什么操作,然后檢查是否有足夠的權(quán)限來執(zhí)行它。這正是在授權(quán)表中的權(quán)限列發(fā)揮作用的地方。這些權(quán)限可以來自user、db、host、tables_priv或columns_priv表。
?
六、query? 處理權(quán)限校驗流程
七、常做操作所需權(quán)限
1、備份
備份用戶會通過mysqldump來做備份,一般只需要用到select和lock?tables?兩項權(quán)限。如果使用帶-tab選項的mysqldump來做tab分界符文件的導(dǎo)出,或者是用select?into?outfile,那么還需要一個file權(quán)限。
例:grant?select,lock?tables,file?on?*.*?to?backup@localhost
為了保證許多備份操作的一致性,還會用到flush?tables?with?read?lock,所以還需要reload權(quán)限。
?
2、操作和監(jiān)控
維護系統(tǒng)或修復(fù)故障需要用到 kill 或 show 命令,還需要關(guān)閉服務(wù)器。所以需要用到 process 和 shutdown 權(quán)限。
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
