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

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